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包下载地址(免 ...
随机推荐
- hue中访问hdfs报错
在hue中访问hdfs报错: Cannot access: /. Note: you are a Hue admin but not a HDFS superuser, "hdfs" ...
- css - flex 定义排列方向
flex-direction定义伸缩项目放置在伸缩容器的排列方向,对应有四个值: (1)row:从左到右或从右到左 (2)row-reverse:与row属性相反 (3)column:从上到下排列 ( ...
- 数学软件实训1-MATLAB程序设计及应用初步
数学软件实训任务一 一 题目:MATLAB程序设计及应用初步 二 目的:掌握MATLAB程序设计的基本方法,会利用MATLAB程序设计思想编程处理一些简单问题. 三 要求: 1 掌握控制流的基本语法结 ...
- [笔记]ul>li>a做分布时, 让其居中显示效果
结构: <div id="page"> <ul> <li><a href="#">首页</a>< ...
- JVM:垃圾回收
概述 上一篇文章我们已经了解了 Java 的这几块内存区域.对于垃圾回收来说,针对或者关注的是 Java 堆这块区域.因为对于程序计数器.栈.本地方法栈来说,他们随线程而生,随线程而灭,所以这个区域的 ...
- cmf公共函数解析
cmf公共函数解析-common.php 路径:thinkcmf\simplewind\cmf\common.php方法: 方法 作用 返回值 cmf_get_current_admin_id ...
- 吴裕雄--天生自然java开发常用类库学习笔记:foreach及Enumeration接口
import java.util.Vector; import java.util.Enumeration; public class EnumerationDemo01{ public static ...
- S7-300定时器使用总结
以后 规定我写博客 标题 全部采用 黄色第 加粗的黑色字体. S7-300 一共5种定时器 5种定时器线圈 S7-300的SIMATIC定时器的个数为(128~2028个)与CPU的型号有关, 定时器 ...
- DragonFlyBSD 5.6 RC1 发布
导读DragonFlyBSD操作系统下一个主要版本的第一个候选版本RC1现在可以进行测试.DragonFlyBSD 5.6将成为一个功能更新的版本,该功能更新将于周二晚上发布,是第一个候选版本,同时将 ...
- PYTHON画三维图
import matplotlib.pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Dimport numpy as np #bbb=[1 if ...