天天看點

Google 開源工具 ZXing進行二維碼編碼 / add logo / 解碼

先下載下傳相關的 jar 包 :

Google 開源工具 ZXing進行二維碼編碼 / add logo / 解碼

然後開始撸代碼,其實代碼邏輯挺簡單的,大概流程就是:

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());
           

代碼邏輯解析:

Google 開源工具 ZXing進行二維碼編碼 / add logo / 解碼

此時解碼需要一個 BinaryBitmap 那我們就建立一個 BinaryBitmap:

Google 開源工具 ZXing進行二維碼編碼 / add logo / 解碼

那麼通過提示又發現需要一個 Binarizer 類型的參數,那我們在建立 這個類:

Google 開源工具 ZXing進行二維碼編碼 / add logo / 解碼

Binarizer 是 abstract 類,則建立其子類,通過提示發現需要 LuminanceSource類,那我們在建立這個類:

Google 開源工具 ZXing進行二維碼編碼 / add logo / 解碼

同樣的邏輯,這是一個抽象類,需要由其子類實作,那通過提示看見 BufferedImage 這個提示就把我們加載進記憶體的圖檔參數傳進去即可,不得不說有點麻煩,但邏輯性又不是那麼的強。

總結: 其實和這篇内容

Java 生成二維碼代碼解析

差不多,但使用的工具不同而已,大體的思路無非就是将需要加密的資訊打散成二維數組分布在設定好長寬的圖檔上,通過周遊,有内容的點則設定為黑色。添加 logo 的思路也差不多,隻需要指定 logo 在二維碼上的位置,然後覆寫即可。