二维码生成与解析:zxing

本文介绍使用开源库zxing生成和解析二维码。

使用zxing首先需要使用源码中的core和javase两个文件制作JAR文件,为了不偏离主题,将这部分放在最后一节讲解,本文直接提供制作好的JAR文件。

百度网盘:链接:https://pan.baidu.com/s/1vQZRPbRKzaQg3-XqsRc-Jw
提取码:y8cq

使用zxing创建二维码

将网盘中zxing文件夹中的zxing3.x.jar文件导入到项目中。
以下的代码将在 C://Users/yangc/Desktop文件夹中创建一张二维码(pic.png),二维码所携带的内容为:https://yangchaofu.cn。创建过程总共分为两个大步骤,第一个大步骤是创建前的准备工作,包含两个小步骤;第二个大步骤是创建步骤 ,包含三个小步骤,整体可以用以下列表结构表示:

  • 制作前准备工作
    • 定义图片信息和二维码内容
    • 定义二维码的属性信息,包括纠错等级,编码格式,二维码边距
  • 制作过程
    • 使用MultiFormatRead的encode方法生成一个BitMatrix对象
    • 指定输出路径
    • 使用MatrixToImageWriter的writeToPath方法将BitMatrix对象写入文件

以下代码是对上述描述的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;

/**
* Java进行二维码制作-zxing
* @author yangchaofu
* @since JDK 1.8.192
*/
public class CreateQRCode {

public static void main(String[] args) {
//制作二维码的准备工作
//1.定义所要生成的二维码图片的长,宽,图片格式和所携带的信息
int picWidth = 300;
int picHeight = 300;
String picFormat = "png";
String picContents = "https://yangchaofu.cn";

//2.定义二维码的基本属性配置,使用散列表存储,最基本的设置包括二维码的编码格式,纠错等级和图片的边距
HashMap hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); //设置编码格式,utf-8可设置中文
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); //设置纠错等级
hints.put(EncodeHintType.MARGIN, 1); //设置生成二维码边距


//生成二维码的步骤
try {
//1.定义一个为BitMatrix 对象,使用MultiFormatWriter 对象的encode方法设置二维码的内容,编码格式BarcodeFormat,宽,高,设置信息hints
BitMatrix bitMatrix = new MultiFormatWriter().encode(picContents, BarcodeFormat.QR_CODE, picWidth, picHeight,hints);
//2.定义一个Path对象用于确定文件的输出位置
Path file = new File("C:/Users/yangc/Desktop/pic.png").toPath();
//3.使用MatrixToImageWriter 对象的writeToPath方法,将二维码图片输出到指定的位置,设置格式为我们准备阶段的格式
MatrixToImageWriter.writeToPath(bitMatrix, picFormat, file);
System.out.println("生成二维码成功!");
} catch (Exception e) {
e.printStackTrace();
}
}

}

代码执行结果:

点击前往查看

使用zxing解析二维码

解析二维码包括三个大步骤,用以下结构描述

  • 解析前准备
    • 准备一个文件对象,指向需要解析的二维码图片
    • 使用ImageIO读取该图片对象为缓冲区图片BufferedImage
    • 将BufferedImage转换为一个二进制位图对象
    • 定义一个散列表存取二维码的编码格式
  • 解析过程步骤
    • 定义一个MultiFormatReader 对象,用于解码
    • 定义一个Result 对象用来获取解析的结果,这里的参数使用到前面准备的两个重要的数据,被转换为BinaryBitmap的图片对象,和定义解码配置的散列表hints
  • 解析结果的展示(可以直接toString得到解析结果,也可是使用getText获取解析文本,使用getBarcodeFromat获取二维码格式)

以下是上述过程的代码表述:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;

import javax.imageio.ImageIO;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.Result;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;

public class DeQRCode {

public static void main(String[] args) {
try {
//解析前准备步骤
//1.定义一个File 对象,指向我们要解码的二维码位置
File file = new File("C:/Users/yangc/Desktop/qr.png");
//2.定义一个BufferedImage 对象,并使用ImageIO类的read方法读取我们的File对象(一张图片)
BufferedImage image = ImageIO.read(file);
//3.定义一个BinaryBitmap 对象,使用多重嵌套 实例化将我们的image转换成一个BinaryBitmap对象,多重嵌套声明包括HybridBinarizer->(参数)BufferedImageLuminanceSource->(参数)BufferedImage[image]
BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(new BufferedImageLuminanceSource(image)));
//4.定义一个散列表,指定编码的一对键值
HashMap hints = new HashMap();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 设置编码格式,utf-8可设置中文

//解析过程步骤
//1.定义一个MultiFormatReader 对象,用于解码
MultiFormatReader formatRead = new MultiFormatReader();
//2.定义一个Result 对象用来获取解析的结果,这里的参数使用到前面准备的两个重要的数据,被转换为BinaryBitmap的图片对象,和定义解码配置的散列表hints
Result result = formatRead.decode(binaryBitmap, hints);

//解析结果展示
//rusult的toString可以展示解析结果
System.out.println("解析结果:"+result.toString());
//result文本信息可以展示二维码所携带的文本内容
System.out.println("二维码文本内容:"+result.getText());
//解码的格式可以获取二维码的编码标准和格式
System.out.println("二维码格式:"+result.getBarcodeFormat());
} catch (Exception e) {
e.printStackTrace();
}
}

}

以上代码的解析结果:
解析结果:https://yangchaofu.cn
二维码文本内容:https://yangchaofu.cn
二维码格式:QR_CODE

使用zxing源码制作JAR

github上有很多非常优秀的开源项目,这次使用的zxing就是其中之一,如何复用这些代码呢,对于Java来说,jar文件是不陌生的。我在这次实践中第一次体会到了使用源码制作jar文件的过程,记录在此处。

  1. 新建一个Jave项目;
  2. 将下载的zxing文件夹中的core和javase两个文件中下的com文件复制到项目的src中,复制中会有文件存在的提示,选择就可以;
  3. 由于项目不是完整的项目,项目中会有很多的错误提示,这个不用管,因为我们使用IDE的时候,IDE会帮助我们管理文件的,所以直接选择导出JAR文件,之后我们就可以得到一个最新的zxing的可复用构件。

小结

以上代码实现了使用zxing创建和解析二维码,经测试所生成的二维码识别率和准确性都是满足要求的,解析代码的识别率也很高。zxing是一个很好的解决方案。
感谢慕课网Fcming老师的讲解和慕课网这个平台,十分感谢!