使用Java語言生成二維碼有以下方式,一是谷歌的zxing,二是基于zxing實現的qrcode開源項目,三是基于zxing實現的qrgen開源項目
一 zxing
谷歌的zxing技術生成二維碼,是MultiFormatWriter多寫格式書寫器生成BitMatrix位矩陣,然后將位矩陣的信息在BufferedImage中設置二維碼圖片,最后由ImageIO將二維碼圖片寫出到文件。
1.1 生成普通二維碼
<dependencies><!-- 二維碼操作相關依賴 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.0</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.0</version></dependency><!-- word文檔操作相關依賴 --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency>
</dependencies>
public static void main(String[] args) throws WriterException, IOException, InvalidFormatException {String str = "Yesterday Once More";final String CHARSET = "UTF-8";final int QRCODE_SIZE = 100;// EncodeHintType編碼提示類型, 用來設置二維碼圖片的相關參數// Map集合使用Hashtable和HashMap都可以// Hashtable是線程安全的,但同步會帶來性能損耗// HashMap是非線程安全,但在單線程環境下效率更高Map<EncodeHintType, Object> hints = new Hashtable<>();hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);hints.put(EncodeHintType.CHARACTER_SET, CHARSET);hints.put(EncodeHintType.MARGIN, 0);// MultiFormatWriter多格式書寫器, 是二維碼生成類// BitMatrix位矩陣, 是布爾型二維數組, 表示二維碼矩陣的數據結構BitMatrix bitMatrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE, hints);int width = bitMatrix.getWidth();int height = bitMatrix.getHeight();// BufferedImage圖像類, 提供了對圖像像素級別的訪問和修改BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {bufferedImage.setRGB(i, j, bitMatrix.get(i, j) ? 0x000000 : 0xFFFFFF);}}ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();// ImageIO標準圖像輸入輸出工具類, 用于讀取、寫入和處理各種格式的圖像文件ImageIO.write(bufferedImage, "jpg", byteArrayOutputStream);ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());// XWPFDocument類位于Apache POI庫中的poi-ooxml模塊中, 用于操作Microsoft Word(.docx)文檔XWPFDocument document = new XWPFDocument();XWPFRun run = document.createParagraph().createRun();run.addPicture(byteArrayInputStream, XWPFDocument.PICTURE_TYPE_JPEG, "mango", Units.toEMU(128), Units.toEMU(128));FileOutputStream fileOutputStream = new FileOutputStream("D:\\mango.docx");document.write(fileOutputStream);fileOutputStream.close();
}
生成的二維碼如下:
EncodeHintType編碼提示類型是一個枚舉類,用來設置二維碼圖片的相關屬性,使用EncodeHintType作為key,Object作為value的Hashtable,常用設置如下:
EncodeHintType.ERROR_CORRECTION設置二維碼的容錯率,value值ErrorCorrectionLevel也是枚舉類,由L(7%)、M(15%)、Q(25%)和H(30%)四個可選項;
EncodeHintType.CHARACTER_SET設置字符集,value值可以設置UTF-8;
EncodeHintType.MARGIN設置二維碼周邊留白大小,value值是一個整型數值;
MultiFormatWriter多格式書寫器, 是二維碼生成類,MultiFormatWriter的encode方法可以將指定文本生成BitMatrix位矩陣對象,encode方法定義如下
public BitMatrix encode(String contents, BarcodeFormat format, int width, int height, Map<EncodeHintType, ?> hints),參數解釋:
String contents:要生成二維碼的文本內容;
BarcodeFormat format:指定碼的格式,BarcodeFormat是枚舉值,常用枚舉值有QR_CODE(通用二維碼,支持文本和鏈接URL),CODE_128(條形碼,支持物流和商品管理)和EAN_13(國際商品編碼,廣泛用于零售商品?);
int width:二維碼的寬度(像素);
int height:二維碼的高度(像素);
Map<EncodeHintType, ?> hints:二維碼圖片的相關屬性,Map集合使用Hashtable和HashMap都可以,Hashtable是線程安全的,但同步會帶來性能損耗,HashMap是非線程安全,但在單線程環境下效率更高;
BitMatrix表示二維碼矩陣的數據結構,由0和1構成的布爾型二維數組,常用于將編碼后的信息轉化為矩陣形式,用于存儲和處理生成二維碼圖像所需的二進制信息,通過對BitMatrix對象的構建和操作,最終生成一個可被掃描解碼的二維碼圖像,BitMatrix常用API:
public int getHeight():獲取二維碼矩陣高度;
public int getWidth():獲取二維碼矩陣寬度;
public boolean get(int x, int y):根據x,y的坐標獲取矩陣中該坐標的值,結果是true(有值)或者false(無值);
BufferedImage緩沖區圖像類,將一幅圖片加載到內存中(BufferedImage生成的圖片在內存里有一個圖像緩沖區),在緩沖區操作圖片資源,而且提供獲得繪圖對象、圖像縮放、選擇圖像平滑度等功能,通常用來做圖片大小變換、圖片變灰、設置透明不透明等;
ImageIO是Java的標準圖像輸入輸出工具類,用于讀取、寫入和處理各種格式的圖像文件;
1.2 生成彩色二維碼
在設置BufferedImage對象的setRGB方法中,設置RGB顏色時,指定需要的顏色即可,譬如生成前景色為純藍色的二維碼,使用0x0000FF進行RGB設置
// BufferedImage圖像類, 提供了對圖像像素級別的訪問和修改
BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {bufferedImage.setRGB(i, j, bitMatrix.get(i, j) ? 0x0000FF : 0xFFFFFF);}
}
1.3 生成帶logo的二維碼
public static void main(String[] args) throws WriterException, IOException, InvalidFormatException {String str = "Yesterday Once More";final String CHARSET = "UTF-8";final int QRCODE_SIZE = 100;// EncodeHintType編碼提示類型, 用來設置二維碼圖片的相關參數// Map集合使用Hashtable和HashMa