Android zxing如何識(shí)別反轉(zhuǎn)二維碼詳解
前言
說(shuō)起二維碼掃描,估計(jì)很多人用的是 zxing 吧。
需要學(xué)習(xí)的朋友們也可以先看看這篇文章:http://m.fzitv.net/article/99765.htm
然而 zxing 雖然好用,但是卻有一些坑。
這邊分析一下自己實(shí)際項(xiàng)目遇到的一個(gè)坑。
什么坑呢?
下面舉個(gè)栗子你就懂了。
這邊生成二維碼使用的是網(wǎng)絡(luò)上的一個(gè)網(wǎng)站聯(lián)圖
以百度為例,正常情況生成的二維碼如下:

這種情況下用 zxing 分分鐘就可以識(shí)別出來(lái)。
但是假設(shè)我將前景色和后景色調(diào)換,生成的二維碼如下:

這種情況下 zxing 就識(shí)別不出了。

所以說(shuō)這種時(shí)候就很無(wú)奈了。畢竟有些場(chǎng)景就需要用到反轉(zhuǎn)二維碼。
所以本篇說(shuō)的 zxing 的坑就是無(wú)法識(shí)別反轉(zhuǎn)二維碼。
咋辦呢?涼拌。
這種時(shí)候就需要去源碼看看了。
看一下二維碼解析的代碼邏輯在哪?
通過(guò)一番折騰,跟蹤調(diào)試,最后定位到如下位置:
關(guān)鍵代碼:(DecodeHandler.java 里面的 decode 方法)
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
如果要識(shí)別上面的反轉(zhuǎn)百度二維碼,需要如何處理呢?
很簡(jiǎn)單,只需要將上面的代碼改為:
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source.invert()));
即可。
到了這里,相信聰明的你應(yīng)該知道如何讓 zxing 同時(shí)支持兩種格式了。
只需要設(shè)置一個(gè)計(jì)數(shù)器,然后在指定次數(shù)(比如前 3 次)里面使用
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
在另外次數(shù)(比如后 3 次)里面使用
BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source.invert()));
交替使用即可。
這樣就可以解決正轉(zhuǎn)和反轉(zhuǎn)二維碼的識(shí)別了。
NOTE:
- 通過(guò)交替識(shí)別可能會(huì)降低識(shí)別速度,因此次數(shù)設(shè)置為多少需要自己調(diào)試把控。
- 計(jì)數(shù)時(shí)注意避免次數(shù)溢出。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- Android調(diào)用OpenCV2.4.10實(shí)現(xiàn)二維碼區(qū)域定位
- Android 超簡(jiǎn)易Zxing框架 生成二維碼+掃碼功能
- Android實(shí)現(xiàn)掃描和生成二維碼
- 超簡(jiǎn)單Android集成華為HMS Scankit 掃碼SDK實(shí)現(xiàn)掃一掃二維碼
- Android實(shí)現(xiàn)掃描二維碼功能
- Android studio 實(shí)現(xiàn)手機(jī)掃描二維碼功能
- Android生成條形碼和二維碼功能
- Android如何實(shí)現(xiàn)掃描和生成二維碼
- Android掃描和生成二維碼
- Android基于OpenCV實(shí)現(xiàn)QR二維碼檢測(cè)
相關(guān)文章
懸浮對(duì)話(huà)框Android代碼實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了懸浮對(duì)話(huà)框Android代碼實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
Android項(xiàng)目中g(shù)radle的執(zhí)行流程
大家好,本篇文章主要講的是Android項(xiàng)目中g(shù)radle的執(zhí)行流程,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話(huà)記得收藏一下2022-01-01
Android?AIDL通信DeadObjectException解決方法示例
這篇文章主要為大家介紹了Android?AIDL通信DeadObjectException解決的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03
分享一個(gè)輕量級(jí)圖片加載類(lèi) ImageLoader
這篇文章給大家分享一個(gè)輕量級(jí)圖片加載類(lèi) ImageLoader,需要的朋友可以參考下2016-08-08
Android開(kāi)發(fā)之Kotlin委托的原理與使用詳解
我們常用的委托模式怎么使用?在?Java?語(yǔ)言中需要我們手動(dòng)的實(shí)現(xiàn),而在?Kotlin?語(yǔ)言中直接通過(guò)關(guān)鍵字?by?就可以實(shí)現(xiàn)委托,下面我們就一起看看不同種類(lèi)的委托使用以及在?Android?常見(jiàn)的一些場(chǎng)景中的使用2023-03-03
Android入門(mén)之讀寫(xiě)本地文件的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)讀寫(xiě)本地文件的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Android有一定的幫助,需要的可以參考一下2022-12-12

