本文是学习慕课网课程《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生成和解析二维码的更多相关文章

  1. 使用Google提供的ZXing Core,Java生成、解析二维码

    1.maven项目中,pom.xml中引入ZXing Core工具包: <!-- https://mvnrepository.com/artifact/com.google.zxing/core ...

  2. ZXing 生成、解析二维码图片的小示例

    概述 ZXing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码.目标是能够对QR编码.Data Matrix.UPC的1D条形码进行解码. 其提供了多种平台下的客户端包括:J2ME ...

  3. JAVA中生成、解析二维码图片的方法

    JAVA中生成.解析二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能,并有解析二维码的方法. 一.下载zxing的架包,并导 ...

  4. Java生成、解析二维码

    今天遇到需求,使用Java生成二维码图片,网搜之后,大神们早就做过,个人总结一下. 目标:借助Google提供的ZXing Core工具包,使用Java语言实现二维码的生成和解析. 步骤如下: 1.m ...

  5. java生成和解析二维码

    前言 现在,二维码的应用已经非常广泛,在线生成器也是诸多,随手生成. 所以就和大家分享一个小案例,用zxing来做一个的二维码生成器,当然这个例子是比较简单,若是写的不好请多多包涵. ZXING项目是 ...

  6. Java使用QRCode.jar生成与解析二维码

    原文V:http://www.cnblogs.com/bigroc/p/7496995.html#3797682 正题:Java使用QRCode.jar生成与解析二维码demo 欢迎新手共勉,大神监督 ...

  7. 使用zxing生成和解析二维码

    二维码: 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的: 在代码编制上巧妙的利用构成计算机内部逻辑基础的0和1比特流的概念,使用若干个与二进制相对应的几何 ...

  8. Java使用Zxing生成、解析二维码工具类

    Zxing是Google提供的关于条码(一维码.二维码)的解析工具,提供了二维码的生成与解析的方法. 1.二维码的生成 (1).将Zxing-core.jar 包加入到classpath下. (2). ...

  9. Java生成与解析二维码

    1.下载支持二维码的jar包qrcode.jar和qrcode_swetake.jar, 其中qrcode_swetake.jar用于生成二维码,rcode.jar用于解析二维码,jar包下载地址(免 ...

随机推荐

  1. Oracle delete 之后恢复数据

    当我们粗心大意直接delete from不加条件而又没有回滚的时候有一个很简单的方法能够将数据恢复到delete之前的状态 第一种方案已经帮助我解决了实际问题.第二种方案暂未实践 在此记录下以便日后查 ...

  2. 获取QQ状态接口开发示例

    unit checkqqstatus; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Control ...

  3. Hadoop数据压缩技术

    一.Hadoop数据压缩及其优缺点 1.压缩技术的好处与坏处 好处: 减少存储磁盘空间 降低IO(网络的IO和磁盘的IO) 加快数据在磁盘和网络中的传输速度,从而提高系统的处理速度. 坏处: 由于使用 ...

  4. 吴裕雄--天生自然java开发常用类库学习笔记:观察者设计模式

    import java.util.* ; class House extends Observable{ // 表示房子可以被观察 private float price ;// 价钱 public ...

  5. poj 2456 Aggressive cows 贪心+二分

    Aggressive cows Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 25944   Accepted: 11982 ...

  6. HDU - 6000 Wash(优先队列+贪心)

    题意:已知有L件衣服,M个洗衣机,N个烘干机,已知每个机器的工作时间,且每个机器只能同时处理一件衣服,问洗烘完所有衣服所需的最短时间. 分析: 1.优先队列处理出每件衣服最早的洗完时间. 2.优先队列 ...

  7. 【php】PHP现代框架代表-Laravel框架核心技术特性

    一.php语言特点及发展现状 1.服务端脚本语言,自由度太大 ,一个业务逻辑可言写在模型里,控制器里,也可以单独封装成一个类,甚至可以嵌入到html里,这样势必会造成混乱,业务逻辑散落在各处,尤其对于 ...

  8. centos-6更新yum源(163)

    更新前请先备份原来的repo文件,养成好习惯 cd /etc/yum.repos.d/ mv CentOS-Base.repo CentOS-Base.repo.bak 到http://mirrors ...

  9. 利用创建的sa token来创建kubectl的config文件

    1.第一步 创建一sa,并授予需要的一个权限(需要授予的权限) 2.第二步 取步骤1中的sa的 secret的token文件并进行base64解码      echo "$TOKEN&quo ...

  10. Django——优美的Path()函数

    path( )作用:解析URL地址 path( ) 标准语法: (<>为必须的参数,[]为可选参数) path(<route>, <view>, [name=Non ...