Java二维码与条形码生成库详解:ZXing、QRGen与Barcode4J实战代码示例
在Java开发中,生成二维码和条形码通常依赖于第三方库,这些库封装了复杂的数据编码算法和图像生成过程,使得开发者只需通过简单易用的API就能快速创建所需条码或二维码。以下将详细介绍两个常用的Java库:ZXing(Zebra Crossing)和QRGen,并附带详尽的代码示例及注释,以帮助理解如何使用它们来生成二维码和条形码。
一、ZXing库
ZXing(发音为“zing”)是一个广泛使用的开源库,专门用于生成、解析一维条码(如Code 128、EAN、UPC等)和二维条码(如QR Code、Data Matrix、Aztec等)。它提供了丰富的API和高度的灵活性。
1. 添加依赖
对于Maven项目,添加以下依赖到pom.xml文件中:
Xml
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>core</artifactId>
<version>3.5.1</version> <!-- 使用最新版本 -->
</dependency>
<dependency>
<groupId>com.google.zxing</groupId>
<artifactId>javase</artifactId>
<version>3.5.1</version> <!-- 使用最新版本 -->
</dependency>
2. 生成二维码
下面是一个使用ZXing生成QR Code的Java代码示例:
Java
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.qrcode.decoder.ErrorCorrectionLevel;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
public class ZXingQRCodeGenerator {
public static void main(String[] args) throws Exception {
// 要编码的信息
String qrCodeContent = "https://example.com";
// 定义二维码的配置参数
Map<EncodeHintType, Object> hints = new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 设置纠错级别(L、M、Q、H,从低到高)
hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符集
// 创建二维码编码器
QRCodeWriter qrCodeWriter = new QRCodeWriter();
// 生成二维码矩阵
BitMatrix bitMatrix = qrCodeWriter.encode(qrCodeContent, BarcodeFormat.QR_CODE, 250, 250, hints);
// 将BitMatrix转换为BufferedImage
int width = bitMatrix.getWidth();
int height = bitMatrix.getHeight();
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) ? 0xFF000000 : 0xFFFFFFFF); // 黑白二值化
}
}
// 保存为PNG图片
File outputFile = new File("output_qrcode.png");
ImageIO.write(image, "PNG", outputFile);
System.out.println("二维码已生成并保存至: " + outputFile.getAbsolutePath());
}
}
这段代码首先定义了要编码的信息(如URL),然后设置了一些生成二维码时的配置参数,如纠错级别和字符集。接着创建QRCodeWriter实例,并使用其encode方法生成BitMatrix,即二维码的二进制矩阵。最后,将这个矩阵转换为BufferedImage,设置黑白像素,然后保存为PNG图片。
二、QRGen库
QRGen是一个专注于生成高质量QR Code的轻量级Java库,它提供了一种简洁的API,允许用户快速生成二维码,并支持自定义颜色、大小等属性。
1. 添加依赖
在Maven项目中,添加以下依赖到pom.xml文件:
Xml
<dependency>
<groupId>com.github.kenglxn.QRGen</groupId>
<artifactId>javase</artifactId>
<version>2.¾.0</version> <!-- 使用最新版本 -->
</dependency>
2. 生成二维码
使用QRGen生成二维码的代码示例:
Java
import com.github.kenglxn.QRGen.QR;
import com.github.kenglxn.QRGen.QRCode;
import com.github.kenglxn.QRGen.QRUtil;
import java.awt.Color;
import java.io.File;
import java.nio.file.Path;
public class QRGenQRCodeGenerator {
public static void main(String[] args) throws Exception {
// 要编码的信息
String qrCodeContent = "https://example.com";
// 定义二维码样式(可选)
QRCode code = QR.from(qrCodeContent)
.withSize(250, 250) // 设置二维码大小
.withColor(Color.BLACK, Color.WHITE) // 设置前景色和背景色
.to(ImageType.PNG); // 指定生成的图片类型
// 保存二维码到指定路径
Path outputPath = Path.of("output_qrcode_gen.png");
code.save(outputPath.toFile());
System.out.println("二维码已生成并保存至: " + outputPath.toAbsolutePath());
}
}
这段代码使用QRGen提供的QR类的静态方法from来创建一个二维码对象,传递要编码的信息作为参数。然后通过链式调用设置二维码的大小、颜色和图片类型。最后,调用save方法将生成的二维码保存到指定路径。
三、条形码生成库
虽然ZXing也能生成一维条形码,但这里为了展示另一个专用库,我们将介绍Barcode4J,它专为生成各种一维和二维条形码而设计。
1. 添加依赖
对于Maven项目,添加以下依赖到pom.xml文件:
Xml
<dependency>
<groupId>net.sf.barcode4j</groupId>
<artifactId>barcode4j</artifactId>
<version>2.1</version> <!-- 使用最新版本 -->
</dependency>
2. 生成条形码
使用Barcode4J生成Code 128条形码的Java代码示例:
Java
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;
public class Barcode4JCode128Generator {
public static void main(String[] args) throws IOException {
// 要编码的信息
String barcodeContent = "1234567890";
// 创建Code128条形码生成器
Code128Bean barcodeBean = new Code128Bean();
// 设置条形码基本属性
barcodeBean.doQuietZone(false); // 是否显示四周静区
barcodeBean.setModuleWidth(0.⅛f); // 单元宽度
barcodeBean.setHeight(50); // 条形码高度
// 创建BitmapCanvasProvider以生成位图形式的条形码
BufferedImage image;
try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
BitmapCanvasProvider canvas = new BitmapCanvasProvider(out, "image/x-png", 300, BufferedImage.TYPE_BYTE_BINARY, false, 0);
barcodeBean.generateBarcode(canvas, barcodeContent);
canvas.finish();
image = ImageIO.read(new ByteArrayInputStream(out.toByteArray()));
}
// 保存为PNG图片
File outputFile = new File("output_barcode.png");
ImageIO.write(image, "PNG", outputFile);
System.out.println("条形码已生成并保存至: " + outputFile.getAbsolutePath());
}
}
这段代码首先创建Code128Bean实例,然后设置条形码的基本属性,如是否显示静区、单元宽度和高度。接下来,创建BitmapCanvasProvider对象,用于将生成的条形码渲染为位图。最后,将位图保存为PNG图片。
总结来说,ZXing库提供了全面的二维码和条形码生成与解析能力,而QRGen库则提供了简洁的API专门用于生成高质量的QR Code。对于条形码生成,Barcode4J库提供了丰富的一维和二维条形码类型支持。以上示例代码均包含了详细的注释,以帮助理解和使用这些库来满足不同的编码需求。