使用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也为我们提供了丰富的功能,如自动配置、依赖注入等,使得我们可以更专注于业务逻辑的开发。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/189263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

系列十四、SpringBoot的jar包可以直接运行原理分析

一、普通jar包运行 vs SpringBoot jar包运行 1.1、普通jar包运行 general-test-1.0-SNAPSHOT.jar是位于D盘的一个普通的jar包&#xff0c;是idea中一个普通的maven项目通过package打包生成&#xff0c;为了方便测试我把它拷贝到D盘了。 java -jar general-test-1.0-SNAPSHOT.j…

springboot虚拟请求——测试

springboot虚拟请求 表现层测试 web环境模拟测试 虚拟请求状态匹配——执行状态的匹配 Testvoid testStatus(Autowired MockMvc mvc) throws Exception { // //http://localhost:8080/books// 创建一个虚拟请求&#xff0c;当前访问的是booksMockHttpServletRequestBui…

不会代码(零基础)学语音开发(学习工具)

学习&#xff0c;要选择适合自己的&#xff0c;好的学习工具至关重要。就像读书&#xff0c;要读好书一样。 自己不会选&#xff0c;可以参考前辈&#xff0c;找chatgpt等来帮忙。充分利用好周边的资源。 秉承着GPT和前辈们的经验之谈&#xff0c;开始选择语音开发产品&#…

localStorage 和sessionStorage

localStorage 和 sessionStorage 是浏览器提供的两种客户端存储数据的方式&#xff1a; 生命周期&#xff1a; localStorage&#xff1a; 存储在 localStorage 中的数据在浏览器关闭后仍然保留&#xff0c;直到被显式删除或浏览器清除缓存。sessionStorage&#xff1a; 存储在 …

操作系统-输入输出管理

I/O设备的基本概念和分类 I/O就是输入/输出 I/O设备就是可以将数据输入到计算机&#xff0c;或者可以接收计算机输出数据的外部设备&#xff0c;属于计算机中的硬件部件。 I/O设备按使用特性分类 人机交互类外部设备存储设备网络通信设备 I/O设备按传输速率分类 低速设备中…

uniapp-距离distance数字太长,截取保留前3为数字

1.需求 将接口返回的距离的字段&#xff0c;保留三位数显示。 2.实现效果 3.代码&#xff1a; 1.这是接口返回的数据&#xff1a; 2.调取接口&#xff0c;赋值前先处理每条数据的distance <view class"left">距你{{item.distance}}km</view>listFun() …

聚焦数据库Serverless创新,就在2023亚马逊云科技re:Invent

11月28日&#xff0c;亚马逊云科技在其最新的re:Invent 2023大会上宣布了三项重要的serverless创新&#xff0c;这些创新将极大地简化客户在任何规模上分析和管理数据的能力。以下是这些发布的主要要点总结和分析。 Amazon Aurora Limitless Database的新功能&#xff1a; 功能…

播放器开发(七):音视频同步实现

目录 学习课题&#xff1a;逐步构建开发播放器【QT5 FFmpeg6 SDL2】 原理 简单分析&#xff1a; 下图简单描述了在一个播放过程中&#xff0c;假设我们先播放音频&#xff0c;对比一个公共时间轴&#xff0c;视频就会始终比音频慢0.003s。 我们在日常中用一些播放器播放视频…

docker-compose脚本编写及常用命令

安装 linux DOCKER_CONFIG/usr/local/lib/docker/cli-plugins sudo mkdir -p $DOCKER_CONFIG/cli-plugins sudo curl -SL https://521github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose sudo c…

附录A 指令集基本原理

1. 引言 本书主要关注指令集体系结构4个主题&#xff1a; 1. 提出对指令集进行分类的方法&#xff0c;并对各种方法的优缺点进行定性评估&#xff1b; 2. 提出并分析一些在很大程度上独立于特定指令集的指令集评估数据。 3. 讨论语言与编译器议题以及…

shell编程系列(9)-使用cut选择列

文章目录 前言使用cut选择列选择特定的列 结语 前言 前面的文章介绍了sed命令&#xff0c;sed可以帮我们处理文本列&#xff0c;这边文章介绍cut命令&#xff0c;cut命令可以帮我们选择想要的列&#xff0c;在文本处理时候结合sed命令&#xff0c;就可以精准定位了。 cut命令是…

利用 NRF24L01 无线收发模块实现传感器数据的无线传输

NRF24L01 是一款常用的无线收发模块&#xff0c;适用于远程控制和数据传输应用。本文将介绍如何利用 NRF24L01 模块实现传感器数据的无线传输&#xff0c;包括硬件的连接和配置&#xff0c;以及相应的代码示例。 一、引言 NRF24L01 是一款基于 2.4GHz 射频通信的低功耗无线收发…

如何使用windows Terminal终端连接远程Linux服务器

近接触到了zsh这个shell&#xff0c;所以在ubuntu系统上反复折腾&#xff0c;终于在ubuntu-desktop系统上使用oh-my-zsh和powerlevel10k配置好了一个比较好看的终端&#xff08;个人认为挺好看&#xff0c;勿喷&#xff09;。 但是在从windwos的Mobaxterm登录ubuntu查看时&…

无人机助力电力设备螺母缺销智能检测识别,python基于YOLOv5开发构建电力设备螺母缺销小目标检测识别系统

传统作业场景下电力设备的运维和维护都是人工来完成的&#xff0c;随着现代技术科技手段的不断发展&#xff0c;基于无人机航拍飞行的自动智能化电力设备问题检测成为了一种可行的手段&#xff0c;本文的核心内容就是基于YOLOv7来开发构建电力设备螺母缺销检测识别系统&#xf…

从自动化、数字化到智能化,鸿蒙与制造业的双向奔赴

终端万物互联&#xff0c;商业竞争瞬息万变&#xff0c;制造企业面临着数字化转型与产品智能化升级的双重考验。鸿蒙操作系统以统一操作系统方案&#xff0c;可以为制造企业解决设备生态碎片化以及跨终端对接问题&#xff0c;提供安全性、流畅度、多屏协同等功能&#xff0c;实…

Mybatis 的操作(续集)

Mybatis 是一款优秀的 持久性 框架,用于简化 JDBC 的开发 持久层 : 指的就是持久化操作的层,通常指数据访问层(dao),是用来操作数据库的 简单来说 Mybatis 是更简单完成程序和数据库交互的框架 Mybatis 的写法有两种 : 1.xml 2.注解 这两者各有利弊,后面进行总结 Mybati…

pixhawk在树莓派上直接烧录固件

环境 树莓派4Bubuntu20.04 pixhawk2.4.8 执行 在ardupilo根目录下敲指令 ./waf configure --board fmuv3 ./waf sub ./waf --targets bin/adusub --upload过程 pixhawk通过usb接入树莓派中&#xff0c;在烧录过程如果出现以下情况则需要拔插usb线 会擦除原有固件&#xf…

【详细版】基于AWS EC2使用Docker安装部署Superset v2.0

文章目录 1. SuperSet介绍2. 实验说明3. 实验配置4. SSH连接云实例5. 系统版本查看6. 主机名映射7. Docker安装[可选] Docker Compose安装8. 安装superset9. 初始化superset容器10. 为superset加入连接Athena需要的依赖11. 为superset准备一个具有权限的IAM用户12. 添加此IAM用…

ESP32-Web-Server编程- 通过滑动条向 Web 提交数据

ESP32-Web-Server编程- 通过滑动条向 Web 提交数据 概述 上一节我们讲述了通过文本框向 ESP32 发送字符串、数字。有时&#xff0c;我们需要向 ESP32 发送连续的值&#xff0c;这种需求可以通过在网页端实现滑动条来实现。 需求及功能解析 本节演示如何在 ESP32 上部署一个…

Spring @Cacheable缓存注解

一、简介 缓存介绍 缓存&#xff0c;在我们的日常开发中用的非常多&#xff0c;是我们应对各种性能问题支持高并发的一大利器。 Spring 从 3.1 开始就引入了缓存的支持。定义了如下两个接口来统一支持不同的缓存技术。 org.springframework.cache.Cacheorg.springframework.ca…