Java实战:SpringBoot集成ZXing实现二维码生成与解析

一、引言

在信息化社会,二维码已经深入到生活的各个角落,无论是支付、营销、信息传递,甚至防伪溯源,二维码都发挥了至关重要的作用。作为Java开发者,我们如何在SpringBoot项目中便捷地实现二维码的生成与解析呢?本文将详细介绍如何利用ZXing库在SpringBoot中集成二维码功能,通过详尽的代码示例和原理解析,帮助您深入了解并掌握这一实用技术。

二、ZXing库简介

ZXing(Zebra Crossing,斑马线)是一个开源的、多语言实现的1D/2D条码图像处理库,它包含了生成和解析条形码(包括二维码)所需的一切。在Java中,我们可以利用ZXing的API轻易地实现二维码的生成与解析。

三、SpringBoot集成ZXing

  1. 添加Maven依赖

在SpringBoot项目的pom.xml中引入ZXing的Java核心库依赖:

<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>
  1. 二维码生成

下面是一个简单的二维码生成示例,使用QRCodeWriter类创建二维码,并使用MatrixToImageWriter将其转换为图片输出:

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.google.zxing.client.j2se.MatrixToImageWriter;import javax.imageio.ImageIO;
import java.io.File;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;public class QRCodeGenerator {public void generateQRCode(String data, String filePath) throws Exception {// 创建参数对象,设定纠错等级Map<EncodeHintType, ErrorCorrectionLevel> hints = new HashMap<>();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.L);// 创建二维码写入器,并生成BitMatrixQRCodeWriter qrCodeWriter = new QRCodeWriter();BitMatrix bitMatrix = qrCodeWriter.encode(data, BarcodeFormat.QR_CODE, 300, 300, hints);// 将BitMatrix转换为图片并输出到指定路径Path path = Paths.get(filePath);MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path.toFile());// 可选:读取生成的二维码图片并进行其他操作File outputFile = new File(filePath);BufferedImage bufferedImage = ImageIO.read(outputFile);// ...}
}
  1. 二维码解析

同样,ZXing提供了MultiFormatReader类用于解析二维码:

import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.common.HybridBinarizer;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;public class QRCodeDecoder {public String decodeQRCode(String filePath) throws Exception {// 加载图片文件BufferedImage image = ImageIO.read(new File(filePath));// 创建二值化图像BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);HybridBinarizer binarizer = new HybridBinarizer(source);BinaryBitmap bitmap = new BinaryBitmap(binarizer);// 创建多格式解码器并解码MultiFormatReader multiFormatReader = new MultiFormatReader();Result result;try {result = multiFormatReader.decode(bitmap);return result.getText();} catch (NotFoundException e) {throw new RuntimeException("二维码未找到或无法解码");}}
}

四、集成至SpringBoot应用

在SpringBoot项目中,可以将二维码生成与解析功能封装为服务,供其他模块调用。同时,也可以结合Spring MVC,将二维码生成接口暴露为RESTful API,以便前端或其他服务调用生成二维码。

  1. 配置Bean
    为了方便在SpringBoot应用中全局访问和管理二维码生成与解析的功能,我们可以将上述QRCodeGeneratorQRCodeDecoder类注册为Spring Bean。在@Configuration类中注入它们:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class QRCodeConfig {@Beanpublic QRCodeGenerator qrCodeGenerator() {return new QRCodeGenerator();}@Beanpublic QRCodeDecoder qrCodeDecoder() {return new QRCodeDecoder();}
}
  1. RESTful API设计
    在Spring Boot应用中,我们可以设计一个RESTful API来对外提供二维码生成服务。例如,在一个@RestController中编写方法:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.ResponseEntity;@RestController
public class QRCodeController {private final QRCodeGenerator qrCodeGenerator;@Autowiredpublic QRCodeController(QRCodeGenerator qrCodeGenerator) {this.qrCodeGenerator = qrCodeGenerator;}@PostMapping("/generate-qr-code")public ResponseEntity<FileSystemResource> generateQRCode(@RequestParam String content) throws Exception {// 生成临时文件路径String filePath = "/tmp/qr_code_" + System.currentTimeMillis() + ".png";// 调用生成器生成二维码并保存到文件qrCodeGenerator.generateQRCode(content, filePath);// 返回生成的二维码图片资源FileSystemResource file = new FileSystemResource(new File(filePath));return ResponseEntity.ok().header("Content-Type", "image/png").body(file);}// 对于二维码解析,也可设计类似的POST请求接收图片文件并返回解析结果// ...
}
  1. 异常处理与日志记录
    确保在二维码生成和解析过程中捕获可能抛出的异常,比如文件读写错误、二维码无法识别等情况,并妥善记录错误日志。这可以通过Spring Boot的全局异常处理器或@ControllerAdvice注解实现。

五、进阶应用

  1. 自定义样式:ZXing提供了自定义二维码样式的能力,如颜色、边框宽度、中间logo等。

  2. 二维码嵌入Logo:可以将公司Logo或其他图标嵌入二维码中央,提升品牌形象。

  3. 结合数据库存储与读取:将待生成或解析的二维码数据与数据库关联,实现数据的持久化与追踪。

六、总结

通过集成ZXing库,SpringBoot应用可以轻松实现二维码的生成与解析功能,大大提升了开发效率和应用的实用性。随着技术的发展,二维码的应用场景越来越广泛,开发者应熟练掌握这一技术,以便在实际项目中灵活运用,提升产品的用户体验与功能性。希望本文能为您在二维码技术的道路上点亮一盏灯,助您在实践中游刃有余。

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

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

相关文章

4、Redis-Set【常用】

目录 一、Redis-Set特点 二、常用命令与交并差 三、Redis中Set类型应用场景 一、Redis-Set特点 1、无序&#xff1a;添加的是A,B,C&#xff1b;取出的可能是B,A,C 2、唯一&#xff1a;不允许元素重复 二、常用命令与交并差 常用命令 格式含义例子sadd key members[...]往k…

吴恩达机器学习笔记十四 多输出的分类 多类和多标签的区别 梯度下降优化 卷积层

这里老师想讲的是multiclass classification和multilable classification的区别&#xff0c;下面是我从其他地方找到的说法: Multiclass classification 多类分类 意味着一个分类任务需要对多于两个类的数据进行分类。比如&#xff0c;对一系列的橘子&#xff0c;苹果或者梨的…

Stable Diffusion生成式扩散模型代码实现原理

Stable Diffusion可以使用PyTorch或TensorFlow等深度学习框架来实现。这些框架提供了一系列的工具和函数&#xff0c;使得开发者可以更方便地构建、训练和部署深度学习模型。因此可以使用PyTorch或TensorFlow来实现Stable Diffusion模型。 安装PyTorch&#xff1a;确保您已经安…

Linux命令行与shell脚本编程大全-2.2

第二部分 shell脚本编程基础 第11章构建基础脚本 第12章结构化命令 第13章更多的结构化命令 第14章处理用户输入 第15章呈现数据 第16章脚本控制 第15章 呈现数据 15.1 理解输入和输出 15.1.1 标准文件描述符 Linux 系统会将每个对象当作文件来处理&#xff0c;这包括输入和…

T3SF:一款功能全面的桌面端技术练习模拟框架

关于T3SF T3SF是一款功能全面的桌面端技术练习模拟框架&#xff0c;该工具针对基于主场景事件列表的各种事件提供了模块化的架构&#xff0c;并包含了针对每一个练习定义的规则集&#xff0c;以及允许为对应平台参数定义参数的配置文件。 该工具的主模块能够执行与其他特定模…

CDN原理探究

来源于百度&#xff1a; https://baike.baidu.com/item/%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C/4034265?frge_ala 通过上图&#xff0c;我们可以了解到&#xff0c;使用了CDN缓存后的网站的访问过程变为&#xff1a; 用户向浏览器提供要访问的域名&#xff…

幻兽帕鲁/Palworld服务器的最佳网络设置、内存和CPU配置是什么?

幻兽帕鲁/Palworld服务器的最佳网络设置、内存和CPU配置是什么&#xff1f; 对于4到8人的玩家&#xff0c;推荐的配置是4核16G的CPU和16G的内存。10到20人的玩家选择8核32G的CPU和32G或以上的内存。2到4人的玩家则建议选择4核8G的CPU和8G的内存。对于32人的玩家&#xff0c;推…

YOLOV8介绍

原文链接&#xff1a; 1、 详解YOLOv8网络结构/环境搭建/数据集获取/训练/推理/验证/导出 2、Yolov8的详解与实战 3、YOLOV8模型训练部署&#xff08;实战&#xff09;&#xff08;&#xff09;有具体部署和训练实现代码YOLOV8模型训练部署&#xff08;实战&#xff09;&…

Mybatis plus核心功能-IService

目录 1 前言 2 使用方法 2.1 继承ServiceImpl,> 2.2 基础业务开发的使用 2.3 复杂业务开发的使用 2.3 Lambda查询 2.4 Lambda更新 1 前言 我本以为Mapper层的类能够继承BaseMapper<XXX>&#xff0c;而不用我们手动写一些mapper方法已经够离谱了。没想到海油膏…

linux上pip3 install torch==1.11和pip3 install torch==1.11+cu115区别

在linux上安装torch时&#xff0c; 如果环境安装好了CUDA环境&#xff0c; 那么安装torch时不用刻意指定带cuda的版本&#xff0c; 最终安装的也是支持GPU的torch版本。但是仍然有一些小的区别&#xff0c;主要就是支持CUDA版本的不同。 (leo_py37) pinefieldedge-gpu-01:/dat…

Gradle构建项目

1.自己下载对应的gradle版本到本地。 2.maven国内镜像&#xff08;settings.gradle中进行配置&#xff09; // google()maven { url https://maven.aliyun.com/repository/public/ }maven { url https://maven.aliyun.com/repository/google/}maven { url https://maven.aliyu…

【机器学习300问】25、常见的模型评估指标有哪些?

模型除了从数据划分的角度来评估&#xff0c;我上一篇文章介绍了数据集划分的角度&#xff1a; 【机器学习300问】24、模型评估的常见方法有哪些&#xff1f;http://t.csdnimg.cn/LRyEt 还可以从一些指标的角度来评估&#xff0c;这篇文章就带大家从两个最经典的任务场景介绍…

Day08:基础入门-算法分析传输加密数据格式密文存储代码混淆逆向保护

目录 传输数据-编码型&加密型等 传输格式-常规&JSON&XML等 密码存储-Web&系统&三方应用 代码混淆-源代码加密&逆向保护 思维导图 章节知识点&#xff1a; 应用架构&#xff1a;Web/APP/云应用/三方服务/负载均衡等 安全产品&#xff1a;CDN/WAF/I…

【stata】渐进式双重差分/交错式双重差分(staggered-DID) 实现过程

Staggered-DID 的实现 为保证本贴的简洁性与一般适用性,本文并没有使用现有真实数据,而是模拟了一个一般数据。如果你手中有正在处理好的project数据,可以跳过1.数据生成,直接从2.数据预加工开始。 1.数据生成 (1)数据生成过程 我将随机生成一个数据来模拟staggered-DID…

leetcode 热题 100_移动零

题解一&#xff1a; 双指针遍历&#xff1a;将非零的值往数组前端依次放置&#xff0c;将放置之后数组后端多余的位置都置为0&#xff0c;参考下图&#xff08;来源. - 力扣&#xff08;LeetCode&#xff09;&#xff09; class Solution {public void moveZeroes(int[] nums)…

c语言的数据结构:队列

1.队列存在的实现方式及其存在意义 1.1为什么队列使用单链表实现更好 动态内存分配&#xff1a;链表在C语言中通常使用动态内存分配&#xff0c;这意味着可以在运行时根据需要动态地添加或删除节点。这对于实现一个动态大小的队列非常有用&#xff0c;因为队列的大小可以在运…

界面控件Telerik UI for ASP. NET Core教程 - 如何为网格添加上下文菜单?

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集&#xff0c;拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格&#xff0c;提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 上下文菜单允许开发者为应…

[unity] c# 扩展知识点其一 【个人复习笔记/有不足之处欢迎斧正/侵删】

.NET 微软的.Net既不是编程语言也不是框架,是类似于互联网时代、次时代、21世纪、信息时代之类的宣传口号,是一整套技术体系的统称&#xff0c;或者说是微软提供的技术平台的代号. 1.跨语言 只要是面向.NET平台的编程语言(C#、VB、 C、 F#等等)&#xff0c;用其中一种语言编写…

带着问题阅读源码——Spring MVC是如何将url注册到RequestMappingHandlerMapping?

背景 在 Spring MVC 中&#xff0c;DispatcherServlet 是前端控制器&#xff08;front controller&#xff09;&#xff0c;它负责接收所有的 HTTP 请求并将它们映射到相应的处理器&#xff08;handler&#xff09;。为了实现这一点&#xff0c;Spring MVC 使用了适配器模式将…

大街款商城项目03-微服务之间调用

目录 RestTemplate OpenFeign 1.引入依赖open-feign 2.声明要调用的服务和接口 3.注入FeignClient启用 4验证 RestTemplate 在微服务架构中&#xff0c;使用RestTemplate是一种常见的方式进行服务间的HTTP通信。以下是一个简单的示例&#xff0c;演示如何使用RestTempla…