分享一个Java实现生成二维码的功能,引入的技术为google的zxing。

一、Maven引入

1
2
3
4
5
6
7
8
9
10
11
<!-- zxing二维码 -->
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.5.2</version>
</dependency>

二、书写工具类

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
65
66
67
68
69
70
71
72
73
74
//通用二维码生成工具类
public class QrCodeUtils {

/**
* 生成普通二维码并保存为图片文件
*
* @param content 二维码内容
* @param filePath 保存路径(绝对路径)
* @param width 宽度
* @param height 高度
*/
public static void generateQrCode(String content, String filePath, Integer width, Integer height)throws Exception {
//编码参数设置
HashMap<EncodeHintType, Object> hints = new HashMap<>();
// 编码类型
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 边距
hints.put(EncodeHintType.MARGIN, 1);
BitMatrix encode = new MultiFormatWriter().encode(
content,
BarcodeFormat.QR_CODE,
width,
height,
hints
);
Path path = new File(filePath).toPath();
MatrixToImageWriter.writeToPath(encode, "PNG", path);
}
/**
* 生成带 Logo 的二维码
*
* @param content 二维码内容
* @param logoPath logo 图片路径
* @param outputPath 输出二维码路径
*/
public static void generateQrCodeWithLogo(String content, String logoPath, String outputPath) throws Exception {
int width = 300;
int height = 300;

Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.MARGIN, 1);
// 容错率高,避免 logo 遮挡
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);

BitMatrix bitMatrix = new MultiFormatWriter().encode(
content,
BarcodeFormat.QR_CODE,
width,
height,
hints
);

// 生成二维码图像
BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix, new MatrixToImageConfig());

// 加载 logo 图片
BufferedImage logo = ImageIO.read(new File(logoPath));

int logoWidth = qrImage.getWidth() / 5;
int logoHeight = qrImage.getHeight() / 5;

// 计算 logo 放置位置(居中)
int x = (qrImage.getWidth() - logoWidth) / 2;
int y = (qrImage.getHeight() - logoHeight) / 2;

// 合并图片
Graphics2D g = qrImage.createGraphics();
g.drawImage(logo, x, y, logoWidth, logoHeight, null);
g.dispose();

ImageIO.write(qrImage, "PNG", new File(outputPath));
}
}

三、具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class QrCodeController {
public static void main(String[] args) throws Exception {
String content = "https://zhaoruochen.com/";
String savePath = "D:/qrcode/测试.png";

QrCodeUtils.generateQrCode(content, savePath, 300, 300);
System.out.println("二维码生成成功!");
}
// public static void main(String[] args) throws Exception {
// String content = "cs";
// String logo = "D:/qrcode/logo/logo.jpg";
// String output = "D:/qrcode/带logo的二维码.png";
//
// QrCodeUtils.generateQrCodeWithLogo(content, logo, output);
// System.out.println("带Logo的二维码已生成!");
// }
}

1.普通二维码实现

调用方法成功之后便会在本地savePath路径生成一个.png的二维码。
二维码
接下来我们打开本地地址查看。
二维码
二维码

2.带logo的二维码实现

这里需要注意的是,需要提前在本地绝对路径下添加一张logo图片,然后入参调用方法即可。
二维码
二维码
调用成功之后在本地savePath路径生成一个.png的二维码。
二维码
二维码