Java實(shí)現(xiàn)二維碼、條形碼功能(案例代碼)
一、Zxing介紹
ZXing是一個(gè)開放源碼的,用Java實(shí)現(xiàn)的多種格式的1D/2D條碼圖像處理庫(kù),它包含了聯(lián)系到其他語(yǔ)言的端口。Zxing可以實(shí)現(xiàn)使用手機(jī)的內(nèi)置的攝像頭完成條形碼的掃描及解碼。
二、關(guān)鍵類及方法說(shuō)明
Zxing將生成圖形編碼的方式抽象成了一個(gè)類com.google.zxing.Writer
, 在實(shí)現(xiàn)類中不僅僅生成二維碼,還可以生成條形碼等其他圖形編碼。
我們實(shí)際開發(fā)中,可以選擇Writer類的實(shí)現(xiàn)類MultiFormatWriter。
參數(shù)
參數(shù) | 說(shuō)明 |
---|---|
String contents | 編碼的內(nèi)容 |
BarcodeFormat format | 編碼的方式(二維碼、條形碼...) |
int width | 生成的碼的寬度 |
int height | 生成的碼的高度 |
Map<EncodeHintType,?> hints | 編碼時(shí)額外的參數(shù) |
額外參數(shù)說(shuō)明
編碼額外的參數(shù)是以一個(gè)Map<EncodeHintType, ?>
存在的,key為EncodeHintType
枚舉,那么可以看到所有的參數(shù)類型。
參數(shù) | 說(shuō)明 |
---|---|
ERROR_CORRECTION | 容錯(cuò)率,指定容錯(cuò)等級(jí),例如二維碼中使用的ErrorCorrectionLevel , Aztec使用Integer |
CHARACTER_SET | 編碼集 |
DATA_MATRIX_SHAPE | 指定生成的數(shù)據(jù)矩陣的形狀,類型為SymbolShapeHint |
MARGIN | 生成條碼的時(shí)候使用,指定邊距,單位像素,受格式的影響。類型Integer, 或String代表的數(shù)字類型 |
PDF417_COMPACT | 指定是否使用PDF417緊湊模式(具體含義不懂)類型Boolean |
PDF417_COMPACTION | 指定PDF417的緊湊類型 |
PDF417_DIMENSIONS | 指定PDF417的最大最小行列數(shù) |
AZTEC_LAYERS | aztec編碼相關(guān),不理解 |
QR_VERSION | 指定二維碼版本,版本越高越復(fù)雜,反而不容易解析 |
從上面的參數(shù)表格可以看出,適用于二維碼的有:ERROR_CORRECTION
, CHARACTER_SET
, MARGIN
, QR_VERSION。
參數(shù) | 使用說(shuō)明 |
---|---|
ERROR_CORRECTION | 分為四個(gè)等級(jí):L/M/Q/H, 等級(jí)越高,容錯(cuò)率越高,識(shí)別速度降低。例如一個(gè)角被損壞,容錯(cuò)率高的也許能夠識(shí)別出來(lái)。通常為H |
CHARACTER_SET | 編碼集,通常有中文,設(shè)置為 utf-8 |
MARGIN | 默認(rèn)為4, 實(shí)際效果并不是填寫的值,一般默認(rèn)值就行 |
QR_VERSION | 通常不變,設(shè)置越高,反而不好用 |
代碼演示
下面是最簡(jiǎn)化的生成二維碼的代碼:
/** * 生成二維碼 * * @param contents 二維碼內(nèi)容 * @return 二維碼的描述對(duì)象 BitMatrix * @throws WriterException 編碼時(shí)出錯(cuò) */ private BitMatrix encode(String contents) throws WriterException { final Map<EncodeHintType, Object> hints = new HashMap<>(); hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); return new QRCodeWriter().encode(contents, BarcodeFormat.QR_CODE, 320, 320, hints); }
沒(méi)錯(cuò),就是這么簡(jiǎn)單。但是我們得到的是一個(gè)BitMatrix
, 如果需要顯示出來(lái)則要根據(jù)不同平臺(tái)來(lái)處理。
BitMatrix 轉(zhuǎn)換成圖片
首先明確Java SE平臺(tái)和Android平臺(tái)的區(qū)別:Android平臺(tái)移除關(guān)于swing部分的代碼,所以如果SE平臺(tái)使用到這部分代碼,Android平臺(tái)則不能用,不幸的是,官方的代碼恰恰用到了這部分。
明確另外一個(gè)概念:圖片在一個(gè)平臺(tái)的存在形式有兩種,內(nèi)存和文件。雖然文件在不同平臺(tái)通用,但是轉(zhuǎn)換成文件的過(guò)程卻不是通用的。如Android中將Bitmap
轉(zhuǎn)換成圖片文件,SE中將BufferedImage
轉(zhuǎn)換成圖片文件。所以實(shí)際上,最重要的是將BitMatrix
轉(zhuǎn)換成在內(nèi)存中圖片的存在形式。
Java SE平臺(tái)
將BitMatrix
轉(zhuǎn)換成BufferedImage
.
在官方提供的zxing-javase包中已經(jīng)有了相應(yīng)的方法。下面是示例代碼:
BufferedImage bufferedImage = MatrixToImageWriter.toBufferedImage(bitMatrix, new MatrixToImageConfig(Color.BLACK.getRGB(), Color.WHITE.getRGB()));
其他就不過(guò)多介紹了,下面我們實(shí)際代碼完整演示一遍。
三、完整代碼演示
3.1 導(dǎo)入依賴
<!-- zxing生成二維碼 --> <dependency> <groupId>com.google.zxing</groupId> <artifactId>core</artifactId> <version>3.3.3</version> </dependency> <dependency> <groupId>com.google.zxing</groupId> <artifactId>javase</artifactId> <version>3.3.3</version> </dependency>
3.2 代碼示例
package com.pink.jucstudy.utils; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.client.j2se.MatrixToImageWriter; import com.google.zxing.common.BitMatrix; import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.util.HashMap; import java.util.Map; public class CodeX { /** * 1. 設(shè)置二維碼的參數(shù) * 2. 生成二維碼 * 3. 將二維碼導(dǎo)出 */ /** * * @param content 編碼的內(nèi)容 * @param path 本地保存的路徑 * @return */ public boolean createCode(String content,String path){ // 1 設(shè)置基本參數(shù) int width = 300; int height = 300; String format = "png";//保存圖片的格式,注意:不同平臺(tái)可能有它的圖片格式要求 // 2 設(shè)置額外參數(shù),一定要保存到map集合中 Map map = new HashMap(); // 2.1 設(shè)置容錯(cuò)率 // 其中key鍵就是EncodeHintType.ERROR_CORRECTION // value值也是枚舉類ErrorCorrectionLevel.M,可自行選擇容錯(cuò)率等級(jí)l>M>Q>H // 當(dāng)?shù)燃?jí)越高,掃描所需的時(shí)間越高,但是準(zhǔn)確率越高。 map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); // 2.2 生成條碼的時(shí)候使用,指定邊距,單位像素 map.put(EncodeHintType.MARGIN,2); // 2.3 設(shè)置字符集 map.put(EncodeHintType.CHARACTER_SET,"utf-8"); // 3 生成二維碼 // MultiFormatWriter繼承了Writer // 通過(guò)該對(duì)象的encode方法即可生成二維碼BitMatrix // 該方法形參分別對(duì)應(yīng)了: // 第一個(gè)參數(shù)為編碼的內(nèi)容, // 第二個(gè)參數(shù)選擇生成編碼為二維碼 // 第三第四分別對(duì)應(yīng)編碼的寬度和高度 // 第五個(gè)參數(shù)為對(duì)應(yīng)的額外參數(shù) // 然后需要try、catch拋出異常 try { BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, map); // 4 導(dǎo)出到本地 File file = new File(path); Path path1 = file.toPath(); System.out.println(path1); MatrixToImageWriter.writeToPath(encode,format,path1); return true; } catch (WriterException | IOException e) { e.printStackTrace(); } return false; } public static void main(String[] args) { boolean code = new CodeX().createCode("夏至小姐姐,留個(gè)微信唄", "E:\\xx\\2.png"); if (code){ System.out.println("成功"); }else { System.out.println("失敗了"); } } }
3.3 運(yùn)行測(cè)試
3.4 測(cè)試Springboot生成二維碼并回顯到頁(yè)面上
@GetMapping("/qrcode") public void qrcodeTest(HttpServletResponse response) throws WriterException, IOException { ServletOutputStream outputStream = response.getOutputStream(); int width = 300; int height =300; String format = "png"; HashMap<EncodeHintType, Object> map = new HashMap<>(); map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); map.put(EncodeHintType.CHARACTER_SET,"utf-8"); String content = "今年是兔年,兔飛猛進(jìn)!豬兔猛進(jìn)!"; BitMatrix encode = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, map); MatrixToImageWriter.writeToStream(encode,format,outputStream); System.out.println("成功!"); }
3.5 如果希望用html頁(yè)面的方式展示再寫頁(yè)面即可
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>首頁(yè)</title> </head> <body> <h5>掃碼獲取信息</h5> <img src="/qrcode"> </body> </html>
到此這篇關(guān)于Java實(shí)現(xiàn)二維碼、條形碼等功能的文章就介紹到這了,更多相關(guān)java二維碼條形碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java+vue實(shí)現(xiàn)添加單選題、多選題到題庫(kù)功能
這篇文章主要為大家詳細(xì)介紹了java+vue實(shí)現(xiàn)添加單選題、多選題到題庫(kù)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-04-04Java中的ThreadPoolExecutor線程池原理細(xì)節(jié)解析
這篇文章主要介紹了Java中的ThreadPoolExecutor線程池原理細(xì)節(jié)解析,ThreadPoolExecutor是一個(gè)線程池,最多可使用7個(gè)參數(shù)來(lái)控制線程池的生成,使用線程池可以避免創(chuàng)建和銷毀線程的資源損耗,提高響應(yīng)速度,并且可以管理線程池中線程的數(shù)量和狀態(tài)等等,需要的朋友可以參考下2023-12-12一篇文章教你如何在SpringCloud項(xiàng)目中使用OpenFeign
這篇文章主要介紹了SpringCloud 使用Open feign 優(yōu)化詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-08-08idea導(dǎo)入項(xiàng)目框架的詳細(xì)操作方法
大家使用idea開發(fā)工具時(shí)經(jīng)常會(huì)需要導(dǎo)入項(xiàng)目框架,糾結(jié)該怎么操作呢,今天小編給大家分享一篇圖文教程,幫助大家解決idea導(dǎo)入項(xiàng)目框架的問(wèn)題,感興趣的朋友一起看看吧2021-05-05spring注解在自定義jar包中無(wú)法被掃描的解決方案
這篇文章主要介紹了spring注解在自定義jar包中無(wú)法被掃描的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08如何應(yīng)對(duì)spring框架的HTTP ERROR 400 Bad Request錯(cuò)
這篇文章主要介紹了如何應(yīng)對(duì)spring框架的HTTP ERROR 400 Bad Request錯(cuò)誤返回問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08Java使用itextpdf實(shí)現(xiàn)Excel轉(zhuǎn)PDF
這篇文章主要為大家詳細(xì)介紹了Java如何使用itextpdf實(shí)現(xiàn)Excel轉(zhuǎn)PDF,并且支持xlsx和xls兩種格,文中的示例代碼講解詳細(xì),希望對(duì)大家有所幫助2024-01-01Spring使用@Async出現(xiàn)循環(huán)依賴原因及解決方案分析
在Spring框架中,啟用異步功能需要在應(yīng)用主類上添加@EnableAsync注解,當(dāng)項(xiàng)目中存在循環(huán)引用時(shí),如一個(gè)異步類MessageService和一個(gè)常規(guī)類TaskService相互引用,并且這兩個(gè)類位于同一包內(nèi),這種情況下可能會(huì)觸發(fā)Spring的循環(huán)依賴異常2024-10-10