Google ML Kit 條碼掃描與 IronBarcode:C# 條碼庫比較
Google ML Kit 在 Android 上的條碼掃描功能確實令人印象深刻。 它為 Google Lens 提供動力,可以處理損壞和部分遮蔽的條碼,無需網路呼叫即可在設備上工作,並且支援各種 1D 和 2D 格式。 當 .NET 開發人員在條碼庫比較中遇到這種情況時,這些事實是準確的。 比較文章常忽略的一點是,ML Kit 沒有 .NET SDK、沒有 NuGet 套件、也沒有 C# API。 本文面向在清單中發現 ML Kit 的開發人員,他們需要了解"在 .NET 專案中使用 ML Kit"在實務上究竟意味著什麼,以及託管程式碼的等效實作方式。
什麼是 Google ML Kit 條碼掃描?
Google ML Kit 條碼掃描是一個原生行動庫。 那不是一個可以繞過的限制; 這是產品的設計。 ML Kit 提供兩種版本:
- Android:透過 Google Maven 分發,版本為
com.google.mlkit:barcode-scanning(Kotlin/Java)。 需要在目標裝置上安裝 Google Play 服務。處理由相機幀、檔案 URI 或點陣圖建構的InputImage物件。 - iOS:透過 CocoaPods 分發,版本號為
GoogleMLKit/BarcodeScanning,依賴 Firebase。 使用 Swift 或 Objective-C。
沒有 dotnet add package google-mlkit-barcode。 沒有 using Google.MLKit.BarcodeScanning;。 Google 並沒有發布 ML Kit 的 .NET 綁定。
社群維護的 Xamarin 綁定在不同時期都存在,但它們有一個始終存在的問題:ML Kit 頻繁更新其 Android 和 iOS SDK,而由個人或小型團隊維護的綁定項目往往會在底層 API 發生變化時滯後或完全失效。 截至 2026 年,還沒有積極維護的、可用於生產的 .NET NuGet 套件封裝 ML Kit 的條碼掃描器。
ML Kit 的優勢
了解 ML Kit 出現在條碼比較中的原因有助於理解相關背景資訊。 在原生 Android 系統上:
-設備端推理:無需伺服器往返。 ML Kit 的模型使用 Google Play 服務在本地運行,這意味著掃描時延遲低且無需網路依賴。 -損傷容限: ML 模型比許多基於閾值的解碼器更能處理損壞、部分遮蔽或低解析度的條碼。 對於面向消費者的、掃描現實世界條碼的應用程式來說,這是一個真正的差異化優勢。
- Google Lens 整合: ML Kit 的掃描器與 Google Lens 條碼檢測所使用的技術棧相同。 這是一個很強的質量訊號。 -行動裝置上的格式廣度:原生支援 QR Code、EAN-13、EAN-8、Code 128、Code 39、Code 93、Codabar、ITF、PDF417、Data Matrix、Aztec 和 UPC-A/UPC-E。 -零配置:只需三行 Kotlin 程式碼片段即可產生可用的掃描器,無需調整閾值或選擇解碼器策略。
這些都是實實在在的優勢。 對於 .NET 開發人員來說,問題不在於 ML Kit 不好,而是他們不付出大量努力就無法使用 ML Kit。
.NET 開發現狀
當 .NET 開發人員需要掃描條碼時,ML Kit 的實際路徑如下所示:
沒有 async/await C# API。 ML Kit 使用 Android 的 Task API,以及 addOnSuccessListener 和 addOnFailureListener 回呼函數。 這些與 .NET 的 Task<t> 和 await 不對應。 任何綁定層都必須適應基於回呼的 Android 非同步和 .NET 的 TPL——這是一個不平凡的轉換,社群綁定對此的處理並不一致。
不支援 .NET 依賴注入。 BarcodeScanning.getClient(options) 是靜態工廠調用,傳回一個 Android BarcodeScanner 物件。 沒有 .NET 介面可以註冊,沒有 IServiceCollection.AddBarcodeScanner(),也無法將其註入到 ASP.NET Core 中間件或Azure 功能中。
不支援 ASP.NET Core 或 Azure 函數。 ML Kit 需要 Android 或 iOS 運行時環境。 它無法在 Linux 上的 Web API 進程、Azure 函數、Windows 伺服器或 Docker 容器中執行。 如果您的用例是伺服器端條碼處理(接受映像並傳回條碼資料的 REST 端點、文件處理管道、批次作業),則無論綁定是否可用,ML Kit 在架構上都是不相容的。
僅支援攝影機或影格輸入-不支援文件或 PDF。 ML Kit 的 InputImage 可由 Bitmap、ByteBuffer 或 Android 檔案系統上的檔案 URI 建構。 沒有處理 PDF 文件、迭代頁面或處理多頁 TIFF 的概念。 伺服器端文檔處理完全超出了該產品的範圍。
依賴 Google Play 服務。裝置上的機器學習模型透過 Google Play 服務運作。 沒有 Google Play 服務的裝置(例如客製化的 Android 系統、某些企業裝置、亞馬遜 Fire 平板電腦)無法使用預設的 ML Kit 配置。 "捆綁"模型選項(com.google.mlkit:barcode-scanning-bundled)可以解決這個問題,但會顯著增加 APK 的大小。
將 Android ML Kit 程式碼移植到 .NET
如果您有一個現有具有 ML Kit 條碼掃描功能的 Android 應用,並且您正在將其移植到 .NET MAUI 或 .NET 9,以下是翻譯內容。 Kotlin 程式碼使用了 ML Kit 的回呼模式; C# 程式碼使用了IronBarcode的同步 API。
// Android Kotlin: ML Kit
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(Barcode.FORMAT_QR_CODE, Barcode.FORMAT_CODE_128)
.build()
val scanner = BarcodeScanning.getClient(options)
val inputImage = InputImage.fromFilePath(context, uri)
scanner.process(inputImage)
.addOnSuccessListener { barcodes ->
for (barcode in barcodes) {
val rawValue = barcode.rawValue
val format = barcode.format
}
}
.addOnFailureListener { e -> Log.e("MLKit", e.message ?: "") }
// .NET C#: IronBarcode
// NuGet: dotnet add package IronBarcode
using IronBarCode;
var results = BarcodeReader.Read("captured-image.jpg");
foreach (var barcode in results)
{
Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}
// .NET C#: IronBarcode
// NuGet: dotnet add package IronBarcode
using IronBarCode;
var results = BarcodeReader.Read("captured-image.jpg");
foreach (var barcode in results)
{
Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}
Imports IronBarCode
Dim results = BarcodeReader.Read("captured-image.jpg")
For Each barcode In results
Console.WriteLine($"{barcode.Format}: {barcode.Value}")
Next
結構上的差異不僅體現在句法上。 ML Kit 版本設定了一個掃描器對象,構造了一個 InputImage,調用了 scanner.process(),並註冊了成功和失敗回調。 如果您需要在繼續之前獲得結果,則必須將回調執行與其餘邏輯協調起來——通常是透過 Java 中的 CountDownLatch 或 Kotlin 中的協程。
IronBarcode 的 BarcodeReader.Read() 同步回傳結果集。 你立即迭代它。 沒有回調註冊,沒有線程同步,也不需要管理單獨的掃描器物件。
對於移植 Android 程式碼的團隊來說,多條碼場景的模式轉換如下所示:
// .NET C#:IronBarcode— reading multiple barcodes with options
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectedBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};
var results = BarcodeReader.Read("image.jpg", options);
foreach (var barcode in results)
{
Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}");
}
// .NET C#:IronBarcode— reading multiple barcodes with options
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectedBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};
var results = BarcodeReader.Read("image.jpg", options);
foreach (var barcode in results)
{
Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}");
}
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.ExpectedBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128
}
Dim results = BarcodeReader.Read("image.jpg", options)
For Each barcode In results
Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}")
Next
ExpectedBarcodeTypes 標誌相當於 ML Kit 的 setBarcodeFormats()。 設定此設定可以縮小搜尋範圍並提高效能,但與 ML Kit 不同,不設定此設定不會中斷讀取——IronBarcode 將嘗試所有支援的格式。
格式覆蓋率比較
這兩款工具都涵蓋了主流的 2D 和 1D 格式。 重疊部分相當大。
| 格式 | ML Kit(Android) | IronBarcode |
|---|---|---|
| QR 圖碼 | 是 | 是 |
| EAN-13 | 是 | 是 |
| EAN-8 | 是 | 是 |
| UPC-A | 是 | 是 |
| UPC-E | 是 | 是 |
| 代碼 128 | 是 | 是 |
| 代碼 39 | 是 | 是 |
| 代碼93 | 是 | 是 |
| 科達巴爾 | 是 | 是 |
| 國際電信聯盟 | 是 | 是 |
| PDF417 | 是 | 是 |
| 數據矩陣 | 是 | 是 |
| 阿茲特克 | 是 | 是 |
| 代碼 11 | 無 | 是 |
| MSI Plessey | 無 | 是 |
| 藥典 | 無 | 是 |
| 交錯式 2/5 | 透過國際運輸論壇 | 是 |
| RSS-14 / GS1 資料條 | 無 | 是 |
| 微型 QR | 無 | 是 |
| MaxiCode | 無 | 是 |
IronBarcode 支援 50 多種編碼類型,涵蓋讀取和產生。 ML Kit 的格式清單固定為 Google 模型自帶的格式清單—您無法新增自訂符號系統。
IronBarcode的優勢
除了閱讀之外,IronBarcode 還涵蓋了完整的條碼工作流程:
生成。 ML Kit 完全沒有產生 API——它讀取條碼,但不建立條碼。IronBarcode可將任何支援的格式產生為 PNG、JPEG、SVG、HTML 或二進位資料。
// Generate a 代碼 128 barcode to file
BarcodeWriter.CreateBarcode("SHIP-20240312-7834", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// Generate a 代碼 128 barcode to file
BarcodeWriter.CreateBarcode("SHIP-20240312-7834", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
' Generate a 代碼 128 barcode to file
BarcodeWriter.CreateBarcode("SHIP-20240312-7834", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
二維碼定制。 QRCodeWriter支援嵌入徽標、更改顏色和錯誤校正等級——這些功能 ML Kit 不具備,因為 ML Kit 本身並不會產生任何內容。
// QR code with embedded logo and custom color
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500)
.AddBrandLogo("company-logo.png")
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue)
.SaveAsPng("product-qr.png");
// QR code with embedded logo and custom color
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500)
.AddBrandLogo("company-logo.png")
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue)
.SaveAsPng("product-qr.png");
' QR code with embedded logo and custom color
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500) _
.AddBrandLogo("company-logo.png") _
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue) _
.SaveAsPng("product-qr.png")
PDF 處理。 BarcodeReader.Read("document.pdf") 可原生讀取 PDF 每頁的條碼。 無需圖像提取步驟,無需使用單獨的 PDF 庫逐頁循環——它直接處理 PDF。
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
}
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
}
Imports System
' Read all barcodes from every page of a PDF
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}")
Next
IronBarcode支援伺服器端和雲端運行,可在Windows、Linux、macOS、Docker、Azure Functions和AWS Lambda上運行。 無需谷歌Play服務,沒有攝像頭,也沒有移動運行時環境。
二進制輸出。 .ToPngBinaryData() 直接傳回 byte[] — 適用於以 HTTP 回應形式傳回條碼映像而不寫入磁碟的 API。
// Generate barcode and return as byte array (e.g., in a web API)
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-8821", BarcodeEncoding.QRCode)
.ToPngBinaryData();
// Generate barcode and return as byte array (e.g., in a web API)
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-8821", BarcodeEncoding.QRCode)
.ToPngBinaryData();
' Generate barcode and return as byte array (e.g., in a web API)
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("ORDER-8821", BarcodeEncoding.QRCode) _
.ToPngBinaryData()
功能比較
| 特點 | Google ML Kit 條碼 | IronBarcode |
|---|---|---|
| .NET / C# API | 無(無 NuGet 套件) | 是的 — using IronBarCode; |
| NuGet 套件 | 無 | IronBarcode |
| 條碼讀取 | 是的(僅限安卓/iOS系統) | 是的(所有平台) |
| 條碼生成 | 無 | 是的(50多種格式) |
| 二維碼生成 | 無 | 是 |
| QR 圖碼標誌嵌入 | 無 | 是 |
| PDF 輸入支援 | 無 | 是的(母語) |
| 檔案輸入(PNG/JPEG) | 是的(透過 InputImage URI) | 是 |
| 攝影機/影格輸入 | 是的(主要用例) | 透過影像檔案 |
| 伺服器端處理 | 無 | 是 |
| ASP.NET Core 支援 | 無 | 是 |
| Azure 功能 | 無 | 是 |
| Docker / Linux | 無 | 是 |
| Windows 應用程式支援 | 否(僅限安卓/iOS系統) | 是 |
| Google Play 服務部門 | 是的(標準型號) | 無 |
| Firebase 依賴項(iOS) | 是 | 無 |
| Async/await C# API | 無 | 同步(符合 .NET 模型) |
| 一張圖中包含多個條碼 | 是 | 是 |
| 社群 .NET 綁定 | 非官方、不穩定 | 不適用(原生 .NET) |
| 定價 | 免費(作為 Google Play 的一部分) | $749 起永久 |
API概念圖
由於沒有官方的 .NET ML Kit API,因此這種映射是概念性的——它顯示了每個 ML Kit 操作的意圖以及IronBarcode的等效操作。
| ML Kit(Kotlin/Java 概念) | IronBarcode(.NET C#) |
|---|---|
BarcodeScannerOptions.Builder() |
new BarcodeReaderOptions { } |
.setBarcodeFormats(FORMAT_QR_CODE) |
ExpectedBarcodeTypes = BarcodeEncoding.QRCode |
BarcodeScanning.getClient(options) |
靜態-無需掃描器對象 |
InputImage.fromFilePath(context, uri) |
傳遞給 BarcodeReader.Read() 的檔案路徑字串 |
InputImage.fromBitmap(bitmap, rotation) |
BarcodeReader.Read(stream) 或位元組數組重載 |
scanner.process(inputImage) |
BarcodeReader.Read(path, options) |
.addOnSuccessListener { barcodes -> } |
傳回值 Read() — 直接迭代 |
.addOnFailureListener { e -> } |
標準嘗試/接球 |
barcode.rawValue |
barcode.Value |
barcode.format |
barcode.Format |
barcode.boundingBox |
barcode.BarcodeImage(區域資料) |
Barcode.FORMAT_QR_CODE |
BarcodeEncoding.QRCode |
Barcode.FORMAT_CODE_128 |
BarcodeEncoding.Code128 |
| 無生成 API | BarcodeWriter.CreateBarcode() |
| 無生成 API | QRCodeWriter.CreateQrCode() |
Speed / 模型選擇 |
ReadingSpeed.Balanced / .Faster / .Detailed |
何時考慮使用 IronBarcode
將 Android 應用程式移植到 .NET MAUI 或 .NET 9。如果您的 Android 應用程式使用 ML Kit 進行條碼掃描,並且您正在建立一個等效的 .NET 應用,那麼IronBarcode就是您的理想選擇。 概念轉換很簡單-讀取文件,取得結果,迭代值。
伺服器端條碼處理。任何涉及掃描條碼的 HTTP 端點、處理上傳影像的後台作業或從 PDF 中提取條碼的文件工作流程的場景。 ML Kit 無法參與上述任何活動。
Windows桌面應用程式。 Windows平台上的WinForms、WPF或.NET MAUI。 ML Kit 完全無法在 Windows 系統上運作。
不支援 Google Play 服務的環境。如果您的 Android 部署包含不支援 Google Play 服務的裝置(例如企業級硬體、自訂 AOSP 版本、Amazon Fire 裝置),則標準 ML Kit 模型不可用。IronBarcode並沒有這樣的依賴項。
產生與讀取並存。如果您需要同時產生和讀取條碼(例如,列印貨運標籤和驗證掃描結果),IronBarcode 可以在同一個庫中處理這兩項操作。 ML Kit 既不處理生成,也不處理伺服器端讀取。
無論是 Azure 或 AWS 部署, Azure Functions、Linux 上的 Azure 應用程式服務、AWS Lambda 都無法託管 ML Kit。 IronBarcode的目標客戶都是他們。
授權與定價
Google ML Kit 條碼掃描功能免費提供給 Android 和 iOS 應用程式使用。無需支付每次掃描費用,也無需商業許可。 這種定價模式在其預期的應用程式場景中是合理的——原生行動程式庫與 Google Play 服務捆綁在一起。
IronBarcode 是一個商業性的 .NET 函式庫,採用永久授權:
-精簡版: 749 美元 — 1 位開發者,1 個專案地點 此外: $1499 美元—最多可供 3 位開發者使用 -專業版: 2,999 美元 — 最多 10 位開發人員 -無限: 5,999 美元 — 無限開發者
免費試用不限時長; 試驗水印產生了條碼。 對於已經付費購買伺服器基礎設施來處理文件的團隊來說,許可證成本通常只是維護非官方 ML Kit 綁定所需工程工作的一小部分。
結論
Google ML Kit 條碼掃描是一個精心設計的函式庫,它能夠完美地完成其設計目標:在 Android 和 iOS 裝置上快速準確地掃描條碼。 與IronBarcode的比較與其說是比較哪個函式庫比較好,不如說是比較哪個函式庫能夠在你需要的場景下運作。
如果你正在用 Kotlin 為 Android 編寫應用程式並使用相機進行掃描,那麼 ML Kit 是一個絕佳的選擇。但如果你正在用 C# 為 .NET 編寫應用程式——無論是 Web API、文件處理服務、Windows 應用程式、雲端函數或跨平台的 MAUI 應用程式——Google ML Kit 都無法滿足你的需求。 沒有 NuGet 套件,沒有 C# API,也沒有 Google 支援的在託管程式碼中使用它的途徑。IronBarcode是一個原生的 .NET 函式庫,涵蓋了 .NET 支援的所有平台上的讀取和產生功能。
常見問題解答
什麼是 Google ML Kit 條碼掃描?
Google ML Kit 條碼掃描是一個 .NET 條碼庫,用於在 C# 應用程式中產生和讀取條碼。它是開發人員在為 .NET 專案選擇條碼解決方案時評估的幾個替代方案之一。
Google ML Kit 條碼掃描和 IronBarcode 的主要差異是什麼?
IronBarcode 使用靜態、無狀態的 API,無需實例管理,而 Google ML Kit 條碼掃描通常需要在使用前建立和設定實例。 IronBarcode 還提供原生 PDF 支援、自動格式偵測以及跨所有環境的單金鑰許可。
IronBarcode 的授權是否比 Google ML Kit 條碼掃描更容易?
IronBarcode 使用單一授權金鑰,同時涵蓋開發和生產部署。與將 SDK 金鑰與執行時間金鑰分開的授權系統相比,這簡化了 CI/CD 管線和 Docker 配置。
IronBarcode 是否支援 Google ML Kit 條碼掃描支援的所有條碼格式?
IronBarcode 支援超過 30 種條碼符號體系,包括 QR 碼、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1 等等。格式自動偵測功能意味著無需明確枚舉格式。
IronBarcode是否支援原生PDF條碼讀取?
是的。 IronBarcode 可以直接從 PDF 檔案讀取條碼,使用 `BarcodeReader.Read("document.pdf")` 方法,無需單獨的 PDF 渲染庫。每頁的讀取結果包括頁碼、條碼格式、數值和置信度評分。
與 Google ML Kit 條碼掃描相比,IronBarcode 在批次處理方面有何不同?
IronBarcode 的靜態方法是無狀態的,且天然執行緒安全,因此可以直接使用 Parallel.ForEach,而無需進行執行緒層級實例管理。所有定價層級均無吞吐量上限。
IronBarcode支援哪些.NET版本?
IronBarcode 在單一 NuGet 套件中支援 .NET Framework 4.6.2+、.NET Core 3.1 以及 .NET 5、6、7、8 和 9。平台目標包括 Windows x64/x86、Linux x64 和 macOS x64/ARM。
如何在.NET專案中安裝IronBarcode?
透過 NuGet 安裝 IronBarcode:在程式包管理器控制台中執行“Install-Package IronBarCode”,或在命令列介面中執行“dotnet add package IronBarCode”。無需其他 SDK 安裝程式或運行時檔案。
與 Google ML Kit 不同,我可以在購買前評估 IronBarcode 嗎?
是的。 IronBarcode 的試用模式會傳回完整的解碼條碼值-只有產生的輸出影像才會有浮水印。您可以在購買前,用自己的文件測試讀取準確率。
Google ML Kit 條碼掃描和 IronBarcode 的價格有什麼不同?
IronBarcode 的永久單開發者許可證起價為 749 美元,涵蓋開發和生產環境。定價詳情和大量許可選項請造訪 IronBarcode 授權頁面。無需單獨的運行時許可證。
從 Google ML Kit 條碼掃描遷移到 IronBarcode 是否簡單?
從 Google ML Kit 條碼掃描遷移到 IronBarcode 主要涉及將基於實例的 API 呼叫替換為 IronBarcode 的靜態方法、移除許可相關的樣板代碼以及更新結果屬性名稱。大多數遷移都是減少程式碼,而不是增加程式碼。
IronBarcode 能產生帶有 logo 的二維碼嗎?
是的。 `QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以將品牌圖片原生嵌入二維碼中,並支援設定糾錯功能。此外,它還支援透過 `ChangeBarCodeColor()` 函數建立彩色二維碼。

