毫無疑問,第一點也是最重要的一點引入相關 jar 包的支持。
你可以在 mvn 倉庫中進行下載。
我們先來看主函數:
// 生成圖片路徑 src/img.png
String imgPath = "src/qr.png";
// 二維碼內容: 文字信息 , 網址信息等。。
String contenx = "Hello World";
//生成二維碼
QRgenter qr = new QRgenter();
qr.encoderQRcoed(contenx,imgPath,"png",7);
我們再來看自己定義的一個類: QRgenter及其裏面的方法等
// 加密: 文字--》二維碼
public void encoderQRcoed(String content , String imgPah , String imgType , int size) throws Exception
{
//內存中的一張圖片; 內存--》硬盤
BufferedImage bufImg = QRcodeCommon(content,imgType,size);
File file = new File(imgPah);
//API,生成圖片
ImageIO.write(bufImg,imgType,file);
}
生成一個二維碼必要條件: 指明二維碼所代表的信息,二維碼的圖片類型,大小,存儲路徑。
這裏的一個 BufferedImage 就相當於在內存中畫的一張圖片
再來看生成 BufferedImage 的方法:QRcodeCommon
BufferedImage bufImg = null;
int imgSize = 67 + 12*(size-1); // 放大尺寸
bufImg = new BufferedImage(imgSize,imgSize,BufferedImage.TYPE_INT_RGB); // 確定基本顏色 rgb
Graphics2D gp = bufImg.createGraphics(); //生成一個2d畫板
gp.setBackground(Color.white); //設置背景色
gp.clearRect(0,0,imgSize,imgSize); //初始化背景的大小範圍,從左上角開
gp.setColor(Color.BLACK); //設置二維碼顏色
二維碼設置的最大尺寸爲 40 但太小,又不能違反語法規則,只能進行放大。
接下來這一段代碼的作用是, 將 String content 轉化爲bytes數組,在將字節數據轉爲二維的boolean數組,然後分佈在畫板上,當某個小方框內爲true時,則被填充爲黑色。
// 將內容變成矩陣形式,boolean數組,有內容則方框爲黑,無則白
Qrcode qrcodeHandler = new Qrcode();
qrcodeHandler.setQrcodeErrorCorrect('M'); //設置二維碼排錯率 L:7%<M<Q<H:30% 排錯率越高,可存儲信息越少,二維碼清晰度要求不高
qrcodeHandler.setQrcodeEncodeMode('B');//可存放信息類型 : N:數字 A:數字+A-Z B:所有
qrcodeHandler.setQrcodeVersion(size); //尺寸: 1-40
byte[] contentBytes = contenx.getBytes(); // 將內容生成二維數組
boolean[][]codeOut = qrcodeHandler.calQrcode(contentBytes); //在畫板上標出範圍的所有小方框 -->二維
int pixof = 2; //偏移量
for(int i = 0 ;i<codeOut.length;i++) {
for (int j = 0; j < codeOut.length; j++) {
if (codeOut[i][j])
gp.fillRect(i * 3 + pixof, j * 3 + pixof, 3, 3); // 離左上角有點距離
}
}
重點代碼解析:
由於是 I/O 操作,我們得釋放資源等。
gp.dispose(); // 釋放空間
bufImg.flush();
return bufImg;
這裏的 flush 就是將管道中的數據強制衝進內存中。
到這裏全部結束,接着就是運行主函數,生成對應的二維碼啦~
結果參照:
不信的話,你可以檢驗一哈!
總結: 涉及到二維碼的工具類 QRCode , 以及如何通過代碼將信息加密成二維碼等。