使用ZXing生成二维码的Java指南
ZXing("Zebra Crossing")是一个开源的、多格式的1D/2D条码图像处理库,支持生成和解析多种条码格式,包括QR码,下面我将介绍如何在Java中使用ZXing生成二维码。

添加依赖
你需要将ZXing库添加到你的项目中,如果你使用Maven,可以在pom.xml中添加以下依赖:
<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>
对于Gradle项目:
implementation 'com.google.zxing:core:3.5.2' implementation 'com.google.zxing:javase:3.5.2'
基本二维码生成代码
以下是一个简单的示例,展示如何生成二维码并保存为PNG图片:
import com.google.zxing.*;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.util.HashMap;
import java.util.Map;
public class QRCodeGenerator {
public static void main(String[] args) {
String text = "https://www.example.com"; // 要编码的文本
int width = 300; // 二维码宽度
int height = 300; // 二维码高度
String format = "png"; // 图片格式
Path path = new File("qrcode.png").toPath(); // 输出路径
generateQRCode(text, width, height, format, path);
}
public static void generateQRCode(String text, int width, int height, String format, Path path) {
try {
// 设置二维码参数
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
hints.put(EncodeHintType.MARGIN, 1); // 设置边距
// 生成二维码矩阵
BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
// 将矩阵写入文件
MatrixToImageWriter.writeToPath(bitMatrix, format, path);
System.out.println("二维码已生成并保存到: " + path);
} catch (WriterException | IOException e) {
System.err.println("生成二维码时出错: " + e.getMessage());
}
}
}
高级选项
1 自定义颜色和Logo
import com.google.zxing.client.j2se.MatrixToImageConfig;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
// 在generateQRCode方法中修改写入文件的代码
BufferedImage qrImage = MatrixToImageWriter.toBufferedImage(bitMatrix);
// 自定义前景色和背景色
MatrixToImageConfig config = new MatrixToImageConfig(Color.BLACK.getRGB(), Color.WHITE.getRGB());
BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix, config);
// 如果需要添加Logo
if (logoPath != null) {
BufferedImage logo = ImageIO.read(new File(logoPath));
Graphics2D graphics = image.createGraphics();
// 计算Logo位置和大小
int logoWidth = logo.getWidth(null) > image.getWidth() / 5 ?
image.getWidth() / 5 : logo.getWidth(null);
int logoHeight = logo.getHeight(null) > image.getHeight() / 5 ?
image.getHeight() / 5 : logo.getHeight(null);
int x = (image.getWidth() - logoWidth) / 2;
int y = (image.getHeight() - logoHeight) / 2;
// 绘制Logo
graphics.drawImage(logo, x, y, logoWidth, logoHeight, null);
graphics.dispose();
}
ImageIO.write(image, format, path.toFile());
2 生成二维码到输出流
import java.io.OutputStream;
public static void generateQRCodeToStream(String text, int width, int height,
String format, OutputStream outputStream) {
try {
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
BitMatrix bitMatrix = new QRCodeWriter().encode(text, BarcodeFormat.QR_CODE, width, height, hints);
MatrixToImageWriter.writeToStream(bitMatrix, format, outputStream);
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
注意事项
-
二维码容量:二维码能存储的数据量有限,纯文本大约能存储几千个字符,包含URL时效果最好。
(图片来源网络,侵删) -
错误纠正:设置适当的错误纠正级别(L, M, Q, H),H级别能修复约30%的错误,但会增加二维码的复杂度。
-
尺寸和边距:确保二维码有足够的边距,以便扫描设备能够正确识别。
-
颜色对比度:确保前景色和背景色有足够的对比度,通常使用黑色前景和白色背景。
-
测试:生成二维码后,务必使用多个不同的扫描设备进行测试,确保可读性。
(图片来源网络,侵删)
替代方案
如果你不想直接使用ZXing的API,也可以考虑以下封装库:
- ZXing Maven插件:可以直接在Maven构建过程中生成二维码
- QRGen:一个更简单的Java二维码生成库
- Barbecue:支持多种条码格式,包括QR码
希望这个指南对你有帮助!如果你需要更具体的实现或有其他问题,请随时提问。
