ZXing生成二维码怎么用?完整实战指南
目录导读
- ZXing是什么?为什么选它生成二维码?
- 环境搭建:导入ZXing核心库
- 核心代码:三步生成二维码
- 自定义进阶:颜色、Logo、容错率调整
- 常见问题与避坑问答(Q&A)
- 生成后的优化与使用建议
ZXing是什么?为什么选它生成二维码?
ZXing(“Zebra Crossing”的缩写)是Google开源的一款Java类库,支持一维码(条形码)和二维码(QR Code)的生成与解析,在业界,它是最成熟、最稳定的二维码处理工具之一。

选取ZXing的核心优势:
- 纯Java实现,跨平台(可直接用于Android、Java Web、桌面应用)
- 支持多种输出格式:PNG、JPEG、BufferedImage等
- 内置容错机制,支持L、M、Q、H四级容错
- 社区活跃,文档齐全,GitHub Star数超3万
很多开发者问:“ZXing和QrCode.js比哪个好?” 答案是:如果项目是Java后端(如SpringBoot)或Android原生开发,选ZXing;如果是纯前端页面,选qrcode.js更轻量。
环境搭建:导入ZXing核心库
Maven项目(推荐),在pom.xml中加入:
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.5.3</version>
</dependency>
Gradle项目:
implementation 'com.google.zxing:core:3.5.3'
implementation 'com.google.zxing:javase:3.5.3'
如果你不使用构建工具,可直接从Maven中央仓库下载jar包手动导入。
⚠️ 常见错误:只导入了core包但没有引入javase包,导致MatrixToImageWriter类找不到。core负责算法,javase负责图像输出,两者缺一不可。
核心代码:三步生成二维码
下面是最精简、可直接运行的生成代码:
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
public class QRCodeGenerator {
public static void main(String[] args) throws Exception {
// 步骤1:设置二维码内容
String content = "https://example.com";
// 步骤2:配置参数
int width = 300;
int height = 300;
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
// 容错级别:L(7%), M(15%), Q(25%), H(30%)
hints.put(EncodeHintType.ERROR_CORRECTION, "H");
hints.put(EncodeHintType.MARGIN, 2); // 白边大小
// 步骤3:生成并输出
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, width, height, hints);
Path path = new File("qrcode.png").toPath();
MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
System.out.println("二维码已生成:" + path.toAbsolutePath());
}
}
运行后,会在项目根目录生成qrcode.png。
这个代码包含了所有必要步骤:设置内容 → 配置编码参数 → 编码为BitMatrix → 输出为图片。
自定义进阶:颜色、Logo、容错率调整
修改二维码颜色(默认黑白色)
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);
// 替换颜色,例如改为蓝色
for (int x = 0; x < image.getWidth(); x++) {
for (int y = 0; y < image.getHeight(); y++) {
int pixel = image.getRGB(x, y);
if (pixel == 0xFF000000) { // 黑色部分
image.setRGB(x, y, 0xFF2196F3); // 改为蓝色
}
}
}
添加中心Logo
把Logo(小图片)绘制到生成二维码的BufferedImage正中间即可:
Graphics2D g = image.createGraphics();
BufferedImage logo = ImageIO.read(new File("logo.png"));
int logoX = (image.getWidth() - logo.getWidth()) / 2;
int logoY = (image.getHeight() - logo.getHeight()) / 2;
g.drawImage(logo, logoX, logoY, null);
g.dispose();
容错率选哪个?
- L(低):7%损坏可修复,适合内容少、打印精度高的场景
- M(中,默认):15%可修复,通用选择
- Q(高):25%可修复,适合加Logo或磨损环境
- H(最高):30%可修复,极端环境,但二维码密度会更高
建议:如果二维码中间要加Logo,至少用Q级;如果只是纯文本,用M级足够。
常见问题与避坑问答(Q&A)
Q1:生成的二维码手机扫不出来? A:首先检查网络,如果是本地文件,用微信扫一扫试试,常见原因是:白边太小(MARGIN设为0)、尺寸太小(建议不低于200x200)、内容编码不一致(必须UTF-8)。
Q2:如何生成带中文的二维码?
A:必须设置编码为UTF-8,如代码所示:hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"),不设置的话中文可能乱码。
Q3:能否生成动态二维码(图形可变)? A:ZXing只能生成静态二维码,如需动态内容(如扫码后跳转不固定URL),需外接短链接服务(如bitly),每次生成时内容指向你的API地址。
Q4:二维码大小如何换算像素? A:一般微信扫码支持的最小尺寸是120x120像素,建议生成300x300以上,物理打印时:300dpi下,300像素≈2.5厘米。
Q5:生成的二维码有白边怎么办?
A:可以通过MARGIN参数控制,设置为0即可去除白边(但不建议设为0,会导致边缘识别困难,建议设为1或2)。
生成后的优化与使用建议
-
性能优化:如果要在Web服务中高频生成二维码,建议使用
CompletableFuture异步处理,或利用缓存(同一内容不重复生成)。 -
输出格式选择:PNG支持透明背景,JPEG文件更小但压缩失真影响扫码率,推荐使用PNG。
-
响应式场景:如果是给移动端展示,生成二维码后建议增加前端缩放控制,而非生成多套尺寸。
-
安全提醒:不要把敏感信息直接明文写入二维码,因为扫码后可被任何人读取,如需传递私密信息,建议使用加密URL配合Token。 你已经掌握了ZXing生成二维码从环境搭建到高级定制的完整方法,无论是Java后端生成静态二维码,还是集成到Web项目里作为图片输出,这套流程都足够稳健,特别推荐在应用中结合容错率优化,再配合Logo样式,可以大幅提升识别成功率与美观度。