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库提供了丰富的一维和二维条形码类型支持。以上示例代码均包含了详细的注释,以帮助理解和使用这些库来满足不同的编码需求。