Migrating from Kit de aprendizado de máquina do Google Barcode Scanning to IronBarcode
Este guia destina-se a equipes em uma das duas situações: você está migrando um aplicativo Android for .NET MAUI ou .NET 9 e precisa substituir o leitor de código de barras do ML Kit por uma alternativa gerenciada, ou você recebeu a recomendação do Kit de aprendizado de máquina do Google em uma discussão sobre código de barras multiplataforma e descobriu — ao tentar adicionar o pacote NuGet — que ele não existe.
O Kit de aprendizado de máquina do Google Barcode Scanning é uma biblioteca nativa para Android e iOS. Ele vem como uma dependência Maven (com.google.mlkit:barcode-scanning:17.3.0 agrupada, ou com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 não agrupada) para Kotlin/Java e como um CocoaPod (GoogleMLKit/BarcodeScanning) para Swift. O ML Kit tem sido um produto independente desde junho de 2020 e não requer mais o Firebase, mas não há um SDK oficial para .NET, não há dotnet add package google-mlkit-barcode, e não há uma API C# de primeira parte do Google. Vínculos Xamarin/MAUI mantidos pela comunidade apareceram ao longo dos anos, mas eles quebram quando o ML Kit atualiza seu SDK subjacente.
IronBarcode é uma biblioteca nativa do .NET que é instalada a partir do NuGet, integra-se com padrões .NET padrão e funciona no Windows, Linux, macOS, Docker, Azure e AWS. Este guia mostra como traduzir os padrões que você escreveu em Kotlin ou Java para código C# equivalente.
O Contexto de Portabilidade
Ao migrar do ML Kit para o IronBarcode, algumas coisas mudam estruturalmente — e não apenas sintaticamente:
Callbacks se tornam valores de retorno. O ML Kit usa a API do Android Task com addOnSuccessListener e addOnFailureListener. BarcodeReader.Read() do IronBarcode retorna uma coleção de forma síncrona. Você itera diretamente. Sem registro de retorno de chamada, sem coordenação de threads.
Nenhum objeto scanner. O ML Kit requer que você construa um objeto BarcodeScannerOptions, chame BarcodeScanning.getClient(options) para obter uma instância de scanner, e então chame scanner.process(inputImage). O IronBarcode usa métodos estáticos — BarcodeReader.Read() é o ponto de entrada. Não há instâncias para gerenciar ou descartar.
Nenhuma construção de InputImage. O InputImage do ML Kit deve ser construído a partir de uma fonte específica do Android: InputImage.fromFilePath(context, uri), InputImage.fromBitmap(bitmap, rotation), ou InputImage.fromMediaImage(image, rotation). O IronBarcode aceita uma string de caminho de arquivo, um Stream, um byte[], ou um System.Drawing.Bitmap. Sem contexto do Android, sem URI, sem metadados de rotação.
Sem Google Play Services. O modelo não embutido do ML Kit executa através dos Google Play Services. A variante embutida leva o modelo dentro do APK (adicionando cerca de 2,4 MB) e evita a verificação dos Play Services, mas nenhuma variante está disponível para alvos .NET. O IronBarcode não possui essa dependência — ele funciona de forma idêntica em qualquer plataforma compatível com o .NET .
Configuração rápida em .NET
Remova quaisquer pacotes de vinculação do Xamarin/MAUI ML Kit que existam em seu projeto e, em seguida, instale o IronBarcode:
Adicione a chave de licença na inicialização do aplicativo — em Program.cs, MauiProgram.cs, ou Startup.cs, dependendo do tipo do seu aplicativo:
// NuGet: dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"A licença pode ser definida em qualquer ponto antes da primeira chamada BarcodeReader.Read() ou BarcodeWriter.CreateBarcode(). Está disponível um período de teste gratuito; O modo de avaliação gera marcas d'água com códigos de barras, mas não restringe a leitura.
Leitura de códigos de barras: Kotlin para C#
Leitura básica de código de barras único
Aqui está um exemplo típico de leitura do ML Kit em Kotlin, que escaneia um único código QR de um URI de arquivo:
// 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}")
}
O equivalente em C# com 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}");
}Imports IronBarCode
Try
Dim results = BarcodeReader.Read("captured-image.jpg")
Dim barcode = results.FirstOrDefault()
If barcode IsNot Nothing Then
Console.WriteLine($"Value: {barcode.Value}")
Console.WriteLine($"Format: {barcode.Format}")
End If
Catch ex As Exception
Console.WriteLine($"Scan failed: {ex.Message}")
End TryO resultado está disponível imediatamente como um valor de retorno. barcode.Value corresponde a barcode.rawValue. barcode.Format corresponde a barcode.format. O tratamento de erros utiliza o padrão try/catch em vez de um ouvinte de falhas separado.
Leitura de múltiplos códigos de barras
O ML Kit escaneia um único InputImage e retorna uma lista. Para vários códigos de barras em uma imagem, você itera a lista do ouvinte de sucesso:
// 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") }
Com o IronBarcode, defina ExpectMultipleBarcodes = true em BarcodeReaderOptions e itere a coleção de resultados:
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);
}Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read("warehouse-shelf.jpg", options)
For Each barcode In results
Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}")
ProcessBarcode(barcode.Value, barcode.Format)
NextEspecificação de formato: defina os formatos de código de barras como Opções do Leitor de Código de Barras
O ML Kit requer que você especifique quais formatos procurar via setBarcodeFormats(). Se você omitir esse parâmetro, o ML Kit pesquisará em todos os formatos. O IronBarcode funciona da mesma forma — omitir as restrições de formato permite a busca em tudo, mas especificar os tipos esperados melhora o desempenho.
| Kit ML Kotlin | IronBarcode C# |
|---|---|
Barcode.FORMAT_QR_CODE | BarcodeEncoding.QRCode |
Barcode.FORMAT_CODE_128 | BarcodeEncoding.Code128 |
Barcode.FORMAT_CODE_39 | BarcodeEncoding.Code39 |
Barcode.FORMAT_CODE_93 | BarcodeEncoding.Code93 |
Barcode.FORMAT_EAN_13 | BarcodeEncoding.EAN13 |
Barcode.FORMAT_EAN_8 | BarcodeEncoding.EAN8 |
Barcode.FORMAT_UPC_A | BarcodeEncoding.UPCA |
Barcode.FORMAT_UPC_E | BarcodeEncoding.UPCE |
Barcode.FORMAT_PDF417 | BarcodeEncoding.PDF417 |
Barcode.FORMAT_DATA_MATRIX | BarcodeEncoding.DataMatrix |
Barcode.FORMAT_AZTEC | BarcodeEncoding.Aztec |
Barcode.FORMAT_ITF | BarcodeEncoding.ITF |
Barcode.FORMAT_CODABAR | BarcodeEncoding.Codabar |
Barcode.FORMAT_ALL_FORMATS | Omitir ExpectBarcodeTypes |
Utilizando sinalizadores de formatação no 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);Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128 Or BarcodeEncoding.EAN13
}
Dim results = BarcodeReader.Read("product-image.jpg", options)A combinação OR bit a bit funciona da mesma forma que a lista de formato vararg do ML Kit.
Acesso aos resultados: valor bruto e formato
O objeto de resultado do ML Kit expõe rawValue (um String?) e format (uma constante Int). O resultado do IronBarcode expõe Value (um string) e Format (um valor enumerado BarcodeEncoding).
// Kit ML Kotlin — result fields
val rawValue: String? = barcode.rawValue
val format: Int = barcode.format
val boundingBox: Rect? = barcode.boundingBox
val displayValue: String? = barcode.displayValue
//IronBarcode C#— result fields
string value = barcode.Value;
BarcodeEncoding format = barcode.Format;
int page = barcode.PageNumber; // populated for PDF / multi-page input
barcode.Value é sempre uma string não nula no IronBarcode— se a leitura tiver sucesso, o valor está presente. barcode.Format é o membro da enumeração BarcodeEncoding, que você pode comparar diretamente: if (barcode.Format == BarcodeEncoding.QRCode).
O que há de diferente no .NET?
API síncrona em vez de callbacks. Essa é a mudança estrutural mais significativa. O scanner.process() do ML Kit retorna um Task<List<Barcode>> no sentido do Android — você encadeia ouvintes. O BarcodeReader.Read() do IronBarcode retorna o resultado inline. Se você precisar executá-lo fora do thread da interface do usuário em um aplicativo MAUI, envolva-o em 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;
});
}Imports IronBarCode
Imports System.Threading.Tasks
Imports Microsoft.Maui.Dispatching
' In a MAUI ViewModel or page code-behind
Dim results = Await Task.Run(Function() BarcodeReader.Read(imagePath))
For Each barcode In results
' update UI on main thread
MainThread.BeginInvokeOnMainThread(Sub()
ResultLabel.Text = barcode.Value
End Sub)
NextNenhum parâmetro de contexto. Cada chamada do ML Kit que constrói um InputImage requer um Context do Android. O IronBarcode precisa apenas de um caminho de arquivo ou fluxo de dados. Remover o encadeamento de contexto da lógica do código de barras simplifica consideravelmente o código.
Sem Google Play Services. O modelo padrão do ML Kit é executado pelo Play Services — BarcodeScanning.getClient() verifica a disponibilidade do Play Services em tempo de execução e lança uma exceção se indisponível.IronBarcode não possui verificação de serviço em tempo de execução. Ou lê a imagem ou lança uma exceção padrão.
Tratamento de exceção padrão. O addOnFailureListener do ML Kit recebe uma subclasse Java Exception. Não .NET, falhas emergem como lançamentos padrão @@--CODE-1354@@, capturáveis com try/catch da forma normal.
Leitura de documentos PDF
O ML Kit não oferece suporte a PDF. InputImage.fromFilePath() com um URI .pdf falha ou lê apenas a primeira página como uma imagem rasterizada, dependendo da versão do Android. Se o seu cenário de portabilidade envolver documentos — processamento de faturas, manifestos logísticos, digitalização de formulários — o IronBarcode lida com PDFs nativamente:
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}");
}Imports IronBarCode
' Read all barcodes from all pages of a PDF
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read("invoice-batch.pdf", options)
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Format} — {barcode.Value}")
NextSem etapa de extração de imagem, sem biblioteca PDF de terceiros, sem loop de iteração de página com renderização separada. Forneça o caminho do PDF e obtenha todos os valores dos códigos de barras com seus respectivos números de página.
Novas capacidades: Geração
O ML Kit não gera códigos de barras — ele apenas os lê. Se a sua aplicação adaptada precisar gerar etiquetas, bilhetes ou códigos QR, o IronBarcode oferece essa funcionalidade no mesmo pacote.
Código 128 para etiquetas de envio:
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-2024-98341", BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.SaveAsPng("shipping-label.png");Imports IronBarCode
BarcodeWriter.CreateBarcode("SHIP-2024-98341", BarcodeEncoding.Code128) _
.ResizeTo(400, 120) _
.SaveAsPng("shipping-label.png")Geração de código QR:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/track/98341", 500)
.SaveAsPng("tracking-qr.png");Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com/track/98341", 500) _
.SaveAsPng("tracking-qr.png")Código QR com logotipo e cor:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500)
.AddBrandLogo("company-logo.png")
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue)
.SaveAsPng("product-qr.png");Imports IronBarCode
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500) _
.AddBrandLogo("company-logo.png") _
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue) _
.SaveAsPng("product-qr.png")Retorna o código de barras como um array de bytes para uma resposta HTTP:
using IronBarCode;
// In anASP.NET Corecontroller action
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-7734", BarcodeEncoding.QRCode)
.ToPngBinaryData();
return File(barcodeBytes, "image/png");
Nenhum desses padrões possui equivalentes no ML Kit. São novas funcionalidades disponíveis porque você está trabalhando em uma biblioteca completa de código de barras .NET, em vez de um scanner exclusivo para dispositivos móveis.
Processamento em lote no servidor
O ML Kit processa uma imagem por chamada, requer o ambiente de execução Android/iOS e não possui o conceito de execução no lado do servidor. O IronBarcode processa arquivos em um loop, é executado noASP.NET Coree escala normalmente:
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}");
}Imports IronBarCode
Imports System.IO
' Process a folder of scanned document images
Dim imageFiles = Directory.GetFiles("/data/scans", "*.jpg")
Dim allResults = New List(Of (File As String, Value As String, Format As BarcodeEncoding))()
For Each file In imageFiles
Dim options = New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Faster,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read(file, options)
For Each barcode In results
allResults.Add((file, barcode.Value, barcode.Format))
Next
Next
' Write results to CSV, database, etc.
For Each result In allResults
Console.WriteLine($"{result.File}: [{result.Format}] {result.Value}")
NextEsse padrão — ler uma pasta de imagens, extrair códigos de barras e agregar resultados — não é possível com o ML Kit. É um fluxo de trabalho padrão do IronBarcode.
Comparação de recursos
| Recurso | Kit de aprendizado de máquina do Google | IronBarcode |
|---|---|---|
| Pacote NuGet .NET | None | BarCode |
| API C# / .NET | None | Sim |
| Leitura de código de barras | Sim (Android/iOS) | Sim (todas as plataformas) |
| Geração de código de barras | Não | Sim |
| Geração de código QR | Não | Sim |
| Incorporação de logotipo QR | Não | Sim |
| Entrada de PDF | Não | Sim |
| Suporte para documentos com várias páginas | Não | Sim |
| Entrada de câmera/quadro | Sim | Por meio de arquivo de imagem |
| Implantação no lado do servidor | Não | Sim |
| ASP.NET Core | Não | Sim |
| Azure Functions | Não | Sim |
| Docker / Linux | Não | Sim |
| Serviços do Google Play necessários | Variante não embutida apenas | Não |
| Dependência Firebase | Não (autônomo desde junho de 2020) | Não |
| API .NET síncrona | Não | Sim |
| Compatível com injeção de dependência | Não | Sim (API estática) |
ExpectMultipleBarcodes opção | Por meio da lista de resultados | BarcodeReaderOptions |
| Especificação de formato | setBarcodeFormats() | ExpectBarcodeTypes |
| equilíbrio entre velocidade e precisão | Fixo (baseado em modelo) | ReadingSpeed enum |
| Preços | Grátis (no dispositivo, apenas móvel) | A partir de $999 (Lite) perpétua |
| Plataformas | Android, iOS | Windows, Linux, macOS, Docker, Azure, AWS |
Lista de verificação para migração
Se você estiver migrando um código-fonte do Android ou substituindo uma vinculação não oficial do Xamarin ML Kit, procure esses padrões em seu projeto e aplique as traduções acima:
com.google.mlkit:barcode-scanningem arquivos Gradle → remova, adicioneBarCodeNuGetBarcodeScannerOptions.Builder()→new BarcodeReaderOptions { }BarcodeScanning.getClient(options)→ remova (nenhuma instância de scanner no IronBarcode)InputImage.fromFilePath(context, uri)→ argumento de string de caminho de arquivoInputImage.fromBitmap(bitmap, rotation)→BarcodeReader.Read(stream)ou sobrecarga de array de bytesscanner.process(inputImage)→BarcodeReader.Read(path, options).addOnSuccessListener { barcodes -> }→ iterar valor de retorno deRead().addOnFailureListener { e -> }→ try/catch em torno deRead()barcode.rawValue→barcode.Valuebarcode.format→barcode.FormatBarcode.FORMAT_QR_CODE→BarcodeEncoding.QRCodeBarcode.FORMAT_CODE_128→BarcodeEncoding.Code128Barcode.FORMAT_ALL_FORMATS→ omitirExpectBarcodeTypesusing Google.MLKit.BarcodeScanning;(vinculação Xamarin) →using IronBarCode;IronBarCode.License.LicenseKeydeve ser definido emMauiProgram.cs,Program.cs, ouStartup.cs
A principal tarefa consiste na mudança estrutural de código baseado em callbacks para código síncrono. As constantes de formato e os nomes dos campos de resultado são mapeamentos diretos. O suporte para PDF e geração de arquivos é puramente aditivo — não requer migração, apenas novo código.

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais bem estruturados e visualmente atraentes.