Saltar al pie de página
USO DE IRONBARCODE

¿Cómo se construye un escáner de código de barras .NET MAUI en C#?

IronBarcode le permite escanear códigos de barras directamente desde archivos de imagen dentro de una aplicación .NET MAUI , sin transmisión de cámara, sin configuración de controlador, sin necesidad de bucles de permisos específicos de la plataforma.

Puede escanear códigos de barras de archivos JPEG, PNG, GIF, TIFF y BMP con una sola llamada de método. El mismo código apunta a Windows, Android e iOS sin modificaciones. Comience con una prueba gratuita para seguir los ejemplos de código a continuación.

¿Cómo se crea un proyecto .NET MAUI para escanear códigos de barras?

Configurar un proyecto .NET MAUI en Visual Studio es sencillo. Inicie Visual Studio 2022 o posterior, seleccione Crear un nuevo proyecto , elija la plantilla Aplicación .NET MAUI , ingrese el nombre de su proyecto y seleccione sus plataformas de destino. Este tutorial se centra en la implementación de Windows, aunque el mismo proyecto se ejecuta en Android e iOS. .NET MAUI es el marco multiplataforma de Microsoft para crear aplicaciones nativas móviles y de escritorio con C# y XAML a partir de una única base de código compartida.

A diferencia de las soluciones basadas en cámaras como ZXing .NET.MAUI , que requieren configuración de control y registro, IronBarcode no necesita una configuración especial. Su MauiProgram.cs permanece en el estado de plantilla predeterminado. Esto mantiene su código de inicio libre de registros de controladores de terceros y reduce la superficie para errores de inicialización en el momento del lanzamiento.

Para instalar IronBarcode, ejecute este comando en la consola del Administrador de paquetes :

Install-Package BarCode
Install-Package BarCode
SHELL

Este paquete único le ofrece escaneo de códigos de barras, reconocimiento de códigos QR, detección de múltiples códigos de barras y generación de códigos de barras. No se necesitan dependencias adicionales.

Para activar IronBarcode en producción, configure su clave de licencia dentro de App.xaml.cs o MauiProgram.cs:

IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY";
IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY";
$vbLabelText   $csharpLabel

Puede obtener una clave desde la página de licencias de IronBarcode o comenzar con una licencia de prueba gratuita .

¿En qué se diferencian los permisos para el escaneo basado en imágenes?

Los lectores de códigos de barras tradicionales basados ​​en cámaras requieren permisos explícitos en los manifiestos de la plataforma. En Android, agrega a AndroidManifest.xml:

  • <uses-permission android:name="android.permission.CAMERA" />
  • <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

En iOS, declaras NSCameraUsageDescription en Info.plist. El manejo de permisos denegados en tiempo de ejecución agrega rutas de error que son fáciles de pasar por alto.

Dado que IronBarcode lee desde un flujo de archivos en lugar de una vista previa de la cámara, solo necesita acceso al sistema de archivos. En Windows esto se concede automáticamente. En Android e iOS, FilePicker gestiona el consentimiento del usuario cuando este selecciona una imagen; no se requieren solicitudes de permiso manuales.

¿Qué interfaz XAML funciona mejor para un escáner de código de barras MAUI?

Una interfaz mínima (un botón selector de imágenes, un área de visualización de imágenes y una etiqueta de resultados) cubre la mayoría de los escenarios de escaneo de códigos de barras. El siguiente XAML crea ese diseño para un .NET MAUI ContentPage:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="BarcodeScanner.MainPage">
    <ScrollView>
        <VerticalStackLayout Spacing="20" Padding="30">
            <Label Text="MAUI Barcode Scanner"
                   FontSize="24"
                   HorizontalOptions="Center" />
            <Button x:Name="SelectImageBtn"
                    Text="Select Image File"
                    Clicked="OnSelectImage" />
            <Image x:Name="SelectedImageDisplay"
                   HeightRequest="250" />
            <Label x:Name="ResultsLabel"
                   Text="Barcode results will appear here" />
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="BarcodeScanner.MainPage">
    <ScrollView>
        <VerticalStackLayout Spacing="20" Padding="30">
            <Label Text="MAUI Barcode Scanner"
                   FontSize="24"
                   HorizontalOptions="Center" />
            <Button x:Name="SelectImageBtn"
                    Text="Select Image File"
                    Clicked="OnSelectImage" />
            <Image x:Name="SelectedImageDisplay"
                   HeightRequest="250" />
            <Label x:Name="ResultsLabel"
                   Text="Barcode results will appear here" />
        </VerticalStackLayout>
    </ScrollView>
</ContentPage>
XML

El diseño proporciona un botón para activar el selector de archivos, un área de visualización para la imagen elegida y una etiqueta para los valores del código de barras decodificados. Se representa correctamente en todas las plataformas de destino .NET MAUI sin ajustes específicos de cada plataforma.

Para las aplicaciones de producción, considere reemplazar ResultsLabel con CollectionView para mostrar múltiples resultados de códigos de barras en una lista desplazable, especialmente al escanear documentos que contienen más de un código de barras.

¿Cómo escanear códigos de barras desde archivos de imagen en .NET MAUI?

El código subyacente en MainPage.xaml.cs maneja la selección de imágenes y la lectura de códigos de barras. BarcodeReader.Read acepta una ruta de archivo y devuelve una colección BarcodeResults. Cada elemento de la colección expone el código de barras Value, BarcodeType y las coordenadas de posición.

Aquí está la implementación completa:

using IronBarCode;
namespace BarcodeScanner;

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private async void OnSelectImage(object sender, EventArgs e)
    {
        try
        {
            // Open the system file picker filtered to image types
            var result = await FilePicker.PickAsync(new PickOptions
            {
                FileTypes = FilePickerFileType.Images,
                PickerTitle = "Select a barcode image"
            });

            if (result != null)
            {
                // Display the selected image in the UI
                var stream = await result.OpenReadAsync();
                SelectedImageDisplay.Source = ImageSource.FromStream(() => stream);

                // Decode all barcodes found in the image
                var barcodes = BarcodeReader.Read(result.FullPath);

                if (barcodes.Count > 0)
                {
                    // Build a display string listing each barcode type and value
                    string output = string.Join("\n",
                        barcodes.Select(b => $"{b.BarcodeType}: {b.Value}"));
                    ResultsLabel.Text = output;
                }
                else
                {
                    ResultsLabel.Text = "No barcodes detected in image";
                }
            }
        }
        catch (Exception ex)
        {
            ResultsLabel.Text = $"Error: {ex.Message}";
        }
    }
}
using IronBarCode;
namespace BarcodeScanner;

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private async void OnSelectImage(object sender, EventArgs e)
    {
        try
        {
            // Open the system file picker filtered to image types
            var result = await FilePicker.PickAsync(new PickOptions
            {
                FileTypes = FilePickerFileType.Images,
                PickerTitle = "Select a barcode image"
            });

            if (result != null)
            {
                // Display the selected image in the UI
                var stream = await result.OpenReadAsync();
                SelectedImageDisplay.Source = ImageSource.FromStream(() => stream);

                // Decode all barcodes found in the image
                var barcodes = BarcodeReader.Read(result.FullPath);

                if (barcodes.Count > 0)
                {
                    // Build a display string listing each barcode type and value
                    string output = string.Join("\n",
                        barcodes.Select(b => $"{b.BarcodeType}: {b.Value}"));
                    ResultsLabel.Text = output;
                }
                else
                {
                    ResultsLabel.Text = "No barcodes detected in image";
                }
            }
        }
        catch (Exception ex)
        {
            ResultsLabel.Text = $"Error: {ex.Message}";
        }
    }
}
$vbLabelText   $csharpLabel

BarcodeReader.Read procesa el archivo en la ruta indicada, detecta automáticamente todas las simbologías de código de barras presentes y devuelve resultados inmediatamente. El método admite todos los principales formatos de códigos de barras 1D y 2D, incluidos Código 128, Código 39, Código QR, Data Matrix, PDF417 y EAN-13.

 .NET MAUI Escanee códigos de barras en aplicaciones de Windows con una potente biblioteca de escáneres de códigos de barras: Imagen 1: Salida del código de barras escaneado

La llamada FilePicker.PickAsync restringe el selector a tipos de imágenes, por lo que los usuarios no pueden seleccionar accidentalmente archivos que no sean imágenes. Si result es null, el usuario canceló; el guardia if (result != null) lo maneja en silencio.

Para mensajes de confirmación breves, DisplayAlert proporciona un cuadro de diálogo modal sin requerir elementos de interfaz de usuario adicionales:

private async void ShowScanSummary(BarcodeResults barcodes)
{
    if (barcodes.Count > 0)
    {
        // Inform the user how many barcodes were detected
        string message = $"Found {barcodes.Count} barcode(s) in the image.";
        await DisplayAlert("Scan Complete", message, "OK");
    }
    else
    {
        await DisplayAlert("No Results", "No barcodes were found in the image.", "OK");
    }
}
private async void ShowScanSummary(BarcodeResults barcodes)
{
    if (barcodes.Count > 0)
    {
        // Inform the user how many barcodes were detected
        string message = $"Found {barcodes.Count} barcode(s) in the image.";
        await DisplayAlert("Scan Complete", message, "OK");
    }
    else
    {
        await DisplayAlert("No Results", "No barcodes were found in the image.", "OK");
    }
}
$vbLabelText   $csharpLabel

Este patrón funciona bien para flujos de confirmación simples. Para las aplicaciones que necesitan actuar sobre los valores decodificados (por ejemplo, buscar un producto por su código de barras en un sistema de gestión de inventario de códigos de barras ), pase la colección barcodes a su capa de lógica empresarial directamente desde el controlador OnSelectImage.

¿Cómo escanear múltiples códigos de barras y ajustar la velocidad de detección?

Cuando una imagen contiene varios códigos de barras, IronBarcode los detecta todos de forma predeterminada. Para un mejor rendimiento cuando sepa qué formatos esperar, configure BarcodeReaderOptions antes de llamar a BarcodeReader.Read:

using IronBarCode;

// Target only QR codes and Code 128 for faster detection
var options = new BarcodeReaderOptions
{
    ExpectMultipleBarcodes = true,
    ExpectBarcodeTypes     = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
    Speed                  = ReadingSpeed.Balanced
};

var barcodes = BarcodeReader.Read(imagePath, options);

foreach (var barcode in barcodes)
{
    Console.WriteLine($"Type: {barcode.BarcodeType} | Value: {barcode.Value}");
}
using IronBarCode;

// Target only QR codes and Code 128 for faster detection
var options = new BarcodeReaderOptions
{
    ExpectMultipleBarcodes = true,
    ExpectBarcodeTypes     = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
    Speed                  = ReadingSpeed.Balanced
};

var barcodes = BarcodeReader.Read(imagePath, options);

foreach (var barcode in barcodes)
{
    Console.WriteLine($"Type: {barcode.BarcodeType} | Value: {barcode.Value}");
}
$vbLabelText   $csharpLabel

 .NET MAUI Escanee códigos de barras en aplicaciones de Windows con una potente biblioteca de escáneres de códigos de barras: Imagen 2 - Salida para escanear múltiples códigos de barras

La propiedad ExpectBarcodeTypes limita el motor de detección a las simbologías especificadas. La configuración de Speed en ReadingSpeed.Faster es adecuada para imágenes sin distorsiones y de alto contraste. ReadingSpeed.Detailed aplica pases de corrección de imagen adicionales y maneja la rotación, la inclinación y las entradas de baja resolución a costa de tiempo de procesamiento adicional.

ExpectMultipleBarcodes = true le dice al lector que continúe escaneando después del primer partido en lugar de regresar antes. En escenarios de código de barras único, omitir esta opción ahorra algunos milisegundos en cada escaneo.

Esta configuración hace que el escáner sea práctico para una variedad de aplicaciones: una aplicación minorista que lee códigos de barras de productos, una herramienta de almacén que procesa etiquetas de códigos de barras impresas en fotos de envíos o un flujo de trabajo de documentos que extrae códigos QR de facturas cargadas.

¿Cómo manejar imágenes desafiantes o de baja calidad?

Las imágenes de producción rara vez son impecables. Las fotos de almacén tomadas con poca luz, las capturas de pantalla de clientes de correo electrónico y los documentos escaneados introducen ruido, artefactos de compresión y distorsión geométrica. IronBarcode expone ImageFilterCollection para preprocesar imágenes antes de decodificarlas:

using IronBarCode;
using IronSoftware.Drawing;

// Apply corrections for a low-quality warehouse photo
var options = new BarcodeReaderOptions
{
    ImageFilters = new ImageFilterCollection
    {
        new SharpenFilter(),
        new ContrastFilter(1.2f),
        new DenoiseFilter()
    },
    Speed = ReadingSpeed.Detailed
};

var barcodes = BarcodeReader.Read(imagePath, options);
using IronBarCode;
using IronSoftware.Drawing;

// Apply corrections for a low-quality warehouse photo
var options = new BarcodeReaderOptions
{
    ImageFilters = new ImageFilterCollection
    {
        new SharpenFilter(),
        new ContrastFilter(1.2f),
        new DenoiseFilter()
    },
    Speed = ReadingSpeed.Detailed
};

var barcodes = BarcodeReader.Read(imagePath, options);
$vbLabelText   $csharpLabel

SharpenFilter recupera la definición del borde de capturas comprimidas o desenfocadas. ContrastFilter ayuda cuando la iluminación es desigual. DenoiseFilter reduce las motas de los escaneos de baja resolución. La combinación de estos filtros con ReadingSpeed.Detailed maximiza las velocidades de lectura en material difícil.

Para las aplicaciones .NET MAUI que aceptan imágenes cargadas por el usuario desde una variedad de fuentes, aplicar un filtro conservador establecido de manera predeterminada y escalar a una corrección más agresiva en un segundo reintento mejora la experiencia del usuario sin agregar latencia visible en el caso común. También puede pasar un Uri o byte[] directamente a BarcodeReader.Read, lo que es útil cuando la imagen llega desde una respuesta de red en lugar del sistema de archivos. Consulte las guías prácticas de IronBarcode para obtener ejemplos de fuentes de entrada adicionales.

¿Por qué el escaneo basado en imágenes es adecuado para las aplicaciones .NET MAUI ?

El escaneo de cámara en vivo a través de un control CameraView requiere concesiones de permisos específicos de la plataforma, administración del ciclo de vida para la vista previa de la cámara y manejo de eventos de enfoque. En iOS esto también significa configurar AVCaptureSession; en Android, CameraX. Cada plataforma agrega sus propios modos de falla.

El escaneo basado en imágenes elimina toda esa categoría de preocupación. La referencia de la API de IronBarcode muestra que BarcodeReader.Read acepta una ruta de archivo, un Stream, un Bitmap o un byte[]; cualquier representación que su aplicación MAUI pueda producir. Esto significa que la misma lógica de escaneo funciona independientemente de que la imagen provenga de FilePicker, una descarga de red, una página PDF procesada en mapa de bits o un archivo adjunto en un correo electrónico.

El consumo de batería es menor porque el hardware de la cámara permanece apagado. No hay parpadeo en la interfaz de usuario desde una vista previa en vivo y no es necesario administrar eventos del ciclo de vida de la cámara durante la suspensión y reanudación de la aplicación. En tabletas y ordenadores de escritorio, donde un visor de cámara en vivo rara vez es apropiado, la decodificación basada en imágenes es la opción predeterminada, en lugar de una solución intermedia. Los usuarios pueden abrir archivos desde el almacenamiento en la nube, carpetas locales o carretes de fotos con la misma llamada FilePicker, independientemente del tipo de dispositivo.

Para los flujos de trabajo en los que los usuarios fotografían etiquetas de códigos de barras y las cargan (algo común en las aplicaciones web de escáneres de códigos de barras ASP.NET) , la misma llamada BarcodeReader.Read funciona tanto en el cliente móvil como en el servidor, lo que elimina la necesidad de mantener dos implementaciones de escaneo.

¿Cómo se compara IronBarcode con ZXing .NET.MAUI?

ZXing .NET.MAUI apunta al escaneo de cámara en vivo y funciona bien cuando la retroalimentación del visor en tiempo real es un requisito del producto. Requiere integración de CameraView, registro del controlador de plataforma y solicitudes de permisos de tiempo de ejecución.

IronBarcode apunta a la decodificación basada en archivos y secuencias, que cubre la mayoría de los flujos de trabajo de documentos empresariales. Admite una gama más amplia de simbologías, incluidas PDF417 , Data Matrix y Code 128 , y proporciona un preprocesamiento de filtro de imagen que ZXing no expone. Para aplicaciones donde los usuarios capturan o cargan imágenes en lugar de escanear elementos en vivo, IronBarcode es la opción más adecuada.

Si su aplicación necesita escaneo de cámara en vivo además de decodificación basada en archivos, puede combinar ambas bibliotecas: ZXing .NET.MAUI para el flujo de trabajo del visor y IronBarcode para el procesamiento de archivos por lotes.

¿Cuales son tus próximos pasos?

Construir un escáner de código de barras .NET MAUI con IronBarcode requiere menos de 30 líneas de código C#. El enfoque del archivo de imagen mantiene la base de código de MAUI libre de la lógica de permisos de la cámara y de la inicialización específica de la plataforma, y ​​la misma llamada de escaneo se ejecuta de manera idéntica en Windows, Android e iOS.

La documentación de la API de IronBarcode cubre capacidades adicionales: lectura de códigos de barras de documentos PDF, procesamiento por lotes de múltiples imágenes, escritura de filtros de imágenes personalizados y generación de códigos de barras junto con su lectura. La descripción general de las características enumera todos los formatos y simbologías admitidos.

Comience una prueba gratuita para probar IronBarcode en su proyecto o compre una licencia cuando esté listo para la implementación de producción.

Empiece con IronBarcode ahora.
green arrow pointer

Preguntas Frecuentes

¿Cómo crear un escáner de código de barras en .NET MAUI sin una cámara?

Instale IronBarcode mediante NuGet (`Install-Package BarCode`) y luego llame a `BarcodeReader.Read(filePath)` con la ruta obtenida de `FilePicker.PickAsync`. No se requieren permisos de cámara ni la configuración de `CameraView`.

¿Puede IronBarcode escanear códigos de barras en Android e iOS en .NET MAUI?

Sí. La misma llamada `BarcodeReader.Read` se ejecuta en Windows, Android e iOS sin rutas de código específicas de la plataforma ni cambios de manifiesto.

¿Qué formatos de imagen admite IronBarcode para el escaneo de códigos de barras?

IronBarcode lee códigos de barras de archivos JPEG, PNG, GIF, TIFF y BMP. También acepta entradas de tipo "Stream", "Bitmap" y "byte[]", por lo que las imágenes de las respuestas de red funcionan sin necesidad de escribirlas primero en el disco.

¿Cómo escanear varios códigos de barras desde una sola imagen en .NET MAUI?

Establezca `ExpectMultipleBarcodes = true` en `BarcodeReaderOptions` y pase las opciones a `BarcodeReader.Read`. El lector devuelve todos los códigos de barras detectados en una única colección `BarcodeResults`.

¿Cuál es la diferencia entre IronBarcode y ZXing .NET.MAUI?

ZXing .NET.MAUI optimiza el escaneo de cámaras en vivo mediante un control `CameraView`. IronBarcode optimiza la decodificación basada en archivos y secuencias, admite más simbologías (incluidas PDF417 y Data Matrix) y proporciona preprocesamiento de filtros de imagen para entradas de baja calidad.

¿Cómo mejorar la detección de códigos de barras en imágenes borrosas o de baja calidad?

Agregue una `ImageFilterCollection` a `BarcodeReaderOptions` con `SharpenFilter`, `ContrastFilter` y `DenoiseFilter`, y configure `Speed ​​= ReadingSpeed.Detailed`. Esto aplica correcciones de imagen antes del paso de decodificación.

¿Qué formatos de código de barras admite IronBarcode en .NET MAUI?

IronBarcode es compatible con las principales simbologías 1D y 2D: Código 128, Código 39, Código QR, Data Matrix, PDF417, EAN-13, EAN-8, UPC-A, UPC-E, Aztec y más. La lista completa se encuentra en la página de características de IronBarcode .

Jordi Bardia
Ingeniero de Software
Jordi es más competente en Python, C# y C++. Cuando no está aprovechando sus habilidades en Iron Software, está programando juegos. Compartiendo responsabilidades para pruebas de productos, desarrollo de productos e investigación, Jordi agrega un valor inmenso a la mejora continua del producto. La experiencia variada lo mantiene ...
Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame