先下載相關的 jar 包 :
然後開始擼代碼,其實代碼邏輯挺簡單的,大概流程就是:
1 現在內存生成一張圖片
2 將你想轉化爲二維碼的信息打成二維數組分佈在圖片上
3 設置相關的參數,如排錯率, 尺寸,編碼方式等
4 最後利用生成的二維碼在給其加入 logo 利用相應的畫筆
5 利用圖片流寫入指定的文件路徑
//加密方法名,及相應傳入的參數
public void ZXingEncode(String content , String imgPath, String logo , String format , int width , int height)
//在內存中生成圖片
BufferedImage im = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
//將需要加密的文字 ---》矩陣數組
// BarcodeFormat.QR_CODE : 解析類型二維碼(還可以設置條形碼啥的), 最後一個參數就是設置基本參數的對象
BitMatrix bm = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, width, height, hints);
//用來設置基本參數,出錯率,編碼方式等
Map<EncodeHintType , Object> hints = new HashMap<>();
hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); //設置排錯率
hints.put(EncodeHintType.CHARACTER_SET, "utf-8"); // 編碼方式
hints.put(EncodeHintType.MARGIN, 1); // 就是二維碼跟圖片周圍邊框的距離
//遍歷剛剛的二維數組,如果存在信息則設置爲黑色
for(int x=0 ; x<width ; x++)
for(int y=0 ; y<height ; y++) {
im.setRGB(x, y, bm.get(x, y) ? BLACK : WHITE);
}
//產生logo 二維碼圖片
im = DrawLogoUtils.CreateLogo(im, logo);
// 二維碼存放位置
File f = new File(imgPath);
// 生成圖片
ImageIO.write(im, format, f);
添加 logo 的方法及大概流程:
1 將磁盤內的圖片讀取到內存
2 指定 logo 在二維碼上的位置,並將其黑白部分覆蓋
3 加入logo與二維之間的特效如 灰色邊框,logo的四個角爲圓形啥的
4 完成操作(對於相關的操作可以理解成畫板(上面有二維碼圖片)和一隻畫筆)
public static BufferedImage CreateLogo( BufferedImage img , String logo)
//畫 logo --> 磁盤圖片 load to 內存
BufferedImage log = ImageIO.read(new File(logo));
int h = img.getHeight(); //獲取二維碼的長度
int w = img.getWidth(); // 獲取二維碼的寬度
// 在畫板上畫 純 logo 圖片 , 畫板自帶二維碼
Graphics2D g2 = img.createGraphics();
//將logo放置指定二維碼位置
g2.drawImage(log, w*1/5, h*1/5 , w*1/5, h*1/5, null);
// 利用圓筆頭畫白色方框( 筆頭粗細 , 筆頭形狀 , 兩者交界處形狀)
BasicStroke pen = new BasicStroke(5 , BasicStroke.CAP_ROUND , BasicStroke.JOIN_ROUND);
//將畫筆與畫板關聯
g2.setStroke(pen);
// 設置特效部分
//用筆在logo 旁邊畫一個圓角正方形
RoundRectangle2D.Float round = new RoundRectangle2D.Float( w*1/5, h*1/5 , w*1/5, h*1/5, BasicStroke.CAP_ROUND , BasicStroke.JOIN_ROUND);
//爲邊框設置顏色
g2.setColor(Color.WHITE);
//開始畫
g2.draw(round);
//完成繪畫,關閉操作
g2.dispose();
log.flush();
return img;
在來說說其解碼的大體流程:
1 將二維碼加載進內存
2 將相應的二維數組信息轉化爲文字信息
// 解碼
public void decodeImg(File f) throws Exception
{
// 如果二維碼不存在則停止操作
if ( !f.exists() ) return ;
// 將二維碼加載進內存
BufferedImage image= ImageIO.read(f);
//解碼工具類
MultiFormatReader reader = new MultiFormatReader();
// 代碼邏輯解析在下面
LuminanceSource source = new BufferedImageLuminanceSource(image);
Binarizer binarizer = new HybridBinarizer(source);
BinaryBitmap bitmap = new BinaryBitmap(binarizer);
//設置解碼時的編碼方式
Map map = new HashMap<>();
map.put(EncodeHintType.CHARACTER_SET, "utf-8");
//傳入相關參數
Result res = reader.decode(bitmap , map);
//打印解碼信息
System.out.println(res.toString());
代碼邏輯解析:
此時解碼需要一個 BinaryBitmap 那我們就創建一個 BinaryBitmap:
那麼通過提示又發現需要一個 Binarizer 類型的參數,那我們在創建 這個類:
Binarizer 是 abstract 類,則創建其子類,通過提示發現需要 LuminanceSource類,那我們在創建這個類:
同樣的邏輯,這是一個抽象類,需要由其子類實現,那通過提示看見 BufferedImage 這個提示就把我們加載進內存的圖片參數傳進去即可,不得不說有點麻煩,但邏輯性又不是那麼的強。
總結: 其實和這篇內容
Java 生成二維碼代碼解析
差不多,但使用的工具不同而已,大體的思路無非就是將需要加密的信息打散成二維數組分佈在設定好長寬的圖片上,通過遍歷,有內容的點則設置爲黑色。添加 logo 的思路也差不多,只需要指定 logo 在二維碼上的位置,然後覆蓋即可。