最近做了一個項目要生成二維碼,跟幾年前不同,最近大家都喜歡在二維碼中間加logo.
加logo倒是不難,兩個圖片疊一起就是了,但是遇到一個新問題,logo加得太大的話,會導致二維碼掃描不出來;加的太小則不怎么明顯.
上網看看網上在線生成二維碼的地方,發現都有容錯率的設置,從7%-30%,容錯率越高,二維碼的有效像素點就越多.
由於我們使用的是zxing,所以我們需要看看怎么設置zxing的二維碼容錯率.
翻閱了zxing的源碼,在QRCodeWriter.java中有這么一段:
1 ErrorCorrectionLevel errorCorrectionLevel = ErrorCorrectionLevel.L; 2 if (hints != null) { 3 ErrorCorrectionLevel requestedECLevel = (ErrorCorrectionLevel) hints.get(EncodeHintType.ERROR_CORRECTION); 4 if (requestedECLevel != null) { 5 errorCorrectionLevel = requestedECLevel; 6 } 7 }
這段描述了默認的容錯級別是L,代碼中注釋是7%,顯然是比較低的.設置方式也顯而易見了,通過一個hashtables傳入參數即可.因此將生成二維碼的代碼改成如下
1 /** 2 * 用字符串生成二維碼 3 * 4 * @param str 5 * @author zhouzhe@lenovo-cw.com 6 * @return 7 * @throws WriterException 8 */ 9 public static Bitmap Create2DCode(String str, int picWidth, int picHeight) throws WriterException { 10 // 生成二維矩陣,編碼時指定大小,不要生成了圖片以后再進行縮放,這樣會模糊導致識別失敗 11 Hashtable hints = new Hashtable(); 12 hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); 13 BitMatrix matrix = new MultiFormatWriter().encode(str, BarcodeFormat.QR_CODE, picWidth, picHeight, hints); 14 int width = matrix.getWidth(); 15 int height = matrix.getHeight(); 16 // 二維矩陣轉為一維像素數組,也就是一直橫着排了 17 int[] pixels = new int[width * height]; 18 for (int y = 0; y < height; y++) { 19 for (int x = 0; x < width; x++) { 20 if (matrix.get(x, y)) { 21 pixels[y * width + x] = 0xff000000; 22 } else { 23 pixels[y * width + x] = 0xffffffff; 24 } 25 26 } 27 } 28 29 Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 30 // 通過像素數組生成bitmap,具體參考api 31 bitmap.setPixels(pixels, 0, width, 0, 0, width, height); 32 return bitmap; 33 }
這樣 生成的二維碼想對默認的容錯級別L,像素密度大不少,容錯率也提升了,這樣中間的logo圖便可以放更大的logo圖了.
另外發現默認生成出來的圖片,除了二維碼以外,還有一圈白色邊框比較寬,如果背景不是白色的話比較難看.隨即查了一下,
發現還是在QRCodeWriter.java中,有個變量QUIET_ZONE_SIZE; 是控制的邊框的寬度,默認是4,最小值是1,這里我們修改成0或者1都可以.再生成圖片,發現效果就很好了.