使用SpringBoot和ZXing实现二维码生成与解析

一、ZXing简介
ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库。它包含了用于解析多种格式的1D/2D条形码的工具类,目标是能够对QR编码,Data Matrix, UPC的1D条形码进行解码。在二维码编制上,ZXing巧妙地利用构成计算机内部逻辑基础的“0”、“1”比特流的概念,使用若干个与二进制数相对应的黑白模块来表示数据。此外,ZXing支持各种条形码,二维码扫描,由多个模块组成,而且支持PC端和移动端。现在的版本已经优化了很多bug,并进行了诸多改进。因此,无论是在自己的项目中集成二维码功能,还是进行二维码生成和解析的相关开发工作,都可以考虑使用ZXing这个强大的工具库。
二、Spring Boot集成ZXing
1. 在SpringBoot项目中,我们可以通过Maven或者Gradle来引入ZXing的依赖。以Maven为例,只需要在pom.xml文件中添加如下依赖:
<dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version>
</dependency>
<dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version>
</dependency>
2. 创建一个名为QRCodeUtil的工具类,用于生成二维码和条形码,以及解析二维码。代码如下:
import com.google.zxing.*;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeWriter;
import org.springframework.stereotype.Component;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Map;@Component
public class QRCodeUtil {// 生成二维码或条形码的方法,参数分别为内容、类型、宽度、高度、图片格式(默认为PNG)和输出流(可选)public static void generate(String content, BarcodeFormat format, int width, int height, String formatName, OutputStream outputStream) throws Exception {Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 设置字符编码为UTF-8BitMatrix bitMatrix = new QRCodeWriter().encode(content, format, width, height, hints); // 生成矩阵对象BufferedImage image = toBufferedImage(bitMatrix); // 将矩阵对象转换为BufferedImage对象if (outputStream != null) { // 如果输出流不为空,则将图片写入到输出流中ImageIO.write(image, formatName, outputStream);} else { // 如果输出流为空,则返回图片的字节数组形式(Base64编码)ByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, formatName, os);return Base64.getEncoder().encodeToString(os.toByteArray());}}// 解析二维码的方法,参数为二维码的图片数据(Base64编码)和解码方式(默认为自动判断)public static String parse(String qrCodeData, DecodeHintType[] hints) throws Exception {byte[] bytes = Base64.getDecoder().decode(qrCodeData); // 将Base64编码的图片数据解码为字节数组形式ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); // 将字节数组转换为输入流对象BufferedImage image = ImageIO.read(inputStream); // 读取输入流中的图片数据,并将其转换为BufferedImage对象LuminanceSource source = new BufferedImageLuminanceSource(image); // 将BufferedImage对象转换为LuminanceSource对象,以便后续处理BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source)); // 将LuminanceSource对象转换为BinaryBitmap对象,以便后续处理Result result = new MultiFormatReader().decode(binaryBitmap, hints); // 使用多格式解码器对BinaryBitmap对象进行解码,得到结果对象Result,其中包含了解码后的内容等信息return result.getText(); // 返回解码后的内容信息(即二维码中包含的文字等)}
}
3. 测试代码生成二维码和条形码,并解析二维码的功能。代码如下:
@Test
public void testQRCode() throws Exception {// 生成二维码并保存到文件系统中(路径为/tmp/qrcode.png)QRCodeUtil.generate("Hello World!", BarcodeFormat.QR_CODE, 300, 300, "PNG", new FileOutputStream("/tmp/qrcode.png"));// 生成条形码并保存到文件系统中(路径为/tmp/barcode.png)QRCodeUtil.generate("123456789012", BarcodeFormat.EAN_13, 100, 50, "PNG", new FileOutputStream("/tmp/barcode.png"));// 从文件系统中读取二维码的图片数据(Base64编码),并解析出其中的内容信息(即文字“Hello World!”)String qrCodeContent = QRCodeUtil.parse(new File("/tmp/qrcode.png").toString(), null); // null表示使用默认的解码方式(自动判断)System.out.println("QR Code Content: " + qrCodeContent); // 输出二维码中的内容信息(即文字“Hello World!”)
}
三、结语
通过以上介绍,我们可以看到,SpringBoot与ZXing的结合非常便捷。我们可以使用ZXing提供的API轻松地生成和解析各种类型的条形码,而无需关心底层的实现细节。同时,SpringBoot也为我们提供了丰富的功能,如自动配置、依赖注入等,使得我们可以更专注于业务逻辑的开发。

相关文章:
使用SpringBoot和ZXing实现二维码生成与解析
一、ZXing简介 ZXing是一个开源的,用Java实现的多种格式的1D/2D条码图像处理库。它包含了用于解析多种格式的1D/2D条形码的工具类,目标是能够对QR编码,Data Matrix, UPC的1D条形码进行解码。在二维码编制上,ZXing巧妙地利用构成计…...
C++模板—函数模板、类模板
目录 一、函数模板 1、概念 2、格式 3、实例化 4、模板参数的匹配 二、类模板 1、定义格式 2、实例化 交换两个变量的值,针对不同类型,我们可以使用函数重载实现。 void Swap(double& left, double& right) {double tmp left;left ri…...
Monkey
一、Monkey的概念 “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人(就像猴子一样)不需要知道程序的任何用户交互方面的知识,如果给他一个程序,他就会针对他看到的界面进行操作,其操作是无目的的、乱点乱按…...
SQL中left join、right join、inner join等的区别
一张图可以简洁明了的理解出left join、right join、join、inner join的区别: 1、left join 就是“左连接”,表1左连接表2,以左为主,表示以表1为主,关联上表2的数据,查出来的结果显示左边的所有数据&#…...
算法学习—排序
排序算法 一、选择排序 1.算法简介 选择排序是一个简单直观的排序方法,它的工作原理很简单,首先从未排序序列中找到最大的元素,放到已排序序列的末尾,重复上述步骤,直到所有元素排序完毕。 2.算法描述 1ÿ…...
在Pycharm中创建项目新环境,安装Pytorch
在python项目中,很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…...
linux里source、sh、bash、./有什么区别
1、source source a.sh 在当前shell内去读取、执行a.sh,而a.sh不需要有"执行权限" source命令可以简写为"." . a.sh 注意:中间是有空格的。 2、sh/bash sh a.sh bash a.sh 都是打开一个subshell去读取、执行a.sh,而a.…...
IDEA编译器技巧-提示词忽略大小写
IDEA编译器技巧-提示词忽略大小写 写代码时,每次创建对象都要按住 Shift 字母 做大写开头, 废手, 下面通过编译器配置解放Shift 键 setting -> Editor -> General -> Code Completion -> Match case 把这个√去掉, 创建对象就不需要再按住 Shift 键 示例: 1.…...
【MySQL】MySQL安装 环境初始化
MySQL安装 MYSQL官网 安装完成后,傻瓜下一步即可 配置一下环境变量即可 (1) 初始化MySQL, 管理员身份运行 mysqld --initialize-insecure(2) 注册 mysqld mysqld -install# 如果记录以前的版本执行下面指令 mysqld -remove(3) 启动MySQL服务 // 启动mysql服务 net start …...
C# IList 与List区别二叉树的层序遍历
IList 接口: IList 是一个接口,定义了一种有序集合的通用 API。继承自 ICollection 接口和IEnumerable<T>,是所有泛型列表的基接,口它提供了对列表中元素的基本操作,如添加、删除、索引访问等。IList 不是一个具…...
助力android面试2024【面试题合集】
转眼间,2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难,那么想必找工作也不好找,在我们android开发这一行业非常的卷,在各行各业中尤为突出。android虽然不好过,但不能不吃饭吧。卷归卷但是还得干…...
【动态规划】LeetCode-62.不同路径
🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…...
对 Vision Transformers 及其基于 CNN-Transformer 的变体的综述
A survey of the Vision Transformers and its CNN-Transformer based Variants 摘要1、介绍2、vit的基本概念2.1 patch嵌入2.2 位置嵌入2.2.1 绝对位置嵌入(APE)2.2.2 相对位置嵌入(RPE)2.2.3卷积位置嵌入(CPE) 2.3 注意力机制2.3.1多头自我注意(MSA) 2.4 Transformer层2.4.1 …...
MongoDB简介
数据库,顾名思义,是保存数据的地方。中华文化博大精深,短短3个文字,就定义了一个强大的数据管理和读写方式出来。数据库,管理的对象是数据。称为库,表示数据在库中有组织,相互之间有微妙的关系。…...
尚硅谷hadoop3.x课程部分资料文件下载,jdk,hadoopjar包
jdk文件百度云下载: 链接:https://pan.baidu.com/s/1MCiGRzOZY8rAFpRJwA3tdw 提取码:kphl hadoop的jar包: 最新版官网链接: Index of /dist/hadoop/core/stable (apache.org) 百度云下载,3.3.3版…...
vue el-radio-group多选封装及使用
基于Element UI库的Vue组件,实现了一个单选/多选框组合的效果,可以根据 type 属性的不同值来切换单选框(默认)和按钮式单选框/多选框。 创建组件index.vue (src/common-ui/radioGroup/index.vue) <template><el-radio-g…...
Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19
一些原理文章 卷积神经网络基础(卷积,池化,激活,全连接) - 知乎 PyTorch 入门与实践(六)卷积神经网络进阶(DenseNet)_pytorch conv1x1_Skr.B的博客-CSDN博客GoogLeNet网…...
TPLink-Wr702N 通过OpenWrt系统打造打印服务器实现无线打印
最近淘到了一个TPLink-Wr702N路由器,而且里面已经刷机为OpenWrt系统了,刚好家里有一台老的USB打印机,就想这通过路由器将打印机改为无线打印机,一番折腾后,居然成功了,这里记录下实现过程,为后面…...
[UGUI]实现从一个道具栏拖拽一个UI道具到另一个道具栏
在Unity游戏开发中,实现UI道具的拖拽功能是一项常见的需求。本文将详细介绍如何使用Unity的UGUI系统和事件系统,实现从一个道具栏拖拽一个UI道具到另一个道具栏的功能。 一、准备工作 首先,你需要在Unity中创建两个道具栏和一些UI道具。道具…...
微服务--08--Seata XA模式 AT模式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 分布式事务Seata 1.XA模式1.1.两阶段提交1.2.Seata的XA模型1.3.优缺点 AT模式2.1.Seata的AT模型2.2.流程梳理2.3.AT与XA的区别 分布式事务 > 事务–01—CAP理论…...
智能电动汽车芯片全景解析:从MCU到SoC的技术跃迁
1. 智能电动汽车的芯片革命:从机械控制到数字大脑 十年前打开汽车引擎盖,看到的是一堆机械部件和少量电子控制单元;现在掀开一辆特斯拉的"前备箱",映入眼帘的却是布满芯片的电路板。这个直观变化背后,是汽车…...
企业级OA系统高可用方案:泛微ecology+Nginx负载均衡最佳实践
企业级OA系统高可用架构设计与实践:泛微ecologyNginxResin全栈解决方案 在数字化转型浪潮中,办公自动化系统(OA)已成为企业核心IT基础设施。作为国内领先的协同管理平台,泛微ecology承载着企业关键业务流程,其稳定性直接影响组织运…...
运动生物力学数据分析全流程dz: 运动学分析:Qualysis_Vicon动作捕捉数据处理(关节角度、角速度、重心轨迹等) 动力学分析:AMTI_Kistler测力台数据处理、逆动力学计算(关节力、力
运动生物力学数据分析全流程dz: 运动学分析:Qualysis/Vicon动作捕捉数据处理(关节角度、角速度、重心轨迹等) 动力学分析:AMTI/Kistler测力台数据处理、逆动力学计算(关节力、力矩、功率) 肌电信…...
Pixel Fashion Atelier快速上手:非对称RPG菜单布局与像素按键交互详解
Pixel Fashion Atelier快速上手:非对称RPG菜单布局与像素按键交互详解 1. 项目概览 Pixel Fashion Atelier是一款基于Stable Diffusion与Anything-v5的图像生成工作站,它彻底改变了传统AI工具的界面设计理念。这款工具将复古日系RPG游戏的"明亮城…...
Pixel Couplet Gen 社区贡献指南:在CSDN分享你的使用心得与创意
Pixel Couplet Gen 社区贡献指南:在CSDN分享你的使用心得与创意 1. 为什么要分享你的使用经验 当你成功部署并体验了Pixel Couplet Gen后,可能会发现一些独特的用法或优化技巧。把这些经验分享出来,不仅能帮助其他开发者少走弯路࿰…...
影墨·今颜GPU算力适配:RTX 4090单卡实测每秒1.8张1024x1536图
影墨今颜GPU算力适配:RTX 4090单卡实测每秒1.8张1024x1536图 1. 引言:当顶级AI影像遇上顶级显卡 如果你是一位内容创作者,或者对AI生成人像有浓厚兴趣,那么“影墨今颜”这个名字最近可能已经进入了你的视野。它被描述为一款融合…...
如何快速批量下载知网文献?CNKI-download自动化工具终极指南
如何快速批量下载知网文献?CNKI-download自动化工具终极指南 【免费下载链接】CNKI-download :frog: 知网(CNKI)文献下载及文献速览爬虫 项目地址: https://gitcode.com/gh_mirrors/cn/CNKI-download 对于学术研究者和学生来说,从知网࿰…...
【超详细】前端必备:从0到1吃透JavaScript闭包,附真实项目避坑指南
文章目录第一章 从“变量生命周期”开始,重新理解作用域链1.1 一个让新手困惑的面试题:循环中的var与let1.2 作用域链的形成:函数定义位置决定了一切第二章 闭包的工程价值:从封装到模块化2.1 数据私有化:用闭包实现真…...
GME多模态向量模型实战部署:华为云ModelArts一键启动图文检索
GME多模态向量模型实战部署:华为云ModelArts一键启动图文检索 1. 引言:多模态检索的实用价值 想象一下,你正在管理一个大型数字资产库,里面有成千上万的图片和文档。当你想找"去年会议上讨论过的那张数据流程图"时&am…...
Wan2.2-I2V-A14B:在4090显卡上快速体验专业级视频生成
Wan2.2-I2V-A14B:在4090显卡上快速体验专业级视频生成 1. 开篇:认识这款视频生成神器 你是否想过用一张普通的图片就能生成流畅的视频?Wan2.2-I2V-A14B让这个想法变成了现实。作为一款开源的视频生成模型,它能在消费级显卡上实现…...
