提高zxing生成二維碼的容錯率及zxing生成二維碼的邊框設置


最近做了一個項目要生成二維碼,跟幾年前不同,最近大家都喜歡在二維碼中間加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都可以.再生成圖片,發現效果就很好了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM