Cómo Leer Códigos de Barras en C# for .NET 5 usando IronBarcode
Migrating from Kit de aprendizaje automático de Google Barcode Scanning to IronBarcode
Esta guía está dirigida a equipos que se encuentren en una de estas dos situaciones: están migrando una aplicación de Android a .NET MAUI o .NET 9 y necesitan reemplazar el escáner de códigos de barras de ML Kit por una alternativa administrada, o les recomendaron Kit de aprendizaje automático de Google en una conversación sobre códigos de barras multiplataforma y descubrieron, al intentar agregar el paquete NuGet , que no existe.
Google ML Kit Barcode Scanning es una biblioteca nativa para Android e iOS. Se distribuye como una dependencia de Maven (com.google.mlkit:barcode-scanning:17.3.0 agrupada, o com.google.android.gms:play-services-mlkit-barcode-scanning:18.3.1 no agrupada) para Kotlin/Java y como un CocoaPod (GoogleMLKit/BarcodeScanning) para Swift. ML Kit ha sido un producto independiente desde junio de 2020 y ya no requiere Firebase, pero no hay un SDK oficial para .NET, no dotnet add package google-mlkit-barcode, y no hay una API de C# de primera parte de Google. A lo largo de los años han aparecido enlaces Xamarin/MAUI mantenidos por la comunidad, pero se rompen cuando ML Kit actualiza su SDK subyacente.
IronBarcode es una biblioteca nativa de .NET que se instala desde NuGet, se integra con los patrones estándar de .NET y se ejecuta en Windows, Linux, macOS, Docker, Azure y AWS. Esta guía muestra cómo traducir los patrones que escribiste en Kotlin o Java a código C# equivalente.
El contexto de la portabilidad
Al migrar de ML Kit a IronBarcode, se producen algunos cambios estructurales, no solo sintácticos:
Las devoluciones de llamada se convierten en valores de retorno. ML Kit utiliza la API Task de Android con addOnSuccessListener y addOnFailureListener. El BarcodeReader.Read() de IronBarcode devuelve una colección de manera síncrona. Lo iteras directamente. Sin registro de devolución de llamada, sin coordinación de hilos.
No hay objeto escáner. ML Kit requiere que construyas un objeto BarcodeScannerOptions, llames a BarcodeScanning.getClient(options) para obtener una instancia de escáner, luego llames a scanner.process(inputImage). IronBarcode utiliza métodos estáticos; BarcodeReader.Read() es el punto de entrada. No hay ninguna instancia que gestionar o desechar.
Sin construcción de InputImage. El InputImage de ML Kit debe construirse desde una fuente específica de Android: InputImage.fromFilePath(context, uri), InputImage.fromBitmap(bitmap, rotation), o InputImage.fromMediaImage(image, rotation). IronBarcode acepta una cadena de ruta de archivo, un Stream, un byte[], o un System.Drawing.Bitmap. Sin contexto de Android, sin URI, sin metadatos de rotación.
No hay servicios de Google Play. El modelo de ML Kit no empaquetado se ejecuta a través de Google Play Services. La variante empaquetada envía el modelo dentro del APK (agregando aproximadamente 2.4 MB) y evita la verificación de Play Services, pero ninguna variante está disponible en objetivos .NET. IronBarcode no tiene esa dependencia: funciona de forma idéntica en cualquier plataforma compatible con .NET .
Configuración rápida en .NET
Elimine cualquier paquete de enlace de Xamarin/MAUI ML Kit si existen en su proyecto, luego instale IronBarcode:
dotnet add package BarCode
Agrega la clave de licencia al inicio de la aplicación, en Program.cs, MauiProgram.cs, o Startup.cs dependiendo del tipo de aplicación:
// NuGet: dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// NuGet: dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
La licencia se puede establecer en cualquier momento antes de la primera llamada BarcodeReader.Read() o BarcodeWriter.CreateBarcode(). Hay disponible una prueba gratuita; El modo de prueba aplica marcas de agua a los códigos de barras generados, pero no restringe la lectura.
Lectura de códigos de barras: de Kotlin a C
Lectura básica de un solo código de barras
Aquí se muestra una lectura típica de ML Kit en Kotlin, que escanea un único código QR desde una URI de archivo:
// 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}")
}
El equivalente en C# con 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}");
}
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 Try
El resultado está disponible inmediatamente como valor de retorno. barcode.Value corresponde a barcode.rawValue. barcode.Format corresponde a barcode.format. El manejo de errores utiliza el método try/catch estándar en lugar de un detector de errores independiente.
Lectura de múltiples códigos de barras
ML Kit escanea un único InputImage y devuelve una lista. Para múltiples códigos de barras en una imagen, debes iterar la lista del listener de éxito:
// 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") }
Con IronBarcode, ajusta ExpectMultipleBarcodes = true en BarcodeReaderOptions e itera la colección 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);
}
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)
Next
Especificación de formato: setBarcodeFormats a BarcodeReaderOptions
ML Kit requiere que especifiques qué formatos buscar a través de setBarcodeFormats(). Si lo omites, ML Kit buscará en todos los formatos. IronBarcode funciona de la misma manera: si se omiten las restricciones de formato, la búsqueda se realiza en todos los ámbitos, pero especificar los tipos esperados mejora el rendimiento.
| 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 |
Uso de indicadores de formato en 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);
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)
La combinación OR a nivel de bits funciona de la misma manera que la lista de formato vararg de ML Kit.
Acceso al resultado: rawValue y formato
El objeto de resultado de ML Kit expone rawValue (un String?) y format (una constante Int). El resultado de IronBarcode expone Value (un string) y Format (un valor enum 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
// IronBarcode C#— result fields
string value = barcode.Value;
BarcodeEncoding format = barcode.Format;
int page = barcode.PageNumber; // populated for PDF / multi-page input
' IronBarcode VB.NET— result fields
Dim value As String = barcode.Value
Dim format As BarcodeEncoding = barcode.Format
Dim page As Integer = barcode.PageNumber ' populated for PDF / multi-page input
barcode.Value siempre es una cadena no nula en IronBarcode; si la lectura tuvo éxito, el valor está presente. barcode.Format es el miembro enum BarcodeEncoding, al cual puedes comparar directamente: if (barcode.Format == BarcodeEncoding.QRCode).
¿Qué diferencias hay en .NET?
API síncrona en lugar de funciones de devolución de llamada. Este es el cambio estructural más significativo. El scanner.process() de ML Kit devuelve un Task<List<Barcode>> en el sentido de Android; encadenas listeners. El BarcodeReader.Read() de IronBarcode devuelve el resultado en línea. Si necesitas ejecutarlo fuera del hilo de la interfaz de usuario en una aplicación MAUI, envuélvelo en 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;
});
}
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)
Next
Sin parámetro de contexto. Cada llamada de ML Kit que construye un InputImage requiere un Context de Android. IronBarcode solo necesita una ruta de archivo o un flujo de datos. Eliminar el encadenamiento de contexto de la lógica de los códigos de barras simplifica considerablemente el código.
Sin servicios de Google Play. El modelo estándar de ML Kit se ejecuta a través de Play Services; BarcodeScanning.getClient() verifica la disponibilidad de Play Services en tiempo de ejecución y arroja una excepción si no está disponible. IronBarcode no tiene comprobación de servicio en tiempo de ejecución. O bien lee la imagen o bien genera una excepción estándar.
Manejo de excepciones estándar. El addOnFailureListener de ML Kit recibe una subclase de Java Exception. En .NET, las fallas aparecen como lanzamientos estándar System.Exception, capturables con try/catch de la manera normal.
Lectura de documentos PDF
ML Kit no admite archivos PDF. InputImage.fromFilePath() con una URI .pdf o falla o solo lee la primera página como una imagen rasterizada, dependiendo de la versión de Android. Si su escenario de migración implica documentos (procesamiento de facturas, manifiestos logísticos, escaneo de formularios), IronBarcode maneja archivos PDF de forma nativa:
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}");
}
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}")
Next
Sin paso de extracción de imágenes, sin biblioteca PDF de terceros, sin bucle de iteración de página con renderizado separado. Indique la ruta del PDF y obtenga todos los valores del código de barras junto con sus números de página.
Nuevas capacidades: Generación
ML Kit no genera códigos de barras, solo los lee. Si su aplicación adaptada necesita generar etiquetas, billetes o códigos QR, IronBarcode lo incluye en el mismo paquete.
Código 128 para etiquetas de envío:
using IronBarCode;
BarcodeWriter.CreateBarcode("SHIP-2024-98341", BarcodeEncoding.Code128)
.ResizeTo(400, 120)
.SaveAsPng("shipping-label.png");
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")
Generación de código QR:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/track/98341", 500)
.SaveAsPng("tracking-qr.png");
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 con logotipo y color:
using IronBarCode;
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500)
.AddBrandLogo("company-logo.png")
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue)
.SaveAsPng("product-qr.png");
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")
Devuelve el código de barras como una matriz de bytes para una respuesta HTTP:
using IronBarCode;
// In an ASP.NET Corecontroller action
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-7734", BarcodeEncoding.QRCode)
.ToPngBinaryData();
return File(barcodeBytes, "image/png");
using IronBarCode;
// In an ASP.NET Corecontroller action
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-7734", BarcodeEncoding.QRCode)
.ToPngBinaryData();
return File(barcodeBytes, "image/png");
Imports IronBarCode
' In an ASP.NET Core controller action
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("ORDER-7734", BarcodeEncoding.QRCode).ToPngBinaryData()
Return File(barcodeBytes, "image/png")
Ninguno de estos patrones tiene equivalentes en ML Kit. Se trata de nuevas funcionalidades disponibles gracias a que se trabaja con una biblioteca completa de códigos de barras .NET en lugar de un escáner exclusivamente para dispositivos móviles.
Procesamiento por lotes del lado del servidor
ML Kit procesa una imagen por llamada, requiere un entorno de ejecución para Android/iOS y no contempla la ejecución en el servidor. IronBarcode procesa archivos en un bucle, se ejecuta en ASP.NET Corey se 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}");
}
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}")
Next
Este proceso —leer una carpeta de imágenes, extraer códigos de barras y agregar resultados— no es posible con ML Kit. Se trata de un flujo de trabajo estándar de IronBarcode .
Comparación de características
| Característica | Kit de aprendizaje automático de Google | IronBarcode |
|---|---|---|
| Paquete NuGet .NET | None | BarCode |
| API de C# / .NET | None | Sí |
| Lectura de códigos de barras | Sí (Android/iOS) | Sí (todas las plataformas) |
| Generación de códigos de barras | No | Sí |
| Generación de código QR | No | Sí |
| Inserción de logotipo QR | No | Sí |
| Entrada en PDF | No | Sí |
| Compatibilidad con documentos de varias páginas | No | Sí |
| Entrada de cámara/fotograma | Sí | Mediante archivo de imagen |
| Implementación del lado del servidor | No | Sí |
| ASP.NET Core | No | Sí |
| Azure Functions | No | Sí |
| Docker / Linux | No | Sí |
| Se requieren los servicios de Google Play. | Solo variante no empaquetada | No |
| Dependencia de Firebase | No (independiente desde junio de 2020) | No |
| API .NET síncrona | No | Sí |
| Compatible con la inyección de dependencias | No | Sí (API estática) |
ExpectMultipleBarcodes opción |
A través de la lista de resultados | BarcodeReaderOptions |
| Especificaciones de formato | setBarcodeFormats() |
ExpectBarcodeTypes |
| Compromiso entre velocidad y precisión | Fijo (basado en modelo) | ReadingSpeed enum |
| Precios | Gratis (en el dispositivo, solo móvil) | Desde $749 (Lite) perpetua |
| Plataformas | Android, iOS | Windows, Linux, macOS, Docker, Azure, AWS |
Lista de comprobación de la migración
Si estás adaptando un código base de Android o reemplazando un enlace no oficial de Xamarin ML Kit, busca estos patrones en tu proyecto y aplica las traducciones anteriores:
com.google.mlkit:barcode-scanningen archivos Gradle → eliminar, agregarBarCodeNuGetBarcodeScannerOptions.Builder()→new BarcodeReaderOptions { }BarcodeScanning.getClient(options)→ eliminar (no hay instancia de escáner en IronBarcode)InputImage.fromFilePath(context, uri)→ argumento de cadena de ruta del archivoInputImage.fromBitmap(bitmap, rotation)→BarcodeReader.Read(stream)o sobrecarga de matriz de bytesscanner.process(inputImage)→BarcodeReader.Read(path, options).addOnSuccessListener { barcodes -> }→ iterar el valor de retorno deRead().addOnFailureListener { e -> }→ try/catch alrededor 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;(binding de Xamarin) →using IronBarCode;IronBarCode.License.LicenseKeydebería establecerse enMauiProgram.cs,Program.cs, oStartup.cs
El cambio estructural de código basado en devoluciones de llamada a código síncrono es el trabajo principal. Las constantes de formato y los nombres de los campos de resultado son asignaciones directas. La compatibilidad con PDF y su generación es puramente aditiva; no requiere migración, solo código nuevo.
Preguntas Frecuentes
¿Por qué debería migrar de Google ML Kit Barcode Scanning a IronBarcode?
Entre las razones más comunes se incluyen la simplificación de licencias (eliminando la complejidad de SDK + clave de tiempo de ejecución), la eliminación de límites de rendimiento, la obtención de compatibilidad nativa con PDF, la mejora de la implementación de Docker/CI/CD y la reducción de la repetición de API en el código de producción.
¿Cómo puedo sustituir las llamadas a la API de Google ML Kit por IronBarcode?
Sustituya la creación de instancias y la repetición de licencias por IronBarCode.License.LicenseKey = "key". Sustituya las llamadas al lector por BarcodeReader.Read(path) y las llamadas al escritor por BarcodeWriter.CreateBarcode(data, encoding). Los métodos estáticos no requieren gestión de instancias.
¿Cuánto cambia el código al migrar de Google ML Kit Barcode Scanning a IronBarcode?
La mayoría de las migraciones se traducen en menos líneas de código. Se eliminan la repetición de licencias, los constructores de instancias y la configuración explícita de formatos. Las operaciones básicas de lectura/escritura se traducen a equivalentes IronBarcode más cortos con objetos de resultado más limpios.
¿Necesito tener instalados tanto Google ML Kit Barcode Scanning como IronBarcode durante la migración?
No. La mayoría de las migraciones son sustituciones directas en lugar de operaciones paralelas. Migre una clase de servicio cada vez, sustituya la referencia NuGet y actualice los patrones de instanciación y llamada a la API antes de pasar a la siguiente clase.
¿Cuál es el nombre del paquete NuGet para IronBarcode?
El paquete es 'IronBarCode' (con B y C mayúsculas). Instálalo con 'Install-Package IronBarCode' o 'dotnet add package IronBarCode'. La directiva using en el código es 'using IronBarCode;'.
¿Cómo simplifica IronBarcode el despliegue de Docker en comparación con Google ML Kit Barcode Scanning?
IronBarcode es un paquete NuGet sin archivos SDK externos ni configuración de licencia montada. En Docker, establezca la variable de entorno IRONBARCODE_LICENSE_KEY y el paquete se encargará de la validación de la licencia al inicio.
¿IronBarcode detecta automáticamente todos los formatos de código de barras después de migrar desde Google ML Kit?
Sí, IronBarcode detecta automáticamente la simbología de todos los formatos compatibles. No es necesaria la enumeración explícita de BarcodeTypes. Si ya se conoce el formato y el rendimiento es importante, BarcodeReaderOptions permite restringir el espacio de búsqueda como optimización.
¿Puede IronBarcode leer códigos de barras de PDF sin una biblioteca independiente?
Sí. BarcodeReader.Read("document.pdf") procesa archivos PDF de forma nativa. Los resultados incluyen PageNumber, Format, Value y Confidence para cada código de barras encontrado. No es necesario ningún paso externo de procesamiento de PDF.
¿Cómo gestiona IronBarcode el procesamiento paralelo de códigos de barras?
Los métodos estáticos de IronBarcode no tienen estado y son seguros para los hilos. Utilice Parallel.ForEach directamente sobre listas de archivos sin gestión de instancias por subproceso. BarcodeReaderOptions.MaxParallelThreads controla el presupuesto interno de hilos.
¿Qué propiedades de los resultados cambian al migrar de Google ML Kit Barcode Scanning a IronBarcode?
Cambios de nombre comunes: BarcodeValue se convierte en Value, BarcodeType se convierte en Format. Los resultados de IronBarcode también añaden Confidence y PageNumber. Una búsqueda y sustitución en toda la solución gestiona los cambios de nombre en el código de procesamiento de resultados existente.
¿Cómo configuro las licencias de IronBarcode en un proceso CI/CD?
Almacene IRONBARCODE_LICENSE_KEY como un secreto de canalización y asigne IronBarCode.License.LicenseKey en el código de inicio de la aplicación. Un secreto cubre todos los entornos, incluidos los de desarrollo, prueba, montaje y producción.
¿Admite IronBarcode la generación de códigos QR con estilos personalizados?
Sí. QRCodeWriter.CreateQrCode() admite colores personalizados mediante ChangeBarCodeColor(), incrustación de logotipos mediante AddBrandLogo(), niveles de corrección de errores configurables y múltiples formatos de salida, incluidos PNG, JPG, PDF y stream.

