說起二維碼掃描,估計很多人用的是 "zxing" 吧。 然而 zxing 雖然好用,但是卻有一些坑。 這邊分析一下自己實際項目遇到的一個坑。 什麼坑呢? 下麵舉個慄子你就懂了。 這邊生成二維碼使用的是網路上的一個網站 "聯圖" 以百度為例,正常情況生成的二維碼如下: 這種情況下用 zxing 分分鐘 ...
說起二維碼掃描,估計很多人用的是 zxing 吧。
然而 zxing 雖然好用,但是卻有一些坑。
這邊分析一下自己實際項目遇到的一個坑。
什麼坑呢?
下麵舉個慄子你就懂了。
這邊生成二維碼使用的是網路上的一個網站聯圖
以百度為例,正常情況生成的二維碼如下:
這種情況下用 zxing 分分鐘就可以識別出來。
但是假設我將前景色和後景色調換,生成的二維碼如下:
這種情況下 zxing 就識別不出了。
所以說這種時候就很無奈了。畢竟有些場景就需要用到反轉二維碼。
所以本篇說的 zxing 的坑就是無法識別反轉二維碼。
咋辦呢?涼拌。
這種時候就需要去源碼看看了。
看一下二維碼解析的代碼邏輯在哪?
通過一番折騰,跟蹤調試,最後定位到如下位置:
關鍵代碼:(DecodeHandler.java 裡面的 decode 方法)
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
如果要識別上面的反轉百度二維碼,需要如何處理呢?
很簡單,只需要將上面的代碼改為:
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source.invert()));
即可。
到了這裡,相信聰明的你應該知道如何讓 zxing 同時支持兩種格式了。
只需要設置一個計數器,然後在指定次數(比如前 3 次)裡面使用
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
在另外次數(比如後 3 次)裡面使用
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source.invert()));
交替使用即可。
這樣就可以解決正轉和反轉二維碼的識別了。
NOTE:
- 通過交替識別可能會降低識別速度,因此次數設置為多少需要自己調試把控。
- 計數時註意避免次數溢出。
如果你有其他方法,歡迎留言討論。