zxing 如何識別反轉二維碼

来源:https://www.cnblogs.com/nesger/archive/2018/07/23/9353121.html
-Advertisement-
Play Games

說起二維碼掃描,估計很多人用的是 "zxing" 吧。 然而 zxing 雖然好用,但是卻有一些坑。 這邊分析一下自己實際項目遇到的一個坑。 什麼坑呢? 下麵舉個慄子你就懂了。 這邊生成二維碼使用的是網路上的一個網站 "聯圖" 以百度為例,正常情況生成的二維碼如下: 這種情況下用 zxing 分分鐘 ...


說起二維碼掃描,估計很多人用的是 zxing 吧。

然而 zxing 雖然好用,但是卻有一些坑。

這邊分析一下自己實際項目遇到的一個坑。

什麼坑呢?

下麵舉個慄子你就懂了。

這邊生成二維碼使用的是網路上的一個網站聯圖

以百度為例,正常情況生成的二維碼如下:

百度正常二維碼

這種情況下用 zxing 分分鐘就可以識別出來。

但是假設我將前景色和後景色調換,生成的二維碼如下:

百度反轉二維碼

這種情況下 zxing 就識別不出了。

所以說這種時候就很無奈了。畢竟有些場景就需要用到反轉二維碼。

所以本篇說的 zxing 的坑就是無法識別反轉二維碼

咋辦呢?涼拌。

這種時候就需要去源碼看看了。

看一下二維碼解析的代碼邏輯在哪?

通過一番折騰,跟蹤調試,最後定位到如下位置:

https://github.com/zxing/zxing/blob/master/android/src/com/google/zxing/client/android/DecodeHandler.java#L80

關鍵代碼:(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:

  1. 通過交替識別可能會降低識別速度,因此次數設置為多少需要自己調試把控。
  2. 計數時註意避免次數溢出。

如果你有其他方法,歡迎留言討論。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一. 使用sql提示 sql 提示(sql hint)是優化資料庫的一個重要手段, 是在sql語句中加入一些人為的提示來達到優化操作的目的。 1.1 use index 在查詢語句中表名的後面,添加use index 強制mysql使用該索引,不考慮其它索引。 1.2 ignore index 在查 ...
  • 先連接好資料庫,然後打開左側 對象資源管理器,選擇資料庫 右鍵單擊 > 選擇導入數據層應用程式 根據提示嚮導一步步走就行了 部分導入失敗以及處理方案 異常1 : 在資料庫master中拒絕 create database 許可權 處理方法:可能你當前登陸的用戶名沒有該許可權,可以直接使用Windows身 ...
  • 一、分支結構 1.If函數 語法:if(條件,值1,值2) 功能:實現雙分支 應用範圍:begin – 中 或者 外面 2.case結構 語法一:結構switch結構 case 變數或者表達式 when 值1 then 語句1; when 值2 then 語句2; … else 語法n; end c ...
  • Android四大組件 1、Activity a、Activity是指與用戶交互的界面。 b、一個Activity通常就是一個單獨的屏幕(視窗)。 c、Activity之間通過Intent傳遞數據。 2、service a、service在後臺運行,沒有圖形界面。 b、service的啟動方式有兩種 ...
  • 概述 有的時候需要在現有的項目上面開發一個新的項目,如果新建工程的話,就比較麻煩了,所以一般是直接現有的工程上面直接修改名字步驟如下: 1.修改工程名字 在這裡修改完之後,會彈出一個對話框,點擊Rename 2.修改Scheme名稱 點擊Xcode上面的工具欄Product Secheme Edit ...
  • 前言 在保證代碼沒有功能問題,完成業務開發之餘,有追求的程式員還要追求代碼的規範、可維護性。 今天,以“成為優秀的程式員”為目標的拭心將和大家一起精益求精,學習使用 Lint 優化我們的代碼。 什麼是 Lint Lint 是Android Studio 提供的 代碼掃描分析工具,它可以幫助我們發現代 ...
  • 導入框架CaptiveNetwork 獲取當前連接的wifi信息 ...
  • 在Android自定義一個類繼承集成Application後,併在AndroidManifest.xml裡面配置了application的name屬性為該類名稱後報錯: Unable to instantiate activity ComponentInfo ClassNotFoundExcepti ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...