🔥 Spring Boot 3 整合 zxing:轻松生成二维码的指南

引言

在数字化时代,二维码已成为连接线上线下世界的重要桥梁。无论是支付、信息分享还是产品溯源,二维码都扮演着关键角色。本文将带你探索如何在 Spring Boot 项目中整合 zxing 库,快速生成功能强大的二维码。通过本教程,你将掌握从零开始实现二维码生成功能的完整流程,并了解如何自定义二维码的各种参数。

二维码包含的信息

在开始技术实现前,让我们先了解二维码可以做什么:

  • 文本信息:简单文字、联系方式、诗句等
  • URL链接:快速跳转到指定网页
  • WiFi配置:自动连接指定WiFi网络
  • 电子名片:存储联系人信息
  • 支付信息:微信、支付宝等支付二维码

从这些丰富的应用场景可以看出,二维码的本质其实是信息的载体。接下来,让我们动手编码,看看如何用代码把信息装进二维码里。

编码实操

只需要简单两步,就可以实现生成二维码的需求。

1. 添加依赖

首先在 pom.xml 中添加 zxing 依赖(Ps:这里是我使用的版本,大家在看到这篇文章的时候,建议去 Maven 中央仓库查找最新的版本使用):

xml 复制代码
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.5.3</version>
</dependency>

2.编写生成逻辑

java 复制代码
import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.common.BitMatrix;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile;

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


/**
 * 生成二维码图片并保存到指定路径
 * 
 * @param data     二维码内容(文本/URL/WiFi配置等)
 * @param width    二维码宽度(像素)
 * @param height   二维码高度(像素)
 * @param filePath 保存路径(需包含.png后缀)
 * @return 生成的二维码文件路径,失败时返回null
 */
public static String generateQRCode(String data, int width, int height, String filePath) {
    try {
        //1.设置二维码生成参数
        Map<EncodeHintType, Object> hints = new HashMap<>();
        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 支持中文等特殊字符
        hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H); // 30%容错率
        hints.put(EncodeHintType.MARGIN, 1); // 二维码边框空白宽度

        //2.生成二维码矩阵数据
        MultiFormatWriter writer = new MultiFormatWriter();
        BitMatrix bitMatrix = writer.encode(data, BarcodeFormat.QR_CODE, width, height, hints);

        //3.转换为图像对象
        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());
            }
        }

        //4.保存为PNG文件
        File qrCodeFile = new File(filePath);
        ImageIO.write(image, "png", qrCodeFile);
        System.out.println("二维码已生成并保存到: " + filePath);
        return filePath;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

这里主要对代码中**ErrorCorrectionLevel(错误纠正级别)BarcodeFormat(条码格式)**这两个大家不是很熟悉的参数做下说明:

错误纠正级别包含四个等级:

等级 容错率 适用场景 存储容量减少量
L (Low) 约7% 高清晰度环境(如打印文档) 最少
M (Medium) 约15% 一般商业应用(默认级别) 中等
Q (Quartile) 约25% 工业环境(可能有污损) 较多
H (High) 约30% 极端环境(户外广告、破损包装) 最多

容错率表示二维码残缺的部分小于等于这个比率依然可以被识别。

条码格式常见的应用如下:

特性 QR_CODE CODE_128 PDF_417
最大容量 2953字节 80字符 1850字符
是否需要扫描方向 任意角度 水平方向 水平方向
典型应用 移动支付 商品物流 证件存储

这个依赖库中封装的条码格式非常全面,几乎囊括了目前的所有场景,具体大家可以在代码中查看BarcodeFormat中声明的常量。

3.测试效果

编写一个方法测试生成二维码:

java 复制代码
public static void main(String[] args) {
    String data = "Hello~ CC"; // 二维码中的数据
    int width = 300; // 二维码的宽度
    int height = 300; // 二维码的高度
    String uuid = UUID.randomUUID().toString();
    String filePath = "D:\\pic\\" + uuid + ".png"; // 生成的二维码文件的路径

    QrCodeUtils.generateQRCode(data, width, height, filePath);
}

运行后在指定目录生成了一个二维码图片:

用手机扫描一下得到文本信息,和测试代码中设置的一致:

小结

zxing 库功能强大且易于集成,可以作为 spring boot 应用处理二维码的首选方案。大家在实际项目中使用的时候,可以将本文的代码示例封装成工具类,也可以作为参考自己实现。二维码生成也只是 zxing 功能的冰山一角,它还能解析二维码、生成各种条形码等等,各位读者感兴趣的话可以继续深入探索。

相关推荐
绝无仅有29 分钟前
后端 Go 经典面试常见问题解析与总结
后端·面试·github
绝无仅有32 分钟前
后端工程师面试常见问题与回答解析总结
后端·面试·github
程序员爱钓鱼3 小时前
Go语言实战案例 — 项目实战篇:简易博客系统(支持评论)
前端·后端·go
Grey Zeng8 小时前
Java SE 25新增特性
java·jdk·jdk新特性·jdk25
追逐时光者9 小时前
精选 4 款基于 .NET 开源、功能强大的 Windows 系统优化工具
后端·.net
雨白9 小时前
Java 线程通信基础:interrupt、wait 和 notifyAll 详解
android·java
TF男孩9 小时前
ARQ:一款低成本的消息队列,实现每秒万级吞吐
后端·python·消息队列
AAA修煤气灶刘哥11 小时前
别让Redis「歪脖子」!一次搞定数据倾斜与请求倾斜的捉妖记
redis·分布式·后端
AAA修煤气灶刘哥11 小时前
后端人速藏!数据库PD建模避坑指南
数据库·后端·mysql
你的人类朋友11 小时前
什么是API签名?
前端·后端·安全