使用Java生成二維碼
阿新 • • 發佈:2019-01-05
二維碼應該稱為二維條碼,掃描之後可以獲得更多資料
QR碼全稱為快速響應矩陣碼,1994年日本一個公司發明
黑色表示1,白色表示0
3個角落比較像“回”字,叫定位點
容錯機制,當7%~30%破損任可以被讀取,可以利用這個機制在二維碼中放入一些小的logo
最多可以儲存7089個數字字元或4296個字母或1800箇中文漢字(gbk)
目前在Github上最流行的java實現條形碼庫是:
javase的相關jar包下載方式相同
下面這張圖片是各個包中的幫助文件,在主頁面中
將兩個jar包複製到java專案中,並且新增到內路徑上
package com.laning.qrcode; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.util.HashMap; import javax.imageio.ImageIO; 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; public class QRCode { private static int index =1; //main方法,方法的入口 public static void main(String[] args) { String str1 = "李長斌有毛病,哈哈哈"; String str2 = "劉志文有毛病,哈哈哈"; String str3 = "李 明有毛病,哈哈哈"; File dstfile1 = new File("E:/大一課程/java程式設計/JAVA生成二維碼jar包"); try { createQRCode(str1, dstfile1); createQRCode(str2, dstfile1); createQRCode(str3, dstfile1); } catch (WriterException | IOException e) { e.printStackTrace(); } createLogoQRCode(new File("E:/大一課程/java程式設計/JAVA生成二維碼jar包/1.jpg"), str1,dstfile1 ); } //專門用於生成二維碼的工具方法 private static void createQRCode(String str ,File dst) throws WriterException, IOException{ //該類用於多種格式二維碼的編碼 MultiFormatWriter writer = new MultiFormatWriter(); //用來設定二維碼的寬高 int width = 200; int height = 200; //用來設定二維碼的一些屬性 HashMap<EncodeHintType,Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET,"utf-8"); //用來編寫二維碼,返回二進位制矩陣資料 BitMatrix bitmatrix = writer.encode(str,BarcodeFormat.QR_CODE, width, height,hints); //三個引數,二進位制矩陣陣列,圖片的格式,圖片儲存的路徑 MatrixToImageWriter.writeToPath(bitmatrix,"png",new File(dst.getPath()+"/"+(index++)+".png").toPath()); } //利用二維碼容錯機制生成一個簡單的logo的工具方法,三個引數分別是目標圖片,想要展示的內容,二維碼存放地址 private static void createLogoQRCode(File dstimg,String str,File dst){ //該類用於多種格式二維碼的編碼 MultiFormatWriter writer = new MultiFormatWriter(); //用來設定二維碼的寬高 int width = 200; int height = 200; //用來設定二維碼的一些屬性 HashMap<EncodeHintType,Object> hints = new HashMap<>(); hints.put(EncodeHintType.CHARACTER_SET,"utf-8"); //用來編寫二維碼,返回二進位制矩陣資料 BitMatrix bitmatrix = null; try { bitmatrix = writer.encode(str,BarcodeFormat.QR_CODE, width, height,hints); } catch (WriterException e1) { e1.printStackTrace(); } //建立圖片,寬,高, BufferedImage qr = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); for(int x=0;x<width;x++){ for(int y=0;y<height;y++){ if(bitmatrix.get(x, y)){//如果矩陣陣列中有點的話,可以設定任意顏色 qr.setRGB(x, y, 0xff0000); }else{ qr.setRGB(x, y, 0xffffff); } } } Image logoUse = null; //將logo縮小,寬,高,縮小方式 int logoW=30; int logoH=30; try { //讀取logo BufferedImage logoImg = ImageIO.read(dstimg); logoUse = logoImg.getScaledInstance(logoW,logoH,Image.SCALE_FAST); } catch (IOException e) { e.printStackTrace(); } //獲取畫筆 Graphics g = qr.getGraphics(); //繪製Logo,x座標,y座標 int logoX = (width-logoW)/2; int logoY = (height-logoH)/2; g.drawImage(logoUse,logoX,logoY, null); try { ImageIO.write(qr, "png",new File(dst.getPath()+"/"+(index++)+".png")); } catch (IOException e) { e.printStackTrace(); } } }