Java中使用ZXing和QRCode生成二維碼的示例詳解
1. 基本知識(shí)
生成二維碼在Java中有多種方法,常用的是通過(guò)第三方庫(kù)來(lái)實(shí)現(xiàn),比較流行的庫(kù)包括 ZXing (Zebra Crossing) 和 QRCode
ZXing庫(kù)中的核心API
MultiFormatWriter.encode()
:生成二維碼矩陣MatrixToImageWriter.writeToPath()
:將二維碼矩陣保存為圖片文件
QRCode庫(kù)中的核心API
- QRCode.from(content):從內(nèi)容生成二維碼
- withSize(width, height):設(shè)置二維碼的尺寸
- file():生成二維碼并保存為圖片文件
ZXing庫(kù)功能強(qiáng)大,適合生成復(fù)雜的二維碼且提供了細(xì)粒度的控制
QRCode庫(kù)使用簡(jiǎn)單,快速生成二維碼,適合基礎(chǔ)需求
二維碼是一種將信息編碼為二維圖形的技術(shù),常用于存儲(chǔ)URL、文本、數(shù)字等信息。它由黑白模塊組成,通??梢酝ㄟ^(guò)掃描來(lái)解碼
生成二維碼的過(guò)程主要分為兩個(gè)步驟:
- 編碼:將需要存儲(chǔ)的信息(如URL、文本等)編碼為二維碼的黑白模塊
- 繪制:根據(jù)編碼信息繪制出二維碼圖像,通常可以保存為PNG、JPG等格式
使用ZXing生成二維碼 ZXing是最常用的Java二維碼生成庫(kù),支持多種格式(例如二維碼、條形碼)
其核心類(lèi)包括:
MultiFormatWriter
:用于生成二維碼的核心類(lèi)BitMatrix
:二維碼的矩陣表示,用于保存黑白模塊的分布MatrixToImageWriter
:將二維碼矩陣轉(zhuǎn)化為圖片
二維碼的參數(shù)設(shè)置
- 寬度和高度:二維碼圖片的尺寸,通常是正方形
- 編碼字符集:通常使用UTF-8編碼,確保支持中文等特殊字符
- 錯(cuò)誤糾正級(jí)別:二維碼的容錯(cuò)能力,可以通過(guò)調(diào)整糾錯(cuò)級(jí)別提高二維碼的魯棒性
2. ZXing
依賴(lài)庫(kù)配置(Maven項(xiàng)目)
在Maven項(xiàng)目中,需要在pom.xml中添加ZXing的依賴(lài):
<dependencies> <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> </dependencies>
Demo如下:
import com.google.zxing.BarcodeFormat; import com.google.zxing.Writer; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.QRCodeWriter; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class QRCodeGenerator { public static void main(String[] args) { // 要編碼的文本 String data = "Hello, QR Code!"; // 生成的二維碼圖片文件路徑 String filePath = "qrcode.png"; try { // 調(diào)用生成二維碼的方法 generateQRCodeImage(data, 300, 300, filePath); System.out.println("二維碼生成成功!"); } catch (WriterException | IOException e) { e.printStackTrace(); } } /** * 生成二維碼圖像并保存到文件 * * @param text 要編碼的文本 * @param width 圖像寬度 * @param height 圖像高度 * @param filePath 保存文件路徑 * @throws WriterException 生成二維碼異常 * @throws IOException IO異常 */ private static void generateQRCodeImage(String text, int width, int height, String filePath) throws WriterException, IOException { // 創(chuàng)建 QRCodeWriter 實(shí)例 QRCodeWriter qrCodeWriter = new QRCodeWriter(); // 生成 BitMatrix,表示二維碼的黑白矩陣 BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height); // 創(chuàng)建一個(gè) BufferedImage,用于繪制圖像 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); image.createGraphics(); // 獲取圖形上下文 Graphics2D graphics = (Graphics2D) image.getGraphics(); // 設(shè)置背景色為白色 graphics.setColor(Color.WHITE); graphics.fillRect(0, 0, width, height); // 設(shè)置前景色為黑色 graphics.setColor(Color.BLACK); // 在圖像上繪制二維碼的黑色矩陣 for (int i = 0; i < width; i++) { for (int j = 0; j < height; j++) { if (bitMatrix.get(i, j)) { // 如果當(dāng)前位置為黑色,填充一個(gè)像素 graphics.fillRect(i, j, 1, 1); } } } // 將圖像保存為 PNG 文件 ImageIO.write(image, "png", new File(filePath)); } }
截圖如下:
另外一個(gè)Demo:
import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.client.j2se.MatrixToImageWriter; import java.nio.file.Path; import java.nio.file.Paths; import java.util.HashMap; import java.util.Map; public class QRCodeGenerator { /** * 生成二維碼 * @param content 二維碼中包含的內(nèi)容,如URL或文本 * @param width 二維碼的寬度 * @param height 二維碼的高度 * @param filePath 保存二維碼圖片的路徑 * @throws Exception 可能拋出的異常 */ public static void generateQRCode(String content, int width, int height, String filePath) throws Exception { // 定義二維碼的參數(shù) Map<EncodeHintType, Object> hints = new HashMap<>(); // 設(shè)置編碼字符集 hints.put(EncodeHintType.CHARACTER_SET, "UTF-8"); // 設(shè)置二維碼的容錯(cuò)級(jí)別,較高容錯(cuò)級(jí)別適合損壞或部分覆蓋的二維碼 hints.put(EncodeHintType.ERROR_CORRECTION, com.google.zxing.qrcode.decoder.ErrorCorrectionLevel.H); // 生成二維碼的BitMatrix(二維碼的矩陣表示) BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints); // 將二維碼矩陣保存為圖片文件 Path path = Paths.get(filePath); MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path); System.out.println("二維碼已成功生成,保存路徑: " + filePath); } public static void main(String[] args) { try { // 生成二維碼的內(nèi)容 String content = "https://www.example.com"; // 設(shè)置二維碼的寬度和高度 int width = 300; int height = 300; // 保存二維碼圖片的路徑 String filePath = "qr_code.png"; // 調(diào)用生成二維碼方法 generateQRCode(content, width, height, filePath); } catch (Exception e) { e.printStackTrace(); } } }
3. QRCode
QRGen JavaSE » 3.0.1的xml依賴(lài)包
在Maven項(xiàng)目中,需要在pom.xml中添加QRCode的依賴(lài):
以上就是Java中使用ZXing和QRCode生成二維碼的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java ZXing和QRCode生成二維碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java8優(yōu)雅的字符串拼接工具類(lèi)StringJoiner實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Java8優(yōu)雅的字符串拼接工具類(lèi)StringJoiner的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02如何自定義Mybatis-Plus分布式ID生成器(解決ID長(zhǎng)度超過(guò)JavaScript整數(shù)安全范圍問(wèn)題)
MyBatis-Plus默認(rèn)生成的是 64bit 長(zhǎng)整型,而 JS 的 Number 類(lèi)型精度最高只有 53bit,這篇文章主要介紹了如何自定義Mybatis-Plus分布式ID生成器(解決ID長(zhǎng)度超過(guò)JavaScript整數(shù)安全范圍問(wèn)題),需要的朋友可以參考下2024-08-08Java實(shí)現(xiàn)快速排序和堆排序的示例代碼
這篇文章主要為大家詳細(xì)介紹了快速排序和堆排序的多種語(yǔ)言的實(shí)現(xiàn)(JavaScript、Python、Go語(yǔ)言、Java、C++),感興趣的小伙伴可以了解一下2022-12-12淺析SpringCloud Alibaba-Nacos 作為注冊(cè)中心示例代碼
這篇文章主要介紹了SpringCloud Alibaba-Nacos 作為注冊(cè)中心示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)
這篇文章主要介紹了Java調(diào)用接口如何獲取json數(shù)據(jù)解析后保存到數(shù)據(jù)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03解決復(fù)制springboot項(xiàng)目后,啟動(dòng)日志無(wú)顏色的問(wèn)題
這篇文章主要介紹了解決復(fù)制springboot項(xiàng)目后,啟動(dòng)日志無(wú)顏色的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07JAVA Iterator 轉(zhuǎn)成 List 的操作
這篇文章主要介紹了JAVA Iterator 轉(zhuǎn)成 List 的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12SpringSecurity+Redis+Jwt實(shí)現(xiàn)用戶(hù)認(rèn)證授權(quán)
SpringSecurity是一個(gè)強(qiáng)大且靈活的身份驗(yàn)證和訪(fǎng)問(wèn)控制框架,本文主要介紹了SpringSecurity+Redis+Jwt實(shí)現(xiàn)用戶(hù)認(rèn)證授權(quán),具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07SpringCloud分布式項(xiàng)目下feign的使用示例詳解
這篇文章主要介紹了SpringCloud分布式項(xiàng)目下feign的使用,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07