IRONSOFTWAREHOME
影片

從Google ML Kit條碼掃描遷移到IronBarcode

Curtis Chau
Curtis Chau
Updated: 2026年6月20日

本指南適用於兩種情況的團隊:您正在將Android應用程式移植到.NET MAUI或.NET 9,並需要替換ML Kit的條碼掃描器,或者在跨平台條碼討論中被推薦使用Google ML Kit,並且在嘗試加入NuGet套件時發現它不存在。

Google ML Kit條碼掃描是一個原生的Android和iOS程式庫。 它作為一個Maven依賴項(GoogleMLKit/BarcodeScanning)提供給Swift。 ML Kit自2020年6月以來成為一個獨立產品,不再需要Firebase,但並沒有官方的.NET SDK,沒有dotnet add package google-mlkit-barcode,也沒有來自Google的第一方C# API。 社群維護的Xamarin/MAUI綁定這些年來已經出現,但當ML Kit更新其底層SDK時,它們會失效。

IronBarcode是一個原生的.NET程式庫,可以從NuGet安裝,整合到標準的.NET模式中,並在Windows、Linux、macOS、Docker、Azure和AWS上運行。 本指南展示如何將您在Kotlin或Java中寫的模式轉換成等效的C#程式碼。

移植背景

從ML Kit移植到IronBarcode時,結構上有幾個變化——不僅僅是語法上的:

回呼變成返回值。 ML Kit使用Android的Task API,使用addOnFailureListener。 IronBarcode的BarcodeReader.Read()同步返回一個集合。 您可以直接迭代它。 無需回呼註冊,無需執行緒協調。

無掃描器物件。 ML Kit要求您構建一個scanner.process(inputImage)。 IronBarcode使用靜態方法——BarcodeReader.Read()是進入點。 無需管理或處置實例。

無InputImage構造。 ML Kit的InputImage.fromMediaImage(image, rotation)。 IronBarcode接受檔案路徑字串、System.Drawing.Bitmap。 無需Android上下文,無需URI,無需旋轉元資料。

無Google Play Services。 未打包的ML Kit模型通過Google Play Services運行。 打包變體將模型引入APK內部(約增加2.4 MB),避免了Play Services檢查,但這兩個變體都無法在.NET目標上使用。 IronBarcode無此類依賴——它以.NET支援的任何平台上相同運行。

.NET中的快速設置

如果您的專案中存在任何Xamarin/MAUI ML Kit綁定套件,請將其移除,然後安裝IronBarcode:

dotnet add package BarCode

在應用程式啟動時新增授權密鑰——基於應用程式型別,這可以在Startup.cs中完成:

// NuGet: dotnet add package BarCode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

可以在第一次BarcodeWriter.CreateBarcode()調用之前的任何點設置授權。 免費試用可用; 試用模式會水印生成的條碼,但不會限制讀取。

閱讀條碼:從Kotlin到C#

基本單一條碼讀取

這是Kotlin中典型的ML Kit讀取,一個檔案URI中的單一QR碼掃描:

// Android Kotlin — ML Kit
val options = BarcodeScannerOptions.Builder()
    .setBarcodeFormats(Barcode.FORMAT_QR_CODE)
    .build()
val scanner = BarcodeScanning.getClient(options)
val inputImage = InputImage.fromFilePath(context, imageUri)

scanner.process(inputImage)
    .addOnSuccessListener { barcodes ->
        val barcode = barcodes.firstOrNull()
        if (barcode != null) {
            Log.d("MLKit", "Value: ${barcode.rawValue}")
            Log.d("MLKit", "Format: ${barcode.format}")
        }
    }
    .addOnFailureListener { e ->
        Log.e("MLKit", "Scan failed: ${e.message}")
    }
Text

在C#中使用IronBarcode的等效程式碼:

using IronBarCode;

try
{
    var results = BarcodeReader.Read("captured-image.jpg");
    var barcode = results.FirstOrDefault();
    if (barcode != null)
    {
        Console.WriteLine($"Value: {barcode.Value}");
        Console.WriteLine($"Format: {barcode.Format}");
    }
}
catch (Exception ex)
{
    Console.WriteLine($"Scan failed: {ex.Message}");
}

結果立即作為返回值可用。 barcode.rawValuebarcode.format。 錯誤處理使用標準的try/catch,而非單獨的故障監聽器。

多條碼讀取

ML Kit掃描單個InputImage並返回列表。對於一幅圖像中的多個條碼,您迭代成功監聽器的列表:

// Android Kotlin — ML Kit, multiple barcodes
val options = BarcodeScannerOptions.Builder()
    .setBarcodeFormats(Barcode.FORMAT_ALL_FORMATS)
    .build()
val scanner = BarcodeScanning.getClient(options)
val inputImage = InputImage.fromFilePath(context, imageUri)

scanner.process(inputImage)
    .addOnSuccessListener { barcodes ->
        for (barcode in barcodes) {
            val rawValue = barcode.rawValue
            val format = barcode.format
            processBarcode(rawValue, format)
        }
    }
    .addOnFailureListener { e -> Log.e("MLKit", e.message ?: "Unknown error") }
Text

使用IronBarcode,設置BarcodeReaderOptions中,並迭代結果集合:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};

var results = BarcodeReader.Read("warehouse-shelf.jpg", options);
foreach (var barcode in results)
{
    Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}");
    ProcessBarcode(barcode.Value, barcode.Format);
}

格式規範:從setBarcodeFormats到BarcodeReaderOptions

ML Kit要求您通過setBarcodeFormats()指定要查找的格式。 如果您省略它,ML Kit會搜索所有格式。 IronBarcode的工作方式相同——省略格式限制會搜索所有格式,但指定預期型別可以提高性能。

ML Kit KotlinIronBarcodeC#
Barcode.FORMAT_QR_CODEBarcodeEncoding.QRCode
Barcode.FORMAT_CODE_128BarcodeEncoding.Code128
Barcode.FORMAT_CODE_39BarcodeEncoding.Code39
Barcode.FORMAT_CODE_93BarcodeEncoding.Code93
Barcode.FORMAT_EAN_13BarcodeEncoding.EAN13
Barcode.FORMAT_EAN_8BarcodeEncoding.EAN8
Barcode.FORMAT_UPC_ABarcodeEncoding.UPCA
Barcode.FORMAT_UPC_EBarcodeEncoding.UPCE
Barcode.FORMAT_PDF417BarcodeEncoding.PDF417
Barcode.FORMAT_DATA_MATRIXBarcodeEncoding.DataMatrix
Barcode.FORMAT_AZTECBarcodeEncoding.Aztec
Barcode.FORMAT_ITFBarcodeEncoding.ITF
Barcode.FORMAT_CODABARBarcodeEncoding.Codabar
Barcode.FORMAT_ALL_FORMATS省略ExpectBarcodeTypes

在IronBarcode中使用格式標誌:

using IronBarCode;

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128 | BarcodeEncoding.EAN13
};

var results = BarcodeReader.Read("product-image.jpg", options);

按位或組合與ML Kit的可變參數格式列表的工作方式相同。

結果存取:rawValue和format

ML Kit的結果物件公開Int常數)。 IronBarcode的結果公開BarcodeEncoding列舉值)。

// ML Kit Kotlin — result fields
val rawValue: String? = barcode.rawValue
val format: Int = barcode.format
val boundingBox: Rect? = barcode.boundingBox
val displayValue: String? = barcode.displayValue
Text
//IronBarcodeC# — result fields
string value = barcode.Value;
BarcodeEncoding format = barcode.Format;
int page = barcode.PageNumber; // populated for PDF / multi-page input
C#

barcode.Value在IronBarcode中始終是一個非空字串——如果讀取成功,值存在。 if (barcode.Format == BarcodeEncoding.QRCode)

.NET中有什麼不同

**同步API而非回呼。**這是最重要的結構變化。 ML Kit的Task<List<Barcode>>——您可以串接監聽器。 IronBarcode的Task.Run()中:

using IronBarCode;

// In a MAUI ViewModel or page code-behind
var results = await Task.Run(() => BarcodeReader.Read(imagePath));
foreach (var barcode in results)
{
    // update UI on main thread
    MainThread.BeginInvokeOnMainThread(() =>
    {
        ResultLabel.Text = barcode.Value;
    });
}

無上下文參數。 每個構造InputImage的ML Kit調用需要Android Context。 IronBarcode僅需要一個檔案路徑或流。 從條碼邏輯中移除上下文執行緒大大簡化了程式碼。

無Google Play Services。 標準的ML Kit模型通過Play Services運行——BarcodeScanning.getClient()在運行時檢查Play Services的可用性,並在不可用時引發異常。 IronBarcode沒有運行時服務檢查。 它要麼讀取圖像,要麼拋出標準異常。

標準異常處理。 ML Kit的addOnFailureListener接收Java Exception子類。 在.NET中,故障以標準System.Exception拋出,在正常情況下可通過try/catch捕獲。

從PDF文件中讀取

ML Kit不支援PDF。 .pdf URI要麼失敗,要麼視Android版本而定僅讀取第一頁為光柵圖像。 如果您的移植場景涉及文件——例如發票處理、物流清單、表格掃描——IronBarcode可以原生處理PDF:

using IronBarCode;

// Read all barcodes from all pages of a PDF
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};

var results = BarcodeReader.Read("invoice-batch.pdf", options);
foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format}{barcode.Value}");
}

無需圖像提取步驟,無需第三方PDF程式庫,無需單獨的渲染的頁面迭代迴圈。 傳遞PDF路徑,返回所有條碼值及其頁碼。

新功能:生成

ML Kit不生成條碼——它只讀取它們。 如果您的移植應用程式需要生成標籤、票證或QR碼,IronBarcode可以使用相同套件解決。

碼128,用於運輸標籤:

using IronBarCode;

BarcodeWriter.CreateBarcode("SHIP-2024-98341", BarcodeEncoding.Code128)
    .ResizeTo(400, 120)
    .SaveAsPng("shipping-label.png");

QR碼生成:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/track/98341", 500)
    .SaveAsPng("tracking-qr.png");

帶有標誌和顏色的QR碼:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500)
    .AddBrandLogo("company-logo.png")
    .ChangeBarCodeColor(System.Drawing.Color.DarkBlue)
    .SaveAsPng("product-qr.png");

將條碼以字節陣列形式返回,以便HTTP回應:

using IronBarCode;

// In an ASP.NET Core controller action
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-7734", BarcodeEncoding.QRCode)
    .ToPngBinaryData();

return File(barcodeBytes, "image/png");

這些模式在ML Kit中無等效。 它們是因為您正在使用完整.NET條碼程式庫而非僅限移動的掃描器而提供的新功能。

伺服器端批次處理

ML Kit每呼叫處理一個圖像,需要Android/iOS運行時,並且不具有伺服器端執行的概念。 IronBarcode在迴圈中處理檔案,運行在ASP.NET Core,並正常擴展:

using IronBarCode;

// Process a folder of scanned document images
var imageFiles = Directory.GetFiles("/data/scans", "*.jpg");
var allResults = new List<(string File, string Value, BarcodeEncoding Format)>();

foreach (var file in imageFiles)
{
    var options = new BarcodeReaderOptions
    {
        Speed = ReadingSpeed.Faster,
        ExpectMultipleBarcodes = false
    };

    var results = BarcodeReader.Read(file, options);
    foreach (var barcode in results)
    {
        allResults.Add((file, barcode.Value, barcode.Format));
    }
}

// Write results to CSV, database, etc.
foreach (var (file, value, format) in allResults)
{
    Console.WriteLine($"{file}: [{format}] {value}");
}

此模式——讀取圖像文件夾,提取條碼,聚合結果——在ML Kit中不可能。 這是標準的IronBarcode工作流。

功能比較

功能Google ML KitIronBarcode
.NET NuGet套件NoneBarCode
C# / .NET APINone
條碼讀取是(Android/iOS)是(所有平台)
條碼生成
QR 碼生成
QR標誌嵌入
PDF輸入
多頁文件支援
相機/框架輸入通過圖片檔
伺服器端部署
ASP.NET Core
Azure 功能
Docker / Linux
需要Google Play Services僅未打包變體
需要Firebase依賴不(自2020年6月起獨立)
同步的.NET API
相容依賴注入是(靜態API)
ExpectMultipleBarcodes選項通過結果列表BarcodeReaderOptions
格式規範setBarcodeFormats()ExpectBarcodeTypes
速度/準確性權衡固定(基於模型)ReadingSpeed枚舉
價格免費(僅離線,僅移動)從$999(Lite)永久
平台Android, iOSWindows, Linux, macOS, Docker, Azure, AWS

遷移檢查清單

如果您正在移植Android程式碼庫或替換非官方的Xamarin ML Kit綁定,請在專案中搜尋這些模式並應用上面的翻譯:

  • Gradle檔中的com.google.mlkit:barcode-scanning → 删除,新增BarCode NuGet
  • BarcodeScannerOptions.Builder()new BarcodeReaderOptions { }
  • BarcodeScanning.getClient(options) → 删除(在IronBarcode中無掃描器實例)
  • InputImage.fromFilePath(context, uri) → 檔案路徑字串參數
  • InputImage.fromBitmap(bitmap, rotation)BarcodeReader.Read(stream)或字節陣列重載
  • scanner.process(inputImage)BarcodeReader.Read(path, options)
  • .addOnSuccessListener { barcodes -> } → 遍歷Read()的返回值
  • .addOnFailureListener { e -> } → 在Read()周圍嘗試/捕獲
  • barcode.rawValuebarcode.Value
  • barcode.formatbarcode.Format
  • Barcode.FORMAT_QR_CODEBarcodeEncoding.QRCode
  • Barcode.FORMAT_CODE_128BarcodeEncoding.Code128
  • Barcode.FORMAT_ALL_FORMATS → 省略ExpectBarcodeTypes
  • using Google.MLKit.BarcodeScanning;(Xamarin綁定) → using IronBarCode;
  • IronBarCode.License.LicenseKey 應該在Startup.cs中設定

從基於回呼的結構更改為同步程式碼是主要工作。 格式常數和結果字段名稱是直接映射。 PDF和生成支援是純粹的附加功能——它們不需要遷移,僅需新程式碼。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

...
閱讀更多

相關文章

Key in blue circle

立即免費取得 30 天試用金鑰

Your trial license will be sent to your email address

無任何限制。100% 解鎖。無需信用卡。

bullet_checked無需信用卡或建立帳號無任何限制。100% 解鎖。無需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預訂您的免費即時演示
Booking Badge

全球數百萬工程師信賴

Iron Software的客戶標誌
獲取您的無義務諮詢
完成下方表單或發送電子郵件至sales@ironsoftware.com
您的詳細資訊將始終保密。
全球數百萬工程師信賴
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立