二维码生成与解析:QRCode

本文介绍使用QRCode生成和解析二维码

资源准备

本次使用的是QRCode的Java构件生成和解析二维码,所以需要用到QRCode的JAR文件,在网盘以下中给出:

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

QRCode创建二维码

使用QRCode生成二维码是使用的Java的绘图工具。代码的步骤和详细说明在代码注释中已经给出。

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
49
50
51
52
53
54
55
56
57
58
59
60
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

import com.swetake.util.Qrcode;

public class CreateQRCode {

public static void main(String[] args) throws IOException {
int version = 7;
int picWidth = 67 + 12 * (version - 1); //生成二维码的宽度根据次公式确定
int picHeight =67 + 12 * (version - 1); //生成二维码的高度根据次公式确定

//1.定义一个Qrcode 对象并设置其纠错等级,编码模式(N-数字,A-英文字符,B-其他字符),版本1-40
Qrcode x = new Qrcode();
x.setQrcodeErrorCorrect('M');
x.setQrcodeEncodeMode('B');
x.setQrcodeVersion(version);

//2.定义二维码内容
String qrData = "https://yangchaofu.cn";

//3.定义一个缓冲区图片
BufferedImage bufferedImage = new BufferedImage(picWidth,picHeight,BufferedImage.TYPE_INT_RGB);

//4.定义一个图形对象(Graphic2D),并将缓冲区图片赋值给图形对象,并进行背景前景的设置和图像背景色的填涂(clearRect)
Graphics2D gs = bufferedImage.createGraphics();
gs.setBackground(Color.WHITE);
gs.setColor(Color.BLACK);
gs.clearRect(0, 0, picWidth, picHeight);

//5.将需要写入二维码的内容转为字节并设置编码为UTF-8
byte[] d = qrData.getBytes("UTF-8");

//6.进行二维码的绘制,使用一个偏移量pixoff
int pixoff = 2;
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[i][j]){
gs.fillRect(j*3 + pixoff, i*3 + pixoff, 3, 3);
}
}
}
}

//7.gs释放屏幕资源,缓冲区图片刷新
gs.dispose();
bufferedImage.flush();

//8.将生成的图片输出
ImageIO.write(bufferedImage, "png", new File("C:/Users/yangc/Desktop/qr.png"));

}

}

创建结果:
点击前往查看

QRCode解析二维码

QRCode解析二维码的效果并不如zxing,所以如果项目中使用,建议使用zxing。

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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

import jp.sourceforge.qrcode.QRCodeDecoder;
import jp.sourceforge.qrcode.data.QRCodeImage;

/**
* 使用QRCode进行二维码解析
* @author yangc
*
*/
public class DeQRCode {

public static void main(String[] args) throws IOException {
//1.指定要解析的文件
File file = new File("C:/Users/yangc/Desktop/pic.png");
//2.将文件使用ImageIO读取到BufferedImage中
BufferedImage bufferedImage = ImageIO.read(file);
//3.定义一个QRCodeDecode 对象
QRCodeDecoder codeDecode = new QRCodeDecoder();
// //4.使用一个byte[]接受解析出来的内容
byte[] contentsByte = codeDecode.decode(new MyQRCodeImage(bufferedImage));
// //5.对解析的内容进行String化并设置编码格式
String contentsStr = new String(contentsByte,"UTF-8");
System.out.println(contentsStr);

//4-5步合在一起
// String result = new String(codeDecode.decode(new MyQRCodeImage(bufferedImage)),"UTF-8");
//
// System.out.println(result);
}
}

/**
* 定义一个MyQRCodeImage类实现QRCode接口,用于二维码解析
* @author yangc
*
*/
class MyQRCodeImage implements QRCodeImage{

BufferedImage bufferedImage;

public MyQRCodeImage(BufferedImage bufferedImage) {
this.bufferedImage = bufferedImage;
}

@Override
public int getHeight() {
return bufferedImage.getHeight();
}

@Override
public int getPixel(int arg0, int arg1) {
return bufferedImage.getRGB(arg0, arg1);
}

@Override
public int getWidth() {
return bufferedImage.getWidth();
}
}

解析结果:
https://yangchaofu.cn

小结

使用QRCode进行二维码的创建和解析说实话体验并不很好,有时候解析出来的一串内容,并没能将编码内容实际解析出来,所以建议使用zxing