🔥 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 功能的冰山一角,它还能解析二维码、生成各种条形码等等,各位读者感兴趣的话可以继续深入探索。

相关推荐
sg_knight43 分钟前
Spring Cloud LoadBalancer深度解析:官方负载均衡方案迁移指南与避坑实践
java·spring boot·spring·spring cloud·微服务·负载均衡
llwszx1 小时前
Spring Boot 整合 Spring AI 与 MCP 开发智能体工具指南
人工智能·spring boot·spring·智能体·spring ai·mcp
_何同学1 小时前
Ollama 安装 DeepSeek 与 Spring Boot 集成指南
java·spring boot·后端·ai
Code季风3 小时前
跨语言RPC:使用Java客户端调用Go服务端的HTTP-RPC服务
java·网络协议·http·rpc·golang
盖世英雄酱581363 小时前
时间设置的是23点59分59秒,数据库却存的是第二天00:00:00
java·数据库·后端
爷_4 小时前
Nest.js 最佳实践:异步上下文(Context)实现自动填充
前端·javascript·后端
clmm1234 小时前
Java动态生成Nginx服务配置
java·开发语言·nginx
东方芷兰4 小时前
Leetcode 刷题记录 17 —— 堆
java·c++·b树·算法·leetcode·职场和发展
追逐时光者4 小时前
提高 .NET 编程效率的 Visual Studio 使用技巧和建议!
后端·.net·visual studio
草履虫建模4 小时前
Web开发全栈流程 - Spring boot +Vue 前后端分离
java·前端·vue.js·spring boot·阿里云·elementui·mybatis