@web界面实现扫一扫

二维码工具类

package util;

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URL;
import java.util.HashMap;
import java.util.Hashtable; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import net.sf.json.JSONObject; /**
* @todo 二维码工具
* @author zhangyanan
* @date 2018年8月6日
*/
public class QRCodeUtil {
private static final String CHARSET = "UTF-8";
private static final String FORMAT_NAME = "JPG";
// 二维码尺寸
private static final int QRCODE_SIZE = 200;
// LOGO宽度
private static final int WIDTH = 40;
// LOGO高度
private static final int HEIGHT = 40; public static void main(String[] args) throws Exception {
create();
// System.out.println(decoderQRCode("D:/8.jpg"));
// System.out.println(decodeBarCode("D:/8.jpg"));
} private static void create() throws Exception, FileNotFoundException {
String dir = "E:/QR.jpg";
String content = "微信提醒您:您的账户已被盗";// ConfigUtil.getProperty("project.url")
String logoImgPath = "file:///taobao.jpg";// "http://192.168.100.2/cut.jpg";
File file = new File(dir);
QRCodeUtil.encode(content, logoImgPath, new FileOutputStream(file), true);
System.out.println("生成二维码成功");
} /**
* @todo
* @author zhangyanan
* @date 2018年8月6日
* @param content
* 二维码内容
* @param logoImgPath
* Logo
* @param needCompress
* 是否压缩Logo
* @return 返回二维码图片
* @throws WriterException
* @throws IOException
* BufferedImage TODO 创建二维码图片
*/
private static BufferedImage createImage(String content, String logoImgPath, boolean needCompress)
throws WriterException, IOException {
Hashtable<EncodeHintType, Object> hints = new Hashtable<EncodeHintType, Object>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
hints.put(EncodeHintType.MARGIN, 0);
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
hints);
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
}
}
if (logoImgPath == null || "".equals(logoImgPath)) {
return image;
} // 插入图片
QRCodeUtil.insertImage(image, logoImgPath, needCompress);
return image;
} /**
* @todo
* @author zhangyanan
* @date 2018年8月6日
* @param source
* 二维码图片
* @param logoImgPath
* Logo
* @param needCompress
* 是否压缩Logo
* @throws IOException
* void TODO 添加Logo
*/
private static void insertImage(BufferedImage source, String logoImgPath, boolean needCompress) throws IOException {
/*
* File file = new File(logoImgPath); if (!file.exists()) { return; }
*/
URL url = new URL(logoImgPath);
Image src;
try {
src = ImageIO.read(url.openStream());
} catch (Exception e) {
// TODO Auto-generated catch block
// e.printStackTrace();
return;
}
// Image src = ImageIO.read(new File(logoImgPath));
int width = src.getWidth(null);
int height = src.getHeight(null);
if (needCompress) { // 压缩LOGO
if (width > WIDTH) {
width = WIDTH;
} if (height > HEIGHT) {
height = HEIGHT;
} Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g = tag.getGraphics();
g.drawImage(image, 0, 0, null); // 绘制缩小后的图
g.dispose();
src = image;
} // 插入LOGO
Graphics2D graph = source.createGraphics();
int x = (QRCODE_SIZE - width) / 2;
int y = (QRCODE_SIZE - height) / 2;
graph.drawImage(src, x, y, width, height, null);
Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
graph.setStroke(new BasicStroke(3f));
graph.draw(shape);
graph.dispose();
} /**
* @todo
* @author zhangyanan
* @date 2018年8月6日
* @param content
* 二维码内容
* @param logoImgPath
* Logo
* @param destPath
* 二维码输出路径
* @param needCompress
* 是否压缩Logo
* @throws Exception
* void TODO 生成带Logo的二维码
*/
public static void encode(String content, String logoImgPath, String destPath, boolean needCompress)
throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, logoImgPath, needCompress);
FileUtils.mkdirs(destPath);
ImageIO.write(image, FORMAT_NAME, new File(destPath));
} /**
* @todo
* @author zhangyanan
* @date 2018年8月6日
* @param content
* 二维码内容
* @param destPath
* 二维码输出路径
* @throws Exception
* void TODO 生成不带Logo的二维码
*/
public static void encode(String content, String destPath) throws Exception {
QRCodeUtil.encode(content, null, destPath, false);
} /**
* @todo
* @author zhangyanan
* @date 2018年8月6日
* @param content
* 二维码内容
* @param logoImgPath
* Logo
* @param output
* 输出流
* @param needCompress
* 是否压缩Logo
* @throws Exception
* void TODO 生成带Logo的二维码,并输出到指定的输出流
*/
public static void encode(String content, String logoImgPath, OutputStream output, boolean needCompress)
throws Exception {
BufferedImage image = QRCodeUtil.createImage(content, logoImgPath, needCompress);
ImageIO.write(image, FORMAT_NAME, output);
} /**
* @todo
* @author zhangyanan
* @date 2018年8月6日
* @param content
* 二维码内容
* @param output
* 输出流
* @throws Exception
* void TODO 生成不带Logo的二维码,并输出到指定的输出流
*/
public static void encode(String content, OutputStream output) throws Exception {
QRCodeUtil.encode(content, null, output, false);
} /**
* @todo 解析二维码
* @author zhangyanan
* @date 2018年8月6日
*/
@SuppressWarnings("unchecked")
public static JSONObject decoderQRCode(String imgPath) {
JSONObject json = new JSONObject();
try {
MultiFormatReader formatReader = new MultiFormatReader(); // 二维码图片位置
File file = new File(imgPath);
BufferedImage image = ImageIO.read(file);
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
// 定义二维码的参数
@SuppressWarnings("rawtypes")
HashMap hints = new HashMap(); // 设置编码字符集
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
// 处理读取结果
Result result = formatReader.decode(binaryBitmap, hints);
// System.out.println("解析结果:" + result.toString());
// System.out.println("二维码格式类型:" + result.getBarcodeFormat());
// System.out.println("二维码文本内容:" + result.getText());
json.put("result", true);
// json.put("qrcode",result.getBarcodeFormat());
json.put("qrtext", result.getText());
json.put("msg", "解析成功");
} catch (NotFoundException e) {
e.printStackTrace();
json.put("result", false);
json.put("msg", "解析失败,请保证图片清晰重试");
} catch (IOException e) {
e.printStackTrace();
json.put("result", false);
json.put("msg", "解析失败,请保证图片清晰重试");
}
return json; } }

一维码工具类,一维码@参考文章

package util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable; import javax.imageio.ImageIO; import com.google.zxing.BarcodeFormat;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.DecodeHintType;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer; import net.sf.json.JSONObject; /**
* TODO 条形码工具类 2019年12月6日
*
* @author zhangyanan
*/
public class BarCodeUtil { private static final int BLACK = 0xFF000000;
private static final int WHITE = 0xFFFFFFFF;
private static final String CHARSET = "UTF-8"; public static void main(String[] args) throws Exception {
String text = "9999000026";
String result;
String format = "png";
File outputFile = new File("d:" + File.separator + "rqcode.png");
outputFile = new File("d:" + File.separator + "barcode.png");
BarCodeUtil.writeToFile(BarCodeUtil.toBarCodeMatrix(text, null, null), format, outputFile);
result = BarCodeUtil.decode(outputFile);
System.out.println(result);
} /**
* TODO 将字符串编成一维条码的矩阵 2019年12月6日
*
* @author zhangyanan
*/
public static BitMatrix toBarCodeMatrix(String str, Integer width, Integer height) { if (width == null || width < 200) {
width = 200;
} if (height == null || height < 50) {
height = 50;
} try {
// 文字编码
Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();
hints.put(EncodeHintType.CHARACTER_SET, CHARSET); BitMatrix bitMatrix = new MultiFormatWriter().encode(str, BarcodeFormat.CODE_128, width, height, hints); return bitMatrix;
} catch (Exception e) {
e.printStackTrace();
}
return null;
} /**
* TODO 根据矩阵、图片格式,生成文件。 2019年12月6日
*
* @author zhangyanan
*/
public static void writeToFile(BitMatrix matrix, String format, File file) throws IOException {
BufferedImage image = toBufferedImage(matrix);
if (!ImageIO.write(image, format, file)) {
throw new IOException("Could not write an image of format " + format + " to " + file);
}
} /**
* TODO 解码,需要javase包。 2019年12月6日
*
* @author zhangyanan
*/
public static String decode(File file) { BufferedImage image;
try {
if (file == null || file.exists() == false) {
throw new Exception(" File not found:" + file.getPath());
} image = ImageIO.read(file); LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Result result; // 解码设置编码方式为:utf-8,
Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
hints.put(DecodeHintType.CHARACTER_SET, CHARSET); result = new MultiFormatReader().decode(bitmap, hints); return result.getText(); } catch (Exception e) {
e.printStackTrace();
} return null;
} /**
* TODO 根据点矩阵生成黑白图。 2019年12月6日
*
* @author zhangyanan
*/
public static BufferedImage toBufferedImage(BitMatrix matrix) {
int width = matrix.getWidth();
int height = matrix.getHeight();
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);
}
}
return image;
} /**
* TODO 解析条形码 2019年12月6日
*
* @author zhangyanan
*/
public static JSONObject decodeBarCode(String imgPath) {
JSONObject json = new JSONObject();
BufferedImage image = null;
Result result = null;
try {
image = ImageIO.read(new File(imgPath));
if (image == null) {
System.out.println("the decode image may be not exit.");
}
LuminanceSource source = new BufferedImageLuminanceSource(image);
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
/*
* Map<DecodeHintType, Object> hints = new Hashtable<>();
* hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
* hints.put(DecodeHintType.CHARACTER_SET, "utf-8"); result = new
* MultiFormatReader().decode(bitmap, hints);
*/
result = new MultiFormatReader().decode(bitmap, null);
json.put("result", true);
json.put("msg", "解析条形码成功");
// json.put("qrcode",result.getBarcodeFormat());
json.put("qrtext", result.getText());
System.out.println("解析结果:" + result.toString());
System.out.println("条形码格式类型:" + result.getBarcodeFormat());
System.out.println("条形码文本内容:" + result.getText());
} catch (Exception e) {
e.printStackTrace();
json.put("result", false);
json.put("msg", "解析失败,请保证图片清晰重试");
}
return json;
} }

zxing解析生成一维码二维码的更多相关文章

  1. 使用ZXing.Net生成与识别二维码(QR Code)

    Google ZXing是目前一个常用的基于Java实现的多种格式的1D/2D条码图像处理库,出于其开源的特性其现在已有多平台版本.比如今天要用到的ZXing.Net就是针对微软.Net平台的版本.使 ...

  2. C#利用Zxing.net生成条形码和二维码并实现打印的功能

        开篇:zxing.net是.net平台下编解条形码和二维码的工具. 下载地址:http://pan.baidu.com/s/1kTr3Vuf Step1:使用VS2010新建一个窗体程序项目: ...

  3. C#Zxing.net生成条形码和二维码

    下载Zxing.net官网:https://archive.codeplex.com/?p=zxingnet 或者去VS程序包下载 封装好的代码: using System; using System ...

  4. 利用ZXing.Net生成和识别二维码

    ZXing.Net:ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库. github:https://github.com/micjahn/ZXing.Net 直接将字符 ...

  5. ZXing 生成、读取二维码(带logo)

    前言 ZXing,一个支持在图像中解码和生成条形码(如二维码.PDF 417.EAN.UPC.Aztec.Data Matrix.Codabar)的库.ZXing(“zebra crossing”)是 ...

  6. C# 利用ZXing.Net来生成条形码和二维码

    本文是利用ZXing.Net在WinForm中生成条形码,二维码的小例子,仅供学习分享使用,如有不足之处,还请指正. 什么是ZXing.Net? ZXing是一个开放源码的,用Java实现的多种格式的 ...

  7. C# - VS2019调用ZXing.NET实现条码、二维码和带有Logo的二维码生成

    前言 C# WinFrm程序调用ZXing.NET实现条码.二维码和带有Logo的二维码生成. ZXing.NET导入 GitHub开源库 ZXing.NET开源库githib下载地址:https:/ ...

  8. ZXing生成条形码、二维码、带logo二维码

    采用的是开源的ZXing,Maven配置如下,jar包下载地址,自己选择版本下载,顺便推荐下Maven Repository <!-- https://mvnrepository.com/art ...

  9. 制作、解析带logo的二维码

    用DecoderQRCode来解析带logo的二维码,发现报错,解析不了,于是便又查资料,找到了更强大的制作二维码 工具:GooleZXing 首先下GooleZXing的jar包. -------- ...

  10. QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

    目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 根据之前公司的产品需求,参考 barcodescanner 改的,希望能帮助到 ...

随机推荐

  1. 洛谷P4556 雨天的尾巴(线段树合并)

    洛谷P4556 雨天的尾巴 题目链接 题解: 因为一个点可能存放多种物品,直接开二维数组进行统计时间.空间复杂度都不能承受.因为每一个点所拥有的物品只与其子树中的点有关,所以可以考虑对每一个点来建立一 ...

  2. Linux查看打日志文件

    1.如果文件比较小的话,使用vim直接查看,如果文件比较大的话,使用vim会直接卡主 2.如果想要查看正在滚动的日志文件.这个命令可以查看大文件. tail -f file Ctrl+c 终止tail ...

  3. 201671030123叶虹 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 软件工程 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 课程学习目标 掌握软件项目评审会流程:反思总结课程学习内容 一.实验一问题回答 1.实验 ...

  4. Oracle创建视图 及 授权

    创建视图语句: CREATE VIEW GRM_PROFIT_VIEW AS SELECT ID, DEPT_CODE, DEPT_NAME, YMONTH, PROJECT_NAME, PROJEC ...

  5. 20、Python常用模块sys、random、hashlib、logging

    一.sys运行时环境模块 sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境. 用法: sys.argv:命令行参数List,第一个元素是程序本身 ...

  6. python-自动登录禅道

    from bs4 import BeautifulSoup import hashlib import requests import re from tool.request_data_change ...

  7. JSON Web Token (JWT) - Weak secret

    This API with its /hello endpoint (accessible with GET) seems rather welcoming at first glance but i ...

  8. ant-design-vue有v-decorator时defaultValue无效

    <a-input v-decorator="[ 'userName', { rules: [ { required: true, message: '请输入您的账号!' } ], in ...

  9. Reactive Extensions (Rx) 入门(2) —— 安装 Reactive Extensions

    译文:https://blog.csdn.net/fangxing80/article/details/7581937 原文:http://www.atmarkit.co.jp/fdotnet/int ...

  10. codeblock代码片段

    for循环 ; $(index name)<| ; $(index name)++ ){ } 2. 反向for循环 ; $(index name)>= ; $(index name)-- ...