IRONSOFTWAREHOME
VIDEOS

Migrating from Kit de aprendizaje automático de Google Barcode Scanning to IronBarcode

Curtis Chau
Curtis Chau
Updated: 20 de junio de 2026

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";

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}")
    }
Text

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}");
}

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") }
Text

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);
}

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 KotlinIronBarcode C#
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_FORMATSOmitir 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);

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
Text
// IronBarcode C#— result fields
string value = barcode.Value;
BarcodeEncoding format = barcode.Format;
int page = barcode.PageNumber; // populated for PDF / multi-page input
C#

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;
    });
}

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}");
}

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");

Generación de código QR:

using 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");

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");
C#

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}");
}

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ísticaKit de aprendizaje automático de GoogleIronBarcode
Paquete NuGet .NETNoneBarCode
API de C# / .NETNone
Lectura de códigos de barrasSí (Android/iOS)Sí (todas las plataformas)
Generación de códigos de barrasNo
Generación de código QRNo
Inserción de logotipo QRNo
Entrada en PDFNo
Compatibilidad con documentos de varias páginasNo
Entrada de cámara/fotogramaMediante archivo de imagen
Implementación del lado del servidorNo
ASP.NET CoreNo
Azure FunctionsNo
Docker / LinuxNo
Se requieren los servicios de Google Play.Solo variante no empaquetadaNo
Dependencia de FirebaseNo (independiente desde junio de 2020)No
API .NET síncronaNo
Compatible con la inyección de dependenciasNoSí (API estática)
ExpectMultipleBarcodes opciónA través de la lista de resultadosBarcodeReaderOptions
Especificaciones de formatosetBarcodeFormats()ExpectBarcodeTypes
Compromiso entre velocidad y precisiónFijo (basado en modelo)ReadingSpeed enum
PreciosGratis (en el dispositivo, solo móvil)Desde $999 (Lite) perpetua
PlataformasAndroid, iOSWindows, 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-scanning en archivos Gradle → eliminar, agregar BarCode NuGet
  • BarcodeScannerOptions.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 archivo
  • InputImage.fromBitmap(bitmap, rotation)BarcodeReader.Read(stream) o sobrecarga de matriz de bytes
  • scanner.process(inputImage)BarcodeReader.Read(path, options)
  • .addOnSuccessListener { barcodes -> } → iterar el valor de retorno de Read()
  • .addOnFailureListener { e -> } → try/catch alrededor de Read()
  • barcode.rawValuebarcode.Value
  • barcode.formatbarcode.Format
  • Barcode.FORMAT_QR_CODEBarcodeEncoding.QRCode
  • Barcode.FORMAT_CODE_128BarcodeEncoding.Code128
  • Barcode.FORMAT_ALL_FORMATS → omitir ExpectBarcodeTypes
  • using Google.MLKit.BarcodeScanning; (binding de Xamarin) → using IronBarCode;
  • IronBarCode.License.LicenseKey debería establecerse en MauiProgram.cs, Program.cs, o Startup.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.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien estructurados y visualmente atractivos.

...
Leer más

Artículos Relacionados

Key in blue circle

Obtenga su clave de prueba gratuita de 30 días al instante.

Your trial license will be sent to your email address

Sin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.

bullet_checkedNo se requiere tarjeta de crédito ni creación de cuentaSin limitaciones. 100 % desbloqueado. Sin tarjeta de crédito.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Reserve su Demostración en Vivo gratuita
Booking Badge

Confiado por millones de ingenieros en todo el mundo

Logos de clientes de Iron Software
Obtén tu Consulta Sin Compromiso
Completa el formulario a continuación o envía un correo a sales@ironsoftware.com
Tus detalles siempre serán mantenidos confidenciales.
Confiado por millones de ingenieros en todo el mundo
Logos de clientes de Iron Software
Obtenga su Clave de Prueba de 30 días gratis al instante.
No se requiere tarjeta de crédito ni creación de cuenta