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包下载地址(免 ...
随机推荐
- Why Helm?【转】
每个成功的软件平台都有一个优秀的打包系统,比如 Debian.Ubuntu 的 apt,Redhat.Centos 的 yum.而 Helm 则是 Kubernetes 上的包管理器. 本章我们将讨论 ...
- 【转置】使用mysql转置表格行和列
1.原始表 2.查询结果表 3.查询语句 1 SELECT 2 year1, 3 SUM( CASE WHEN mon= 1 THEN account END ) AS m1, 4 SUM( CASE ...
- tomcat多实例配置
有一台server上跑个tomcat的实例的情况,我遇到过这种情况,毕竟把多个应用部署到一个实例中,如果某个应用出了问题,导致tomcat奔溃,其他应用也gg了.闲话到此. 通常部署多实例就是解压多个 ...
- php中常用的加密函数
1.MD5加密: string md5 ( string $str [, bool $raw_output = false ] ) (1)md5()默认情况下以 32 字符十六进制数字形式返回散列值, ...
- Ubuntu19.04的安装过程详解以及操作系统初始化配置
Ubuntu19.04的安装过程详解以及操作系统初始化配置 ...
- flask邮箱注册问题
app/models.py self.confirmed = True db.session.add(self) db.session.commit() 这里的数据修改完后必须commit提交上去,不 ...
- 【pwnable.kr】input
这道题是一道一遍一遍满足程序需求的题. 网上其他的题解都是用了C语言或者python语言的本地调用,我想联系一下pwntools的远程调用就写了下面的脚本, 执行效果可以通过1~4的检测,到最后soc ...
- 如何将本地项目推送到Github
如何将本地项目推送到Github Tip:在本地要安装好Git,官网:https://git-scm.com/ 一个学习Git的好地方:https://try.github.io/ 在线闯关实战,边练 ...
- 从零开始学C++(0 简介)
2020年,给自己定一个新目标————开始写技术博客,将之前所学的内容重新复习并整理成一系列的文章,一来可以让自己对这些基础知识更加熟悉,二来方便于以后的复习查阅. 以前自己都是以笔记的形式将知识点记 ...
- (转载)wchar_t类型和char类型变量相互转换
转载连接:https://www.cnblogs.com/zhangdewang/p/11420410.html和https://www.cnblogs.com/lanhaicode/p/105742 ...