当前位置: 首页 > news >正文

使用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是一个开源的&#xff0c;用Java实现的多种格式的1D/2D条码图像处理库。它包含了用于解析多种格式的1D/2D条形码的工具类&#xff0c;目标是能够对QR编码&#xff0c;Data Matrix, UPC的1D条形码进行解码。在二维码编制上&#xff0c;ZXing巧妙地利用构成计…...

C++模板—函数模板、类模板

目录 一、函数模板 1、概念 2、格式 3、实例化 4、模板参数的匹配 二、类模板 1、定义格式 2、实例化 交换两个变量的值&#xff0c;针对不同类型&#xff0c;我们可以使用函数重载实现。 void Swap(double& left, double& right) {double tmp left;left ri…...

Monkey

一、Monkey的概念 “猴子测试”是指没有测试经验的人甚至对计算机根本不了解的人&#xff08;就像猴子一样&#xff09;不需要知道程序的任何用户交互方面的知识&#xff0c;如果给他一个程序&#xff0c;他就会针对他看到的界面进行操作&#xff0c;其操作是无目的的、乱点乱按…...

SQL中left join、right join、inner join等的区别

一张图可以简洁明了的理解出left join、right join、join、inner join的区别&#xff1a; 1、left join 就是“左连接”&#xff0c;表1左连接表2&#xff0c;以左为主&#xff0c;表示以表1为主&#xff0c;关联上表2的数据&#xff0c;查出来的结果显示左边的所有数据&#…...

算法学习—排序

排序算法 一、选择排序 1.算法简介 选择排序是一个简单直观的排序方法&#xff0c;它的工作原理很简单&#xff0c;首先从未排序序列中找到最大的元素&#xff0c;放到已排序序列的末尾&#xff0c;重复上述步骤&#xff0c;直到所有元素排序完毕。 2.算法描述 1&#xff…...

在Pycharm中创建项目新环境,安装Pytorch

在python项目中&#xff0c;很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…...

linux里source、sh、bash、./有什么区别

1、source source a.sh 在当前shell内去读取、执行a.sh&#xff0c;而a.sh不需要有"执行权限" source命令可以简写为"." . a.sh 注意&#xff1a;中间是有空格的。 2、sh/bash sh a.sh bash a.sh 都是打开一个subshell去读取、执行a.sh&#xff0c;而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 接口&#xff1a; IList 是一个接口&#xff0c;定义了一种有序集合的通用 API。继承自 ICollection 接口和IEnumerable<T>&#xff0c;是所有泛型列表的基接&#xff0c;口它提供了对列表中元素的基本操作&#xff0c;如添加、删除、索引访问等。IList 不是一个具…...

助力android面试2024【面试题合集】

转眼间&#xff0c;2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难&#xff0c;那么想必找工作也不好找&#xff0c;在我们android开发这一行业非常的卷&#xff0c;在各行各业中尤为突出。android虽然不好过&#xff0c;但不能不吃饭吧。卷归卷但是还得干…...

【动态规划】LeetCode-62.不同路径

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…...

对 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简介

数据库&#xff0c;顾名思义&#xff0c;是保存数据的地方。中华文化博大精深&#xff0c;短短3个文字&#xff0c;就定义了一个强大的数据管理和读写方式出来。数据库&#xff0c;管理的对象是数据。称为库&#xff0c;表示数据在库中有组织&#xff0c;相互之间有微妙的关系。…...

尚硅谷hadoop3.x课程部分资料文件下载,jdk,hadoopjar包

jdk文件百度云下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1MCiGRzOZY8rAFpRJwA3tdw 提取码&#xff1a;kphl hadoop的jar包&#xff1a; 最新版官网链接&#xff1a; Index of /dist/hadoop/core/stable (apache.org) 百度云下载&#xff0c;3.3.3版&#xf…...

vue el-radio-group多选封装及使用

基于Element UI库的Vue组件&#xff0c;实现了一个单选/多选框组合的效果&#xff0c;可以根据 type 属性的不同值来切换单选框&#xff08;默认&#xff09;和按钮式单选框/多选框。 创建组件index.vue (src/common-ui/radioGroup/index.vue) <template><el-radio-g…...

Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19

一些原理文章 卷积神经网络基础&#xff08;卷积&#xff0c;池化&#xff0c;激活&#xff0c;全连接&#xff09; - 知乎 PyTorch 入门与实践&#xff08;六&#xff09;卷积神经网络进阶&#xff08;DenseNet&#xff09;_pytorch conv1x1_Skr.B的博客-CSDN博客GoogLeNet网…...

TPLink-Wr702N 通过OpenWrt系统打造打印服务器实现无线打印

最近淘到了一个TPLink-Wr702N路由器&#xff0c;而且里面已经刷机为OpenWrt系统了&#xff0c;刚好家里有一台老的USB打印机&#xff0c;就想这通过路由器将打印机改为无线打印机&#xff0c;一番折腾后&#xff0c;居然成功了&#xff0c;这里记录下实现过程&#xff0c;为后面…...

[UGUI]实现从一个道具栏拖拽一个UI道具到另一个道具栏

在Unity游戏开发中&#xff0c;实现UI道具的拖拽功能是一项常见的需求。本文将详细介绍如何使用Unity的UGUI系统和事件系统&#xff0c;实现从一个道具栏拖拽一个UI道具到另一个道具栏的功能。 一、准备工作 首先&#xff0c;你需要在Unity中创建两个道具栏和一些UI道具。道具…...

微服务--08--Seata XA模式 AT模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 分布式事务Seata 1.XA模式1.1.两阶段提交1.2.Seata的XA模型1.3.优缺点 AT模式2.1.Seata的AT模型2.2.流程梳理2.3.AT与XA的区别 分布式事务 > 事务–01—CAP理论…...

沥青生产导向的常减压过程模拟及排产计划优化【附仿真】

✨ 长期致力于沥青生产、多目标优化、遗传算法、排产、换热网络综合、粒子群算法研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;原油实沸点切割与沥青…...

pubnub代码示例

import time from pubnub.pnconfiguration import PNConfiguration from pubnub.pubnub import PubNub, SubscribeListener from pubnub.exceptions import PubNubExceptionpublish_key=pub-c-fab-b05a-c355bb3adac5 subscribe_key=sub...

从被动响应到主动行动:AI Agent的自主性革命

从被动响应到主动行动:AI Agent的自主性革命 标题选项 《从被动响应到主动行动:AI Agent如何开启下一代人工智能的自主性革命》 《告别“一问一答”:拆解AI Agent的自主决策逻辑,看懂下一代AI的核心方向》 《从ChatGPT到自主Agent:人工智能的下一个拐点,到底革了谁的命?…...

article-extractor项目架构解析:模块化设计与可扩展性指南

article-extractor项目架构解析&#xff1a;模块化设计与可扩展性指南 【免费下载链接】article-extractor To extract main article from given URL with Node.js 项目地址: https://gitcode.com/gh_mirrors/ar/article-extractor article-extractor是一个强大的Node.j…...

如何安全提取未知文件:unblob的5大安全防护机制实战指南

如何安全提取未知文件&#xff1a;unblob的5大安全防护机制实战指南 【免费下载链接】unblob Extract files from any kind of container formats 项目地址: https://gitcode.com/gh_mirrors/un/unblob 在数字取证和固件分析工作中&#xff0c;我们经常需要处理来源不明…...

以灵活测试方案打造共享实验室,强化槟城IC设计生态系统

益莱储&#xff08;Electro Rent&#xff09; InvestPenang&#xff5c;IC 设计验证与特性表征共享实验室马来西亚槟城正积极推进其成为亚洲领先的半导体枢纽。在 InvestPenang 主导的「Penang Silicon Design 5KM&#xff08;PSD5KM&#xff09;」计划下&#xff0c;全新的 I…...

ncmdumpGUI:3分钟解锁网易云音乐NCM加密文件,让音乐自由流动

ncmdumpGUI&#xff1a;3分钟解锁网易云音乐NCM加密文件&#xff0c;让音乐自由流动 【免费下载链接】ncmdumpGUI C#版本网易云音乐ncm文件格式转换&#xff0c;Windows图形界面版本 项目地址: https://gitcode.com/gh_mirrors/nc/ncmdumpGUI 当智能音箱对你说"不…...

做网安的这几年,挖漏洞接私活赚的是我工资的3倍,这些门道没几人知道

前言 这是我做网络安全工程师&#xff08;简称网安&#xff09;的第9个年头&#xff0c;从我工作的第3年起&#xff0c;我就一直在开始尝试去接网安方面的私活&#xff0c;这6年平均下来&#xff0c;我接私活赚的钱几乎是我工资的3倍。 而很多人要么不敢去做&#xff0c;要么就…...

从零开始:用严恭敏老师的PSINS工具箱搞定SINS/GPS组合导航(附完整代码流程)

从零开始&#xff1a;用严恭敏老师的PSINS工具箱实现SINS/GPS组合导航实战指南 1. 初识PSINS工具箱&#xff1a;导航算法开发的瑞士军刀 在惯性导航与组合导航领域&#xff0c;严恭敏教授团队开发的PSINS&#xff08;Precise Strapdown Inertial Navigation System&#xff0…...

不用命令行!OpenClaw 2.7.5 Win11 专属部署,双击直达本地 AI 助手

前言 本教程专为Windows用户设计&#xff0c;提供可视化部署方案。通过专用部署包实现全程图形化操作&#xff0c;彻底告别命令行和手动配置环境。即使是零基础用户也能轻松完成部署&#xff0c;快速搭建专属数字员工系统&#xff0c;显著提升工作效率。教程完美适配Windows 1…...