Zxing和QR Code生成和解析二维码
本文是学习慕课网课程《Java生成二维码》(http://www.imooc.com/learn/531)的笔记。
一、二维码的分类
线性堆叠式二维码、矩阵式二维码、邮政码。
二、二维码的优缺点
优点:1. 高密度编码,信息容量大;2.编码范围广;3.容错能力强;4.译码可靠性高;5.可引入加密措施;6.成本低,易制作,持久耐用。
缺点:1.二维码技术成为手机病毒、钓鱼网站传播的新渠道;2.信息容易泄露。
三、三大国际标准
1.PDF417:不支持中文;
2.DM:专利未公开,需要支付专利费用;
3.QR Code:专利公开,支持中文。
其中,QR Code具有识读速度快、数据密度大、占用空间小的优势。
四、纠错能力
L级:约可纠错7%的数据码字
M级:约可纠错15%的数据码字
Q级:约可纠错25%的数据码字
H级:约可纠错30%的数据码字
五、ZXing生成/读取二维码
首先,下载ZXing源文件。下载地址:https://github.com/zxing/zxing/releases;
再次,创建一个Java项目。将ZXing源文件中的core/src/main/java/com和javase/src/main/java/com两个文件复制到项目中,编译成jar文件;
最后,在以后的开发中就可以使用该jar文件。
ZXing生成二维码的代码如下:
import java.io.File;
import java.nio.file.Path;
import java.util.HashMap; import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; //生成二维码
public class CreateQRCode { public static void main(String[] args) {
int width = 300; //二维码宽度
int height = 300; //二维码高度
String format = "png"; //二维码图片格式
String content = "www.baidu.com"; //二维码内容 //定义二维码参数
HashMap hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //定义内容字符集的编码
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L); //定义纠错等级
hints.put(EncodeHintType.MARGIN, 2); //边框空白 try {
BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height); Path file = new File("E:/img.png").toPath(); MatrixToImageWriter.writeToPath(bitMatrix, format, file);
//MatrixToImageWriter.writeToStream(bitMatrix, format, stream); } catch (Exception e) {
e.printStackTrace();
}
}
}
ZXing读取二维码信息的代码如下:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.HashMap; import javax.imageio.ImageIO; import com.google.zxing.Binarizer;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.BitArray;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer; public class ReadQRCode { public static void main(String[] args) { try {
MultiFormatReader formatReader = new MultiFormatReader(); File file = new File("E:/img.png"); BufferedImage image = ImageIO.read(file); //读取此文件识别成一个图片 BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image))); //定义二维码参数
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());
} catch (Exception e) {
e.printStackTrace();
}
}
}
六、QRCode生成/读取二维码
QRCode生成和读取二维码的jar是分开的,下载网址如下:
QRCode生成二维码网址:http://swetake.com/qrcode/index-e.html
QRCode读取二维码网址:https://osdn.jp/projects/qrcode (此网站无法下载到jar文件)
(后面我在网上搜到一个包含生成和读取二维码功能的jar文件,下载路径:https://files.cnblogs.com/files/bigroc/QRCode.zip)
QRCode生成二维码代码如下:
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException; import javax.imageio.ImageIO; import com.swetake.util.Qrcode; //生成二维码
public class CreateQRCode { public static void main(String[] args) throws IOException { //计算二维码图片的高宽比
//API文档规定计算图片宽高的方式,v是版本号(1~40)
int v = 7;
int width = 67 + 12 * (v - 1); //计算公式
int height = 67 + 12 * (v - 1); Qrcode x = new Qrcode(); /**
* 纠错等级分为
* level L : 最大 7% 的错误能够被纠正;
* level M : 最大 15% 的错误能够被纠正;
* level Q : 最大 25% 的错误能够被纠正;
* level H : 最大 30% 的错误能够被纠正;
*/
x.setQrcodeErrorCorrect('L'); //设置纠错等级
x.setQrcodeEncodeMode('B'); //N代表数字 A代表a-Z B代表其他字符
x.setQrcodeVersion(v); //版本号(1~40)
String qrData = "http://www.baidu.com"; //内容信息 //缓冲区
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //绘图
Graphics2D gs = bufferedImage.createGraphics(); gs.setBackground(Color.WHITE); //背景色
gs.setColor(Color.black);
gs.clearRect(0, 0, width, height); //清除画板内容 //偏移量 2或7
int pixoff = 2; /**
* 1.注意for循环里面的i,j的顺序,
* s[j][i]二维数组的j,i的顺序要与这个方法中的 gs.fillRect(j*3+pixoff,i*3+pixoff, 3, 3);
* 顺序匹配,否则会出现解析图片是一串数字
* 2.注意此判断if (d.length > 0 && d.length < 120)
* 是否会引起字符串长度大于120导致生成代码不执行,二维码空白
* 根据自己的字符串大小来设置此配置
*/
//把要填充的内容转化成字节数
byte[] d = qrData.getBytes("utf-8"); //汉字转化格式
if (d.length > 0 && d.length < 120) {
boolean[][] s = x.calQrcode(d); for (int i = 0; i < s.length; i++) {
for (int j = 0; j < s.length; j++) {
if (s[j][i]) {
//把d中的内容填充
gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);
}
}
}
} gs.dispose(); //结束写入
bufferedImage.flush(); //结束buffered
ImageIO.write(bufferedImage, "png", new File("E:/img.png")); //将图片写入到指定路径下 }
}
QRCode解析二维码代码如下:
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException; import javax.imageio.ImageIO; import jp.sourceforge.qrcode.QRCodeDecoder; public class ReadQRCode { public static void main(String[] args) throws IOException { //图片路径
File file = new File("E:/img.png");
//读取图片到缓冲区
BufferedImage bufferedImage = ImageIO.read(file);
//QRCode解码器
QRCodeDecoder codeDecoder = new QRCodeDecoder(); /**
*codeDecoder.decode(new MyQRCodeImage())
*这里需要实现QRCodeImage接口,MyQRCodeImage.java实现接口类
*/
//通过解析二维码获得信息
String result = new String(codeDecoder.decode(new MyQRCodeImage(bufferedImage)), "utf-8");
System.out.println(result);
}
}
MyQRCodeImage.java类实现QRCodeImage接口
import java.awt.image.BufferedImage;
import jp.sourceforge.qrcode.data.QRCodeImage;
public class MyQRCodeImage implements QRCodeImage{
BufferedImage bufferedImage;
public MyQRCodeImage(BufferedImage bufferedImage) {
this.bufferedImage = bufferedImage;
}
//宽
@Override
public int getWidth() {
return bufferedImage.getWidth();
}
//高
@Override
public int getHeight() {
return bufferedImage.getHeight();
}
//颜色
@Override
public int getPixel(int i, int j) {
return bufferedImage.getRGB(i, j);
}
}
七、注意事项
jar包可放置在lib包下,还要设置此项目的builde path,选中项目,右击,选择Builde Path,点击Configure Builde Path,在libraries下点击Add Jars添加jar文件。
Zxing和QR Code生成和解析二维码的更多相关文章
- 使用Google提供的ZXing Core,Java生成、解析二维码
1.maven项目中,pom.xml中引入ZXing Core工具包: <!-- https://mvnrepository.com/artifact/com.google.zxing/core ...
- ZXing 生成、解析二维码图片的小示例
概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME ...
- JAVA中生成、解析二维码图片的方法
JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...
- Java生成、解析二维码
今天遇到需求,使用Java生成二维码图片,网搜之后,大神们早就做过,个人总结一下. 目标:借助Google提供的ZXing Core工具包,使用Java语言实现二维码的生成和解析. 步骤如下: 1.m ...
- java生成和解析二维码
前言 现在,二维码的应用已经非常广泛,在线生成器也是诸多,随手生成. 所以就和大家分享一个小案例,用zxing来做一个的二维码生成器,当然这个例子是比较简单,若是写的不好请多多包涵. ZXING项目是 ...
- Java使用QRCode.jar生成与解析二维码
原文V:http://www.cnblogs.com/bigroc/p/7496995.html#3797682 正题:Java使用QRCode.jar生成与解析二维码demo 欢迎新手共勉,大神监督 ...
- 使用zxing生成和解析二维码
二维码: 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的: 在代码编制上巧妙的利用构成计算机内部逻辑基础的0和1比特流的概念,使用若干个与二进制相对应的几何 ...
- Java使用Zxing生成、解析二维码工具类
Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法. 1.二维码的生成 (1).将Zxing-core.jar 包加入到classpath下. (2). ...
- Java生成与解析二维码
1.下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar, 其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免 ...
随机推荐
- redis 模糊查询与删除
创建一条数据 set name1 zhangsan 查询 get name1 在创建一条数据 set name2 lisi 查询 get name2 模糊查询 keys name* 查询结果 n ...
- Linux基础命令、软件安装
常用命令 查看当前系统中存在哪些shell cat /etc/shells [root@** ~]# cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /us ...
- Tips for traing DNN
1. 一般的机器学习方法不会在train好的模型上检查training data的结果,因为DNN在training data上都没有办法获得很好的正确率, 所以要先回头看一下要对模型做什么修改, ...
- 被疯狂吐槽的iPhoneXR屏幕真如传言中的那么差吗?
在双十一期间,最受果粉关注的电商平台不是天猫,也不是京东,而是拼多多!原因很简单,拼多多疯狂给出iPhone的各种超低价格,直接压制了竞争对手.以iPhone XR为例,依据容量不同,价格分别为558 ...
- 2 —— js语法 —— 对象和方法的声明 。变量提升。闭包
一,声明对象 var obj1 = {}; var obj2 = {name:'kk',age:18,fun:function{ // name,age,fun为对象的属性,只是属性 ...
- 调试ASP.NET程序
用VS打开你的项目 从VS中找到"调试"-----"附件到进程",然后选中w3wp.exe,点击附件到进程,然后再发送数据进行调试就可以了
- Pip,pywin32,whl文件下载网址,mayavi安装包,PyQt5安装,PyMuPDF安装等注意事项
(1)pip安装的包不一定是用户想要的位置,此时可以用 -t 选项来指定位置. 例如目标位置是/usr/local/lib/python2.7/site-packages/ ,要安装xlrd 这个包 ...
- MongoDB Projection
版权所有,未经许可,禁止转载 章节 MongoDB 入门 MongoDB 优势 MongoDB 安装 MongoDB 数据建模 MongoDB 创建数据库 MongoDB 删除数据库 MongoDB ...
- Centos 7 x86_64 环境Python2.7升级Python3.7.4
升级Python3.7.4 #安装补丁包yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel read ...
- React全局浮窗、对话框
下面代码是组件源码: import React, {Component} from 'react' import {createPortal} from 'react-dom' import styl ...