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.pswp.cn/news/713435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713435.shtml
英文地址,請注明出處:http://en.pswp.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…