Java实现二维码、条形码生成器

发布时间:2024年01月15日

文章目录


前言

在数字化时代,二维码已经成为了信息交流的一种常见方式。它们被广泛用于各种应用,从产品标签到活动传单,以及电子支付。本文将向您展示如何在Spring Boot应用程序中整合ZXing库,以创建和解析QR码。无论您是想为您的产品添加QR码功能,还是为您的移动应用程序添加扫描功能,本文将为您提供一个清晰的指南。


1、介绍QR码和ZXing

QR码,全名Quick Response码,是一种二维码(2D barcode)的类型,最早由日本公司Denso Wave于1994年开发。它是一种能够存储各种数据类型的矩阵二维条码,通常以黑色模块和白色背景的方式呈现。QR码可以存储文本、URL、联系信息、地理位置等多种信息,因此在移动设备、广告传播、商品标识等领域广泛使用。

ZXing,全名为"Zebra Crossing",是一个开源的Java库,用于二维码的生成和解析。它是一个强大的工具,可以用于生成QR码以及解析包括QR码在内的多种二维码格式。ZXing提供了多种编程语言的API,使开发者能够轻松集成二维码功能到他们的应用中。它支持多种平台,包括Android、iOS、Java等。除了QR码,ZXing还支持解析其他一维码和二维码,例如EAN、UPC、DataMatrix等。

使用ZXing库,你可以轻松地将QR码功能集成到你的软件开发项目中,无论是生成QR码以供分享,还是解析QR码以获取其中的信息。在实际使用中,你可以添加注释来解释代码中的关键部分,以帮助其他开发者理解你的实现。这对于团队协作和维护代码非常有帮助。

2、整合zxing

2.1 pom添加ZXing依赖

        <!-- 二维码 ZXing -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.5.1</version> <!-- 请使用最新版本 -->
        </dependency>

请注意,上述示例中的version部分可以根据你的项目需要使用ZXing的特定版本。建议使用最新版本以获取最新的功能和改进。

2.2 生成二维码

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * 生成二维码工具类
 */
@Slf4j
public class CodeGeneratorUtil {

    /**
     * 生成QR码
     *
     * @param data     要存储在QR码中的数据,可以是文本、URL等
     * @param width    QR码的宽度(像素)
     * @param height   QR码的高度(像素)
     * @param filePath 生成的QR码文件的保存路径
     */
    public static void generateQrCode(String data, int width, int height, String filePath) {
        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); // 二维码边距

            MultiFormatWriter writer = new MultiFormatWriter();
            BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, width, height, hints);

            // 创建BufferedImage对象来表示QR码
            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());
                }
            }

            // 将QR码保存到文件
            File qrCodeFile = new File(filePath);
            ImageIO.write(image, "png", qrCodeFile);
            log.info("QR码已生成并保存到: {}", filePath);
        } catch (Exception e) {
            log.error("QR码生成失败:{}", e.getMessage());
        }
    }

   
}

在上面的代码中,generateQRCode方法接收四个参数:

  • data:要存储在QR码中的数据,可以是文本、URL等。

  • width:QR码的宽度(像素)。

  • height:QR码的高度(像素)。

  • filePath:生成的QR码文件的保存路径。

方法使用ZXing库的MultiFormatWriter来生成QR码,并将QR码保存到指定路径的文件中。确保根据你的需求修改这些参数以生成你想要的QR码。

2.3?生成条形码

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import lombok.extern.slf4j.Slf4j;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

/**
 * 生成二维码工具类
 */
@Slf4j
public class CodeGeneratorUtil {

    /**
     * 生成QR码
     *
     * @param data     要存储在QR码中的数据,可以是文本、URL等
     * @param width    QR码的宽度(像素)
     * @param height   QR码的高度(像素)
     * @param filePath 生成的QR码文件的保存路径
     */
    public static void generateQrCode(String data, int width, int height, String filePath) {
        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); // 二维码边距

            MultiFormatWriter writer = new MultiFormatWriter();
            BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, width, height, hints);

            // 创建BufferedImage对象来表示QR码
            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());
                }
            }

            // 将QR码保存到文件
            File qrCodeFile = new File(filePath);
            ImageIO.write(image, "png", qrCodeFile);
            log.info("QR码已生成并保存到: {}", filePath);
        } catch (Exception e) {
            log.error("QR码生成失败:{}", e.getMessage());
        }
    }

    /**
     * 生成条形码
     *
     * @param data     要存储在条形码中的数据,可以是商品条形码等
     * @param width    条形码的宽度(像素)
     * @param height   条形码的高度(像素)
     * @param filePath 生成的条形码文件的保存路径
     */
    public static void generateBarCode(String data, int width, int height, String filePath) {
        try {
            Map<EncodeHintType, Object> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码

            MultiFormatWriter writer = new MultiFormatWriter();
            BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.CODE_128, width, height, hints);

            // 创建BufferedImage对象来表示条形码
            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) ? 0 : 0xFFFFFF); // 生成黑色条和白色背景的条形码
                }
            }

            // 检查图片是否存在,若不存在则创建
            File barcodeFile = new File(filePath);

            // 将条形码写入
            ImageIO.write(image, "png", barcodeFile);
            log.info("条形码已生成并保存到: {}", filePath);
        } catch (Exception e) {
            log.error("条形码生成失败:{}", e.getMessage());
        }
    }

}

2.4 测试结果

写一个测试的main方法:

    public static void main(String[] args) {

        String data = "Hello World";// 内容

        int width1 = 150;// QR码宽度
        int height1 = 150;// QR码高度
        String filePath1 = "C:\\Users\\admin\\Desktop\\QR码.png";// QR码存放路径

        int width2 = 500;// 条形码宽度
        int height2 = 100;// 条形码高度
        String filePath2 = "C:\\Users\\admin\\Desktop\\条形码.png";// 条形码存放路径

        generateQrCode(data, width1, height1, filePath1);
        generateBarCode(data, width2, height2, filePath2);
    }

生成成功,且都可以扫码识别哦!

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏?关注,您的支持是我坚持写作最大的动力。??

文章来源:https://blog.csdn.net/weixin_42555014/article/details/135604804
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。