Ir para o conteúdo do rodapé
USANDO O IRONBARCODE

Como criar um leitor de código de barras .NET MAUI em C#?

IronBarcode permite que você escaneie códigos de barras diretamente a partir de arquivos de imagem dentro de um aplicativo .NET MAUI -- sem stream de câmera, sem configuração de driver, sem loops de permissão específicos de plataforma necessários.

Você pode escanear códigos de barras de arquivos JPEG, PNG, GIF, TIFF e BMP com uma única chamada de método. O mesmo código é direcionado para Windows, Android e iOS sem modificação. Comece com uma licença de teste gratuita para acompanhar os exemplos de código abaixo.

Como você cria um projeto .NET MAUI para escaneamento de código de barras?

Configurar um projeto .NET MAUI no Visual Studio é simples. Inicie o Visual Studio 2022 ou superior, selecione Criar um novo projeto, escolha o template .NET MAUI App, insira o nome do seu projeto e selecione suas plataformas de destino. Este tutorial foca na implantação no Windows, embora o mesmo projeto funcione no Android e iOS. .NET MAUI é o framework multiplataforma da Microsoft para construir aplicativos móveis e de desktop nativos com C# e XAML de uma base de código compartilhada.

Ao contrário de soluções baseadas em câmera, como ZXing.Net.MAUI, que exigem configuração de controle CameraView e registro MauiProgram.cs, o IronBarcode não necessita de configuração especial. Seu MauiProgram.cs permanece no estado de modelo padrão. Isso mantém seu código de inicialização livre de registros de handlers de terceiros e reduz a área de erro para inicializações erradas no momento do lançamento.

Para instalar o IronBarcode, execute este comando no Package Manager Console:

Install-Package BarCode
Install-Package BarCode
SHELL

Este único pacote oferece escaneamento de código de barras, reconhecimento de código QR, detecção de múltiplos códigos de barras e geração de código de barras. Não são necessárias dependências adicionais.

Para ativar o IronBarcode em produção, defina sua chave de licença dentro de App.xaml.cs ou MauiProgram.cs:

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

Você pode obter uma chave na página de licenciamento do IronBarcode ou começar com uma licença de teste gratuita.

Como as permissões diferem para escaneamento baseado em imagem?

Os escaneadores de código de barras baseados em câmera tradicionais requerem permissões explícitas em manifestos de plataforma. No Android, você adiciona em AndroidManifest.xml:

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

No iOS, você declara NSCameraUsageDescription em Info.plist. Lidar com permissões negadas em tempo de execução adiciona caminhos de erro fáceis de serem ignorados.

Como o IronBarcode lê de um fluxo de arquivo em vez de uma pré-visualização da câmera, você só precisa de acesso ao sistema de arquivos. No Windows, isso é concedido automaticamente. No Android e iOS, FilePicker gerencia o consentimento do usuário quando o usuário seleciona uma imagem -- não são necessárias solicitações de permissão manual.

Qual Interface XAML Funciona Melhor para um Scanner de Código de Barras MAUI?

Uma interface mínima -- um botão de seleção de imagem, uma área de exibição de imagem e um rótulo de resultados -- cobre a maioria dos cenários de escaneamento de código de barras. O seguinte XAML cria esse layout para um .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

O layout fornece um botão para acionar o seletor de arquivo, uma área de exibição para a imagem escolhida e um rótulo para os valores decodificados do código de barras. Ele é renderizado corretamente em todas as plataformas de destino do .NET MAUI sem ajustes específicos de plataforma.

Para aplicativos de produção, considere substituir ResultsLabel por um CollectionView para exibir vários resultados de códigos de barras em uma lista rolável, especialmente ao escanear documentos que contenham mais de um código de barras.

Como você escaneia códigos de barras de arquivos de imagem no .NET MAUI?

O código-behind em MainPage.xaml.cs lida com a seleção de imagens e leitura de códigos de barras. BarcodeReader.Read aceita um caminho de arquivo e retorna uma coleção BarcodeResults. Cada item na coleção expõe o Value do código de barras, BarcodeType, e coordenadas de posição.

Aqui está a implementação 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 processa o arquivo no caminho fornecido, detecta automaticamente todas as simbologias de códigos de barras presentes e retorna os resultados imediatamente. O método suporta todos os principais formatos de códigos de barras 1D e 2D, incluindo Code 128, Code 39, Código QR, Data Matrix, PDF417 e EAN-13.

.NET MAUI Escanear Código de Barras em Aplicativos Windows com uma Biblioteca Poderosa de Scanner de Código de Barras: Imagem 1 - Saída do código de barras escaneado

A chamada FilePicker.PickAsync limita o seletor a tipos de imagens, para que os usuários não possam selecionar acidentalmente arquivos que não são de imagem. Se result for null, o usuário cancelou -- a proteção if (result != null) lida com isso silenciosamente.

Para mensagens de confirmação breves, DisplayAlert fornece um diálogo modal sem exigir elementos adicionais de interface de usuário:

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 padrão funciona bem para fluxos de confirmação simples. Para aplicativos que precisam agir sobre os valores decodificados -- por exemplo, buscando um produto pelo seu código de barras em um sistema de gerenciamento de inventário de código de barras -- passe a coleção barcodes para sua camada de lógica de negócios diretamente do manipulador OnSelectImage.

Como você escaneia múltiplos códigos de barras e ajusta a velocidade de detecção?

Quando uma imagem contém vários códigos de barras, o IronBarcode os detecta todos por padrão. Para melhor desempenho quando você sabe quais formatos esperar, configure BarcodeReaderOptions antes de chamar 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 Escanear Código de Barras em Aplicativos Windows com uma Biblioteca Poderosa de Scanner de Código de Barras: Imagem 2 - Saída para digitalização de múltiplos códigos de barras

A propriedade ExpectBarcodeTypes restringe o mecanismo de detecção às simbologias especificadas. Definir Speed para ReadingSpeed.Faster é adequado para imagens de alto contraste e sem distorção. ReadingSpeed.Detailed aplica passagens adicionais de correção de imagem e lida com rotação, distorção e entradas de baixa resolução ao custo de tempo extra de processamento.

ExpectMultipleBarcodes = true instrui o leitor a continuar escaneando após a primeira correspondência em vez de retornar cedo. Em cenários de código de barras único, omitir esta opção reduz alguns milissegundos de cada escaneamento.

Esta configuração torna o scanner prático para uma variedade de aplicações: um aplicativo de varejo lendo códigos de barras de produtos, uma ferramenta de armazém processando etiquetas de código de barras impressas em fotos de remessas, ou um fluxo de trabalho de documentos extraindo códigos QR de faturas carregadas.

Como você lida com imagens desafiadoras ou de baixa qualidade?

Imagens de produção raramente são perfeitas. Fotos de armazém tiradas sob iluminação intensa, capturas de tela de clientes de email e documentos escaneados introduzem ruído, artefatos de compressão e distorção geométrica. O IronBarcode expõe ImageFilterCollection para pré-processar imagens antes da decodificação:

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 a definição das bordas de capturas comprimidas ou fora de foco. ContrastFilter ajuda quando a iluminação é desigual. DenoiseFilter reduz manchas de digitalizações de baixa resolução. A combinação desses filtros com ReadingSpeed.Detailed maximiza as taxas de leitura em materiais difíceis.

Para aplicativos .NET MAUI que aceitam imagens carregadas por usuários de uma variedade de fontes, aplicar um conjunto de filtros conservador por padrão e escalar para uma correção mais agressiva em uma segunda tentativa melhora a experiência do usuário sem adicionar latência visível no caso comum. Você também pode passar um Uri ou byte[] diretamente para BarcodeReader.Read, que é útil quando a imagem chega de uma resposta de rede em vez do sistema de arquivos. Consulte os guias de como fazer do IronBarcode para exemplos adicionais de fontes de entrada.

Por que o escaneamento baseado em imagens é adequado para aplicativos .NET MAUI?

A digitalização de câmera ao vivo através de um controle CameraView requer concessões de permissão específicas de plataforma, gestão de ciclo de vida para a pré-visualização da câmera, e tratamento de eventos de foco. No iOS isso também significa configurar AVCaptureSession; no Android, CameraX. Cada plataforma adiciona seus próprios modos de falha.

O escaneamento baseado em imagem remove toda essa categoria de preocupações. A referência da API do IronBarcode mostra que BarcodeReader.Read aceita um caminho de arquivo, um Stream, um Bitmap, ou um byte[] -- qualquer representação que seu aplicativo MAUI possa produzir. Isso significa que a mesma lógica de escaneamento funciona, quer a imagem tenha vindo de FilePicker, um download de rede, uma página PDF renderizada para bitmap, ou um anexo de email.

O consumo de bateria é menor porque o hardware da câmera permanece desligado. Não há tremor da interface do usuário de uma pré-visualização ao vivo, e não há necessidade de gerenciar eventos do ciclo de vida da câmera em suspensão e retomada do aplicativo. Em formatos de tablet e desktop -- onde um visor de câmera ao vivo raramente é apropriado -- a decodificação baseada em imagem é o padrão natural em vez de um compromisso. Os usuários podem abrir arquivos de armazenamento em nuvem, pastas locais, ou rolos de câmera com a mesma chamada FilePicker, independentemente do tipo de dispositivo.

Para fluxos de trabalho onde os usuários fotografam rótulos de códigos de barras e os carregam -- comum em aplicativos web de scanner de código de barras ASP.NET -- a mesma chamada BarcodeReader.Read funciona tanto no cliente móvel quanto no servidor, eliminando a necessidade de manter duas implementações de escaneamento.

Como o IronBarcode se compara ao ZXing.Net.MAUI?

ZXing.Net.MAUI visa o escaneamento ao vivo com câmera e funciona bem quando o feedback em tempo real do visor é um requisito do produto. Requer integração CameraView, registro de manipulador de plataforma, e solicitações de permissão em tempo de execução.

O IronBarcode visa a decodificação baseada em arquivos e em streams, que cobre a maioria dos fluxos de trabalho de documentos empresariais. Ele suporta uma gama mais ampla de simbologias, incluindo PDF417, Data Matrix, e Code 128, e oferece pré-processamento de filtro de imagem que o ZXing não expõe. Para aplicações onde os usuários capturam ou carregam imagens em vez de escanear itens ao vivo, o IronBarcode é a opção mais direta.

Se seu aplicativo precisa de escaneamento de câmera ao vivo além da decodificação baseada em arquivos, você pode combinar ambas as bibliotecas: ZXing.Net.MAUI para o fluxo de trabalho do visor e IronBarcode para processamento de arquivos em lote.

Quais são os seus próximos passos?

Criar um scanner de código de barras .NET MAUI com IronBarcode leva menos de 30 linhas de código C#. A abordagem de arquivo de imagem mantém seu código MAUI livre de lógica de permissão de câmera e inicialização específica de plataforma, e a mesma chamada de escaneamento é executada de forma idêntica no Windows, Android e iOS.

A documentação da API do IronBarcode cobre capacidades adicionais: leitura de códigos de barras em documentos PDF, processamento em lote de várias imagens, escrita de filtros de imagem personalizados, e geração de códigos de barras junto com sua leitura. A visão geral de recursos lista todas as simbologias e formatos suportados.

Comece um teste gratuito para testar o IronBarcode em seu projeto, ou compre uma licença quando estiver pronto para a implantação em produção.

!{--010011000100100101000010010100100100000101010010010110010101111101000111010001010101010100010111110101001101010100010000010101001001010100010001010100010001011111010101110100100 101010100010010000101111101010000010100100111101000100010101010100001101010100010111110101010001010010010010010010010100000101001100010111110100001001001100010011110100001101001011--}

Perguntas frequentes

Como criar um leitor de código de barras em .NET MAUI sem uma câmera?

Instale o IronBarcode via NuGet (`Install-Package BarCode`), depois chame `BarcodeReader.Read(filePath)` com um caminho obtido de `FilePicker.PickAsync`. Não são necessárias permissões de câmera nem configuração de `CameraView`.

O IronBarcode consegue ler códigos de barras em dispositivos Android e iOS usando .NET MAUI?

Sim. A mesma chamada `BarcodeReader.Read` funciona no Windows, Android e iOS sem quaisquer caminhos de código específicos da plataforma ou alterações no manifesto.

Quais formatos de imagem o IronBarcode suporta para leitura de código de barras?

O IronBarcode lê códigos de barras de arquivos JPEG, PNG, GIF, TIFF e BMP. Ele também aceita entradas `Stream`, `Bitmap` e `byte[]`, permitindo que imagens de respostas de rede funcionem sem a necessidade de gravá-las em disco primeiro.

Como posso ler vários códigos de barras a partir de uma única imagem no .NET MAUI?

Defina `ExpectMultipleBarcodes = true` em `BarcodeReaderOptions` e passe as opções para `BarcodeReader.Read`. O leitor retorna todos os códigos de barras detectados em uma única coleção `BarcodeResults`.

Qual a diferença entre IronBarcode e ZXing .NET.MAUI?

O ZXing .NET.MAUI permite a digitalização ao vivo de imagens da câmera por meio de um controle `CameraView`. O IronBarcode permite a decodificação baseada em arquivos e em fluxos de dados, suporta mais simbologias (incluindo PDF417 e Data Matrix) e oferece pré-processamento de filtros de imagem para entradas de baixa qualidade.

Como melhorar a detecção de códigos de barras em imagens desfocadas ou de baixa qualidade?

Adicione um `ImageFilterCollection` a `BarcodeReaderOptions` com `SharpenFilter`, `ContrastFilter` e `DenoiseFilter`, e defina `Speed ​​= ReadingSpeed.Detailed`. Isso aplica correções de imagem antes da decodificação.

Quais formatos de código de barras o IronBarcode suporta no .NET MAUI?

O IronBarcode é compatível com todas as principais simbologias 1D e 2D: Code 128, Code 39, QR Code, Data Matrix, PDF417, EAN-13, EAN-8, UPC-A, UPC-E, Aztec e muito mais. A lista completa está disponível na página de recursos do IronBarcode .

Curtis Chau
Redator Técnico

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 ...

Leia mais

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me