引言
在数字化时代,二维码已成为连接线上线下世界的重要桥梁。无论是支付、信息分享还是产品溯源,二维码都扮演着关键角色。本文将带你探索如何在 Spring Boot 项目中整合 zxing 库,快速生成功能强大的二维码。通过本教程,你将掌握从零开始实现二维码生成功能的完整流程,并了解如何自定义二维码的各种参数。
二维码包含的信息
在开始技术实现前,让我们先了解二维码可以做什么:
- 文本信息:简单文字、联系方式、诗句等
- URL链接:快速跳转到指定网页
- WiFi配置:自动连接指定WiFi网络
- 电子名片:存储联系人信息
- 支付信息:微信、支付宝等支付二维码
从这些丰富的应用场景可以看出,二维码的本质其实是信息的载体。接下来,让我们动手编码,看看如何用代码把信息装进二维码里。
编码实操
只需要简单两步,就可以实现生成二维码的需求。
1. 添加依赖
首先在 pom.xml
中添加 zxing 依赖(Ps:这里是我使用的版本,大家在看到这篇文章的时候,建议去 Maven 中央仓库查找最新的版本使用):
xml
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.3</version>
</dependency>
2.编写生成逻辑
java
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;
/**
* 生成二维码图片并保存到指定路径
*
* @param data 二维码内容(文本/URL/WiFi配置等)
* @param width 二维码宽度(像素)
* @param height 二维码高度(像素)
* @param filePath 保存路径(需包含.png后缀)
* @return 生成的二维码文件路径,失败时返回null
*/
public static String generateQRCode(String data, int width, int height, String filePath) {
try {
//1.设置二维码生成参数
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 支持中文等特殊字符
hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H); // 30%容错率
hints.put(EncodeHintType.MARGIN, 1); // 二维码边框空白宽度
//2.生成二维码矩阵数据
MultiFormatWriter writer = new MultiFormatWriter();
BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, width, height, hints);
//3.转换为图像对象
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
image.setRGB(x, y, bitMatrix.get(x, y) ? Color.BLACK.getRGB() : Color.WHITE.getRGB());
}
}
//4.保存为PNG文件
File qrCodeFile = new File(filePath);
ImageIO.write(image, "png", qrCodeFile);
System.out.println("二维码已生成并保存到: " + filePath);
return filePath;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
这里主要对代码中**ErrorCorrectionLevel(错误纠正级别)和BarcodeFormat(条码格式)**这两个大家不是很熟悉的参数做下说明:
错误纠正级别包含四个等级:
等级 | 容错率 | 适用场景 | 存储容量减少量 |
---|---|---|---|
L (Low) | 约7% | 高清晰度环境(如打印文档) | 最少 |
M (Medium) | 约15% | 一般商业应用(默认级别) | 中等 |
Q (Quartile) | 约25% | 工业环境(可能有污损) | 较多 |
H (High) | 约30% | 极端环境(户外广告、破损包装) | 最多 |
容错率表示二维码残缺的部分小于等于这个比率依然可以被识别。
条码格式常见的应用如下:
特性 | QR_CODE | CODE_128 | PDF_417 |
---|---|---|---|
最大容量 | 2953字节 | 80字符 | 1850字符 |
是否需要扫描方向 | 任意角度 | 水平方向 | 水平方向 |
典型应用 | 移动支付 | 商品物流 | 证件存储 |
这个依赖库中封装的条码格式非常全面,几乎囊括了目前的所有场景,具体大家可以在代码中查看BarcodeFormat中声明的常量。
3.测试效果
编写一个方法测试生成二维码:
java
public static void main(String[] args) {
String data = "Hello~ CC"; // 二维码中的数据
int width = 300; // 二维码的宽度
int height = 300; // 二维码的高度
String uuid = UUID.randomUUID().toString();
String filePath = "D:\\pic\\" + uuid + ".png"; // 生成的二维码文件的路径
QrCodeUtils.generateQRCode(data, width, height, filePath);
}
运行后在指定目录生成了一个二维码图片:

用手机扫描一下得到文本信息,和测试代码中设置的一致:

小结
zxing 库功能强大且易于集成,可以作为 spring boot 应用处理二维码的首选方案。大家在实际项目中使用的时候,可以将本文的代码示例封装成工具类,也可以作为参考自己实现。二维码生成也只是 zxing 功能的冰山一角,它还能解析二维码、生成各种条形码等等,各位读者感兴趣的话可以继续深入探索。