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

Leitor de código de barras ASP.NET : Upload de arquivos e API REST com IronBarcode

A digitalização de códigos de barras no ASP.NET torna-se simples com o IronBarcode: instale via NuGet, chame BarcodeReader.Read() e obtenha valores decodificados com tipo, confiança e dados de posição em um único passo -- nenhuma configuração complexa é necessária.

A digitalização de código de barras é uma exigência padrão nas aplicações web modernas, alimentando fluxos de trabalho de gestão de inventário, processamento de documentos e validação de tickets. De acordo com a GS1, os códigos de barras são usados em mais de 6 bilhões de transações diárias em todo o mundo -- um número que destaca a importância da leitura precisa de códigos de barras para qualquer sistema de negócios. O padrão ISO/IEC 15415 define métricas de qualidade para símbolos de código de barras 2D, enquanto o padrão ISO/IEC 15416 abrange códigos de barras lineares 1D, ambos os quais IronBarcode suporta nativamente.

Este guia mostra como adicionar digitalização confiável de códigos de barras à sua aplicação ASP.NET Core usando IronBarcode, abrangendo instalação, processamento de upload de arquivos, integração de API REST e padrões de implantação em produção. Até o final, você terá um código funcional para um scanner de upload de arquivos de página Razor e um endpoint de API JSON que aceita imagens codificadas em base64 de qualquer cliente.

Como Você Instala o IronBarcode em um Projeto ASP.NET?

Começar leva apenas alguns minutos. A biblioteca suporta tanto ASP.NET Core quanto aplicações tradicionais ASP.NET MVC, tornando-a adaptável para vários tipos de projetos. Implantações empresariais funcionam igualmente bem em Azure, AWS Lambda e contêineres Docker. A detecção alimentada por aprendizado de máquina da biblioteca lida com imagens de código de barras desafiadoras aplicando correção sofisticada de imagem automaticamente, o que é particularmente útil ao processar fotos tiradas com câmeras móveis em condições de iluminação variável.

Instalando através do Gerenciador de Pacotes NuGet

Abra o Console do Gerenciador de Pacotes no Visual Studio e execute:

Install-Package BarCode
Install-Package BarCode
SHELL

Alternativamente, use o .NET CLI:

dotnet add package BarCode
dotnet add package BarCode
SHELL

Ou procure por "BarCode" na interface do gerenciador de pacotes NuGet do Visual Studio e clique em Instalar. O pacote gerencia automaticamente todas as dependências.

Para implantações específicas de plataforma, considere usar pacotes NuGet específicos da plataforma que são otimizados para seu ambiente de destino. A biblioteca oferece pacotes padrão e pacotes BarCode.Slim para se adequar a diferentes cenários de implantação. Para o guia completo de instalação, veja o guia de instalação do IronBarcode.

Configurando Seu Projeto

Uma vez instalado, adicione a declaração 'using' necessária aos seus arquivos C#:

using IronBarCode;
using IronBarCode;
$vbLabelText   $csharpLabel

Esta importação dá-lhe acesso à completa leitura e geração de códigos de barras do IronBarcode. A biblioteca suporta mais de 30 formatos de código de barras, incluindo QR Code, Code 128, Code 39, Data Matrix e PDF417. Veja a lista completa de formatos de código de barras suportados para confirmar a compatibilidade com seu caso de uso.

Para solucionar problemas de instalação, consulte o guia de solução de problemas de pacotes NuGet ou envie uma solicitação de engenharia para suporte especializado.

Escolhendo o Padrão de Arquitetura Correto

Ao implementar a digitalização de código de barras em ASP.NET, você tem duas abordagens arquitetônicas principais. Compreender esses padrões ajuda você a escolher as configurações do leitor de código de barras corretas para cada caso de uso:

// Server-side processing -- recommended for most ASP.NET scenarios
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    UseConfidenceThreshold = true,
    ConfidenceThreshold = 0.85
};

var results = BarcodeReader.Read(stream, options);

foreach (var barcode in results)
{
    Console.WriteLine($"Type: {barcode.BarcodeType}, Value: {barcode.Text}");
}
// Server-side processing -- recommended for most ASP.NET scenarios
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    UseConfidenceThreshold = true,
    ConfidenceThreshold = 0.85
};

var results = BarcodeReader.Read(stream, options);

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

A abordagem do lado do servidor dá a você controle máximo sobre o processamento de imagens e funciona de forma consistente em todos os navegadores. Quando o servidor processa cada imagem, você também obtém um rastro de auditoria limpo: cada código de barras digitalizado passa por sua camada de aplicação onde você pode registrá-lo, validá-lo em relação a um banco de dados ou acionar fluxos de trabalho a jusante. Este padrão é particularmente adequado para indústrias regulamentadas, como saúde, logística e manufatura, onde cada digitalização deve ser registrada.

Para integração de captura de câmera no lado do cliente, navegadores modernos suportam a API MediaDevices para acesso à câmera, que pode ser combinada com o processamento no lado do servidor do IronBarcode através de uma API REST -- coberto em detalhes mais adiante neste guia. Escolher o processamento do lado do servidor também simplifica seu modelo de segurança: não há lógica de processamento sensível exposta ao navegador, e toda validação acontece por trás do limite de sua aplicação.

Compensações de Digitalização de Código de Barras no Lado do Cliente vs. Lado do Servidor
Aspecto Captura do Lado do Cliente + Processamento do Servidor Processamento Puramente no Servidor
Ideal para Digitalização em tempo real com câmera Processamento em lote, uploads de arquivos
Suporte do navegador Apenas navegadores modernos Todos os navegadores
Experiência do usuário Feedback instantâneo Fluxo padrão de upload
Modelo de segurança Mais complexo (CORS, auth) Simples
Uso de largura de banda Baixa (pré-processada no dispositivo) Alta (upload de imagem bruta)

Como Implementar a Digitalização de Código de Barras com Upload de Arquivo?

A digitalização de upload de arquivo é o cenário de código de barras mais comum em aplicações web ASP.NET. Esse padrão funciona para processar faturas, etiquetas de envio ou qualquer documento com códigos de barras incorporados. Para melhorar a taxa de transferência, considere implementar leitura de código de barras assíncrona para lidar com múltiplos uploads simultaneamente.

Construindo o Formulário de Upload

Crie um formulário HTML responsivo em sua view ASP.NET:

@* Razor view -- barcode upload form *@
<form method="post" enctype="multipart/form-data" id="barcodeForm">
    <div class="form-group">
        <label for="barcodeFile">Select Barcode Image:</label>
        <input type="file" name="barcodeFile" id="barcodeFile"
               accept="image/*,.pdf" class="form-control"
               capture="environment" />
    </div>
    <button type="submit" class="btn btn-primary" id="scanBtn">
        <span class="spinner-border spinner-border-sm d-none" role="status"></span>
        Scan Barcode
    </button>
</form>
<div id="results">
    @ViewBag.BarcodeResult
</div>
@* Razor view -- barcode upload form *@
<form method="post" enctype="multipart/form-data" id="barcodeForm">
    <div class="form-group">
        <label for="barcodeFile">Select Barcode Image:</label>
        <input type="file" name="barcodeFile" id="barcodeFile"
               accept="image/*,.pdf" class="form-control"
               capture="environment" />
    </div>
    <button type="submit" class="btn btn-primary" id="scanBtn">
        <span class="spinner-border spinner-border-sm d-none" role="status"></span>
        Scan Barcode
    </button>
</form>
<div id="results">
    @ViewBag.BarcodeResult
</div>
$vbLabelText   $csharpLabel

O atributo capture="environment" ativa a câmera traseira em dispositivos móveis, proporcionando aos usuários uma experiência semelhante à de uma câmera nativa sem JavaScript.

Implementando o Processamento Seguro no Backend

A ação do controlador lida com a validação de arquivos, o processamento do fluxo de memória e a formatação de resultados:

[HttpPost]
[ValidateAntiForgeryToken]
[RequestSizeLimit(10_000_000)] // 10MB limit
public async Task<IActionResult> ScanBarcode(IFormFile barcodeFile)
{
    var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif",
                                    ".tiff", ".bmp", ".pdf" };
    var extension = Path.GetExtension(barcodeFile.FileName).ToLowerInvariant();

    if (!allowedExtensions.Contains(extension))
    {
        ModelState.AddModelError("", "Invalid file type");
        return View();
    }

    if (barcodeFile != null && barcodeFile.Length > 0)
    {
        using var stream = new MemoryStream();
        await barcodeFile.CopyToAsync(stream);
        stream.Position = 0;

        var options = new BarcodeReaderOptions
        {
            Speed = ReadingSpeed.Balanced,
            ExpectMultipleBarcodes = true,
            ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional |
                                BarcodeEncoding.QRCode |
                                BarcodeEncoding.DataMatrix,
            ImageFilters = new ImageFilterCollection
            {
                new SharpenFilter(),
                new ContrastFilter()
            }
        };

        var results = BarcodeReader.Read(stream, options);

        ViewBag.BarcodeResult = results.Any()
            ? string.Join("<br/>", results.Select(r => $"<strong>{r.BarcodeType}:</strong> {r.Text}"))
            : "No barcodes found in the image.";
    }

    return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
[RequestSizeLimit(10_000_000)] // 10MB limit
public async Task<IActionResult> ScanBarcode(IFormFile barcodeFile)
{
    var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif",
                                    ".tiff", ".bmp", ".pdf" };
    var extension = Path.GetExtension(barcodeFile.FileName).ToLowerInvariant();

    if (!allowedExtensions.Contains(extension))
    {
        ModelState.AddModelError("", "Invalid file type");
        return View();
    }

    if (barcodeFile != null && barcodeFile.Length > 0)
    {
        using var stream = new MemoryStream();
        await barcodeFile.CopyToAsync(stream);
        stream.Position = 0;

        var options = new BarcodeReaderOptions
        {
            Speed = ReadingSpeed.Balanced,
            ExpectMultipleBarcodes = true,
            ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional |
                                BarcodeEncoding.QRCode |
                                BarcodeEncoding.DataMatrix,
            ImageFilters = new ImageFilterCollection
            {
                new SharpenFilter(),
                new ContrastFilter()
            }
        };

        var results = BarcodeReader.Read(stream, options);

        ViewBag.BarcodeResult = results.Any()
            ? string.Join("<br/>", results.Select(r => $"<strong>{r.BarcodeType}:</strong> {r.Text}"))
            : "No barcodes found in the image.";
    }

    return View();
}
$vbLabelText   $csharpLabel

Essa implementação valida o tipo de arquivo antes do processamento, lê códigos de barras de um fluxo de memória e retorna todos os resultados detectados. IronBarcode processa vários formatos de imagem, incluindo TIFF e GIF de múltiplas páginas e documentos PDF, eliminando código específico de manipulação de formato.

Como a Entrada e Saída Digitalizada se Parecem

Codificação de código de barras Code 128 URL 'https://ironsoftware.com/csharp/barcode/' exibindo barras legíveis por máquina com texto legível por humanos abaixo para digitalização precisa em aplicativos de leitura de código de barras ASP.NET

O exemplo acima mostra um padrão Code 128 -- um formato comum em aplicações de envio e inventário. Após a digitalização, a tela de resultado confirma o valor decodificado junto com metadados de confiança:

Interface de aplicativo web ASP.NET Core exibindo resultados bem-sucedidos de digitalização de código de barras com formulário de upload de arquivo mostrando o valor decodificado do código de barras Code128 e metadados de pontuação de confiança

IronBarcode retorna o tipo de código de barras, valor decodificado, pontuação de confiança e dados de posição para cada código de barras detectado na imagem carregada.

Como Construir uma API REST para Digitalização de Código de Barras?

Aplicações ASP.NET modernas frequentemente expõem capacidades de leitura de códigos de barras através de APIs REST, permitindo integração com aplicativos móveis, aplicações de página única ou serviços de terceiros. Esse padrão suporta captura de câmera do lado do cliente com processamento do lado do servidor.

Considerações de Segurança para APIs de Código de Barras

Antes de escrever o controlador, planeje a camada de segurança. Os dados do código de barras podem conter conteúdo arbitrário, então sempre valide as entradas. Siga as diretrizes de segurança do IronBarcode para proteção completa:

  • Validação de entrada: Sanitizar o conteúdo do código de barras antes de armazenar ou agir sobre ele
  • Limitação de taxa: Use o middleware de limitação de taxa integrado do ASP.NET Core para evitar abusos da API
  • Autenticação: Proteja os endpoints com tokens JWT ou chaves de API
  • Imposição de HTTPS: Todo o tráfego da API de código de barras deve trafegar sobre TLS
  • Política de CORS: Restringir quais origens podem chamar seu endpoint de digitalização
  • Gerenciamento de chave de licença: Aplique chaves de licença corretamente e configure-as no web.config para produção

Construindo o Controlador de API de Produção

[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
    private readonly ILogger<BarcodeController> _logger;
    private readonly IMemoryCache _cache;

    public BarcodeController(ILogger<BarcodeController> logger, IMemoryCache cache)
    {
        _logger = logger;
        _cache = cache;
    }

    [HttpPost("scan")]
    [ProducesResponseType(typeof(BarcodeResponse), 200)]
    [ProducesResponseType(typeof(ErrorResponse), 400)]
    public async Task<IActionResult> ScanBarcode([FromBody] BarcodeRequest request)
    {
        try
        {
            if (string.IsNullOrEmpty(request.ImageBase64))
                return BadRequest(new ErrorResponse { Error = "Image data is required" });

            var cacheKey = $"barcode_{request.ImageBase64.GetHashCode()}";
            if (_cache.TryGetValue(cacheKey, out BarcodeResponse cachedResult))
                return Ok(cachedResult);

            byte[] imageBytes = Convert.FromBase64String(request.ImageBase64);

            if (imageBytes.Length > 10 * 1024 * 1024)
                return BadRequest(new ErrorResponse { Error = "Image size exceeds 10MB limit" });

            var options = new BarcodeReaderOptions
            {
                Speed = ReadingSpeed.Faster,
                ExpectMultipleBarcodes = request.ExpectMultiple ?? false,
                UseConfidenceThreshold = true,
                ConfidenceThreshold = 0.8
            };

            var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));

            var response = new BarcodeResponse
            {
                Success = true,
                Barcodes = results.Select(r => new BarcodeData
                {
                    Type = r.BarcodeType.ToString(),
                    Value = r.Text,
                    Confidence = r.Confidence,
                    Position = new BarcodePosition
                    {
                        X = r.Points.Select(p => p.X).Min(),
                        Y = r.Points.Select(p => p.Y).Min(),
                        Width = r.Width,
                        Height = r.Height
                    }
                }).ToList()
            };

            _cache.Set(cacheKey, response, TimeSpan.FromMinutes(5));
            return Ok(response);
        }
        catch (FormatException)
        {
            return BadRequest(new ErrorResponse { Error = "Invalid base64 image data" });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error processing barcode scan");
            return StatusCode(500, new ErrorResponse { Error = "Internal server error" });
        }
    }
}

public record BarcodeRequest(string ImageBase64, bool? ExpectMultiple);

public record BarcodeResponse
{
    public bool Success { get; init; }
    public List<BarcodeData> Barcodes { get; init; } = new();
}

public record BarcodeData
{
    public string Type { get; init; }
    public string Value { get; init; }
    public double Confidence { get; init; }
    public BarcodePosition Position { get; init; }
}

public record BarcodePosition(int X, int Y, int Width, int Height);

public record ErrorResponse
{
    public bool Success => false;
    public string Error { get; init; }
}
[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
    private readonly ILogger<BarcodeController> _logger;
    private readonly IMemoryCache _cache;

    public BarcodeController(ILogger<BarcodeController> logger, IMemoryCache cache)
    {
        _logger = logger;
        _cache = cache;
    }

    [HttpPost("scan")]
    [ProducesResponseType(typeof(BarcodeResponse), 200)]
    [ProducesResponseType(typeof(ErrorResponse), 400)]
    public async Task<IActionResult> ScanBarcode([FromBody] BarcodeRequest request)
    {
        try
        {
            if (string.IsNullOrEmpty(request.ImageBase64))
                return BadRequest(new ErrorResponse { Error = "Image data is required" });

            var cacheKey = $"barcode_{request.ImageBase64.GetHashCode()}";
            if (_cache.TryGetValue(cacheKey, out BarcodeResponse cachedResult))
                return Ok(cachedResult);

            byte[] imageBytes = Convert.FromBase64String(request.ImageBase64);

            if (imageBytes.Length > 10 * 1024 * 1024)
                return BadRequest(new ErrorResponse { Error = "Image size exceeds 10MB limit" });

            var options = new BarcodeReaderOptions
            {
                Speed = ReadingSpeed.Faster,
                ExpectMultipleBarcodes = request.ExpectMultiple ?? false,
                UseConfidenceThreshold = true,
                ConfidenceThreshold = 0.8
            };

            var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));

            var response = new BarcodeResponse
            {
                Success = true,
                Barcodes = results.Select(r => new BarcodeData
                {
                    Type = r.BarcodeType.ToString(),
                    Value = r.Text,
                    Confidence = r.Confidence,
                    Position = new BarcodePosition
                    {
                        X = r.Points.Select(p => p.X).Min(),
                        Y = r.Points.Select(p => p.Y).Min(),
                        Width = r.Width,
                        Height = r.Height
                    }
                }).ToList()
            };

            _cache.Set(cacheKey, response, TimeSpan.FromMinutes(5));
            return Ok(response);
        }
        catch (FormatException)
        {
            return BadRequest(new ErrorResponse { Error = "Invalid base64 image data" });
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "Error processing barcode scan");
            return StatusCode(500, new ErrorResponse { Error = "Internal server error" });
        }
    }
}

public record BarcodeRequest(string ImageBase64, bool? ExpectMultiple);

public record BarcodeResponse
{
    public bool Success { get; init; }
    public List<BarcodeData> Barcodes { get; init; } = new();
}

public record BarcodeData
{
    public string Type { get; init; }
    public string Value { get; init; }
    public double Confidence { get; init; }
    public BarcodePosition Position { get; init; }
}

public record BarcodePosition(int X, int Y, int Width, int Height);

public record ErrorResponse
{
    public bool Success => false;
    public string Error { get; init; }
}
$vbLabelText   $csharpLabel

Esse endpoint aceita imagens codificadas em base64 -- o formato padrão para transmissão de imagens sobre HTTP. A resposta inclui tipo de código de barras, valor decodificado, pontuação de confiança e posição. Para cenários de alto volume, revise as opções de processamento de códigos de barras em lote e otimização de velocidade de leitura.

Como a API Lida com Múltiplos Códigos de Barras?

Três formatos diferentes de código de barras rotulados como A B C demonstrando QR Code, Code128 e simbologias DataMatrix que o IronBarcode processa simultaneamente em ambientes de produção

IronBarcode processa múltiplos códigos de barras em uma única imagem em uma chamada, retornando um array de resultados. Cada entrada na resposta inclui dados de posição para que a aplicação cliente possa destacar os códigos de barras detectados na tela.

Aba de rede das ferramentas de desenvolvedor do navegador mostrando resposta bem-sucedida da API JSON contendo array de três códigos de barras detectados com metadados completos, incluindo tipo, valor, confiança e coordenadas de posição

A resposta JSON estruturada fornece às aplicações clientes tudo o que é necessário para processar e exibir os resultados dos códigos de barras sem consultas adicionais.

Como Lidar com Imagens de Código de Barras Desafiadoras?

A digitalização de códigos de barras no mundo real frequentemente envolve imagens imperfeitas -- fotos tiradas em ângulos, iluminação inadequada ou códigos de barras parcialmente danificados. IronBarcode aborda esses cenários através de suas capacidades avançadas de processamento de imagem e limiares de confiança baseados em aprendizado de máquina.

Diagnosticando Problemaas Comuns de Digitalização

Antes de aplicar correções, identifique em qual categoria seu problema se enquadra. A maior parte das falhas de digitalização em produção se enquadra em um dos cinco grupos: problemas de qualidade de imagem (desfoque, ruído, baixa resolução), problemas geométricos (rotação, inclinação, distorção de perspectiva), problemas de dano (rótulos rasgados, tinta borrada), problemas de ambiente (reflexo, sombras, iluminação inconsistente), e detecção de falso positivo onde o leitor encontra um código de barras que não existe.

Saber a categoria ajuda a selecionar a combinação correta de filtro e velocidade de leitura sem executar processamento desnecessário em todas as imagens. Para a maioria dos cenários de aplicativos web, começar com ReadingSpeed.Balanced e AutoRotate = true cobre a maioria dos casos. Escale apenas para ExtremeDetail quando a primeira tentativa não retornar resultados.

A abordagem de múltiplas passagens no código abaixo implementa essa estratégia em camadas. A rápida primeira passagem lida com imagens típicas rapidamente, mantendo a latência mediana baixa para casos comuns. A detalhada segunda passagem é acionada apenas quando a primeira tentativa falha, garantindo que você só pague o custo adicional de processamento quando realmente necessário. Esse padrão mantém seu endpoint ASP.NET responsivo sob carga normal, enquanto ainda lida com casos limítrofes difíceis de forma confiável.

Problemaas Comuns de Digitalização de Código de Barras e Soluções
Problema Sintoma Solução
Imagem borrada Pontuações de confiança baixas, leituras perdidas Aplique `SharpenFilter`, aumente a velocidade `ExtremeDetail`
Código de barras girado Código de barras não detectado Habilite `AutoRotate = true`
Código de barras danificado Leituras parciais, valores incorretos Habilite correção de erros, use `RemoveFalsePositive`
Pouco contraste Detecção inconsistente Aplique `ContrastFilter` e `BrightnessFilter`
Desempenho muito lento Alta latência em uploads Use `ReadingSpeed.Faster`, habilite multithreading

Implementando Processamento de Imagem de Múltiplas Passagens

Para imagens desafiadoras, uma abordagem de processamento em camadas oferece os melhores resultados sem sacrificar o desempenho em imagens fáceis:

public class AdvancedBarcodeProcessor
{
    private readonly ILogger<AdvancedBarcodeProcessor> _logger;

    public async Task<List<ScannedBarcode>> ProcessChallengingImage(Stream imageStream)
    {
        // First pass -- fast, minimal processing
        var fastOptions = new BarcodeReaderOptions
        {
            Speed = ReadingSpeed.Balanced,
            ExpectMultipleBarcodes = true,
            AutoRotate = false,
            UseConfidenceThreshold = true,
            ConfidenceThreshold = 0.85
        };

        var results = BarcodeReader.Read(imageStream, fastOptions);

        if (!results.Any())
        {
            // Second pass -- aggressive image correction
            imageStream.Position = 0;

            var detailedOptions = new BarcodeReaderOptions
            {
                Speed = ReadingSpeed.ExtremeDetail,
                ExpectMultipleBarcodes = true,
                AutoRotate = true,
                RemoveFalsePositive = true,
                UseConfidenceThreshold = true,
                ConfidenceThreshold = 0.6,
                Multithreaded = true,
                ExpectBarcodeTypes = BarcodeEncoding.All,
                ImageFilters = new ImageFilterCollection
                {
                    new SharpenFilter(2.5f),
                    new ContrastFilter(2.0f),
                    new BrightnessFilter(1.2f),
                    new InvertFilter()
                }
            };

            results = BarcodeReader.Read(imageStream, detailedOptions);
            _logger.LogInformation("Second pass detected {Count} barcodes", results.Count());
        }

        return results.Select(r => new ScannedBarcode
        {
            Value = r.Text,
            BarcodeType = r.BarcodeType.ToString(),
            Confidence = r.Confidence,
            RotationAngle = r.RotationAngle,
            PageNumber = r.PageNumber
        }).ToList();
    }
}

public record ScannedBarcode
{
    public string Value { get; init; }
    public string BarcodeType { get; init; }
    public double Confidence { get; init; }
    public float RotationAngle { get; init; }
    public int PageNumber { get; init; }
}
public class AdvancedBarcodeProcessor
{
    private readonly ILogger<AdvancedBarcodeProcessor> _logger;

    public async Task<List<ScannedBarcode>> ProcessChallengingImage(Stream imageStream)
    {
        // First pass -- fast, minimal processing
        var fastOptions = new BarcodeReaderOptions
        {
            Speed = ReadingSpeed.Balanced,
            ExpectMultipleBarcodes = true,
            AutoRotate = false,
            UseConfidenceThreshold = true,
            ConfidenceThreshold = 0.85
        };

        var results = BarcodeReader.Read(imageStream, fastOptions);

        if (!results.Any())
        {
            // Second pass -- aggressive image correction
            imageStream.Position = 0;

            var detailedOptions = new BarcodeReaderOptions
            {
                Speed = ReadingSpeed.ExtremeDetail,
                ExpectMultipleBarcodes = true,
                AutoRotate = true,
                RemoveFalsePositive = true,
                UseConfidenceThreshold = true,
                ConfidenceThreshold = 0.6,
                Multithreaded = true,
                ExpectBarcodeTypes = BarcodeEncoding.All,
                ImageFilters = new ImageFilterCollection
                {
                    new SharpenFilter(2.5f),
                    new ContrastFilter(2.0f),
                    new BrightnessFilter(1.2f),
                    new InvertFilter()
                }
            };

            results = BarcodeReader.Read(imageStream, detailedOptions);
            _logger.LogInformation("Second pass detected {Count} barcodes", results.Count());
        }

        return results.Select(r => new ScannedBarcode
        {
            Value = r.Text,
            BarcodeType = r.BarcodeType.ToString(),
            Confidence = r.Confidence,
            RotationAngle = r.RotationAngle,
            PageNumber = r.PageNumber
        }).ToList();
    }
}

public record ScannedBarcode
{
    public string Value { get; init; }
    public string BarcodeType { get; init; }
    public double Confidence { get; init; }
    public float RotationAngle { get; init; }
    public int PageNumber { get; init; }
}
$vbLabelText   $csharpLabel

A classe BarcodeReaderOptions fornece controle detalhado sobre todos os aspectos da digitalização. Configurar AutoRotate lida com imagens capturadas em qualquer ângulo, enquanto filtros de imagem melhoram a clareza de códigos de barras borrados ou de baixo contraste. Para configuração detalhada, consulte o exemplo de configurações do leitor de código de barras e configurações específicas para PDF.

Ao trabalhar com PDFs, considere carimbar códigos de barras em PDFs ou criar códigos de barras como documentos PDF. Para processamento em alto volume, habilitar multithreading através das capacidades assíncronas e multithread melhora significativamente a taxa de transferência.

Adicionando Compatibilidade com Navegadores e Estratégias de Recuperação

Suportar navegadores diversos requer aprimoramento progressivo. Os navegadores modernos no Android e nos desktops Chrome, Edge e Firefox suportam a API MediaDevices.getUserMedia() para acesso à câmera. Safari no iOS o suporta a partir da versão 11. Navegadores empresariais antigos, modos de compatibilidade do IE11 e certos ambientes corporativos protegidos podem não suportar acesso à câmera de forma alguma, então seu caminho de recuperação de upload de arquivos deve sempre permanecer funcional.

A abordagem recomendada é usar detecção de recursos em tempo de execução em vez de análise de user-agent, e então mostrar ou esconder a interface da câmera conforme apropriado. Comece com uma interface compatível com câmera e recorra graciosamente ao upload de arquivos:

@* Razor view with progressive enhancement *@
<div class="barcode-scanner-container">
    @* Camera capture -- hidden until JavaScript confirms support *@
    <div id="cameraSection" class="d-none">
        <video id="videoPreview" class="w-100" autoplay></video>
        <button id="captureBtn" class="btn btn-primary mt-2">Capture and Scan</button>
    </div>

    @* File upload -- always available as fallback *@
    <div id="uploadSection">
        <form method="post" enctype="multipart/form-data"
              asp-action="ScanBarcode" asp-controller="Barcode">
            <div class="form-group">
                <label>Upload Barcode Image:</label>
                <input type="file" name="file" accept="image/*,.pdf"
                       class="form-control" required />
            </div>
            <button type="submit" class="btn btn-primary">Upload and Scan</button>
        </form>
    </div>
</div>
@* Razor view with progressive enhancement *@
<div class="barcode-scanner-container">
    @* Camera capture -- hidden until JavaScript confirms support *@
    <div id="cameraSection" class="d-none">
        <video id="videoPreview" class="w-100" autoplay></video>
        <button id="captureBtn" class="btn btn-primary mt-2">Capture and Scan</button>
    </div>

    @* File upload -- always available as fallback *@
    <div id="uploadSection">
        <form method="post" enctype="multipart/form-data"
              asp-action="ScanBarcode" asp-controller="Barcode">
            <div class="form-group">
                <label>Upload Barcode Image:</label>
                <input type="file" name="file" accept="image/*,.pdf"
                       class="form-control" required />
            </div>
            <button type="submit" class="btn btn-primary">Upload and Scan</button>
        </form>
    </div>
</div>
$vbLabelText   $csharpLabel

A integração Blazor fornece suporte para aplicativos web modernos com configuração mínima se você preferir uma abordagem baseada em componentes. Para resolução de problemas de implantação, consulte o guia de exceção de cópia de runtimes.

Quais são os seus próximos passos?

A digitalização de códigos de barras no ASP.NET é simples com o IronBarcode. Você instala um pacote NuGet, chama BarcodeReader.Read() e obtém resultados decodificados confiáveis em mais de 30 formatos -- incluindo imagens desafiadoras do mundo real com as quais outras bibliotecas têm dificuldade.

Para continuar construindo com base nesta fundação, explore estes recursos:

Comece com uma licença de teste gratuita para testar o IronBarcode em sua aplicação ASP.NET sem restrições. O teste inclui acesso total a todos os recursos, incluindo detecção de formato múltiplo, correção de imagem e os padrões de API REST mostrados neste guia -- para que você possa avaliar o desempenho em suas próprias imagens antes de se comprometer com uma licença de produção. Para aplicativos móveis .NET MAUI que precisam de escaneamento no dispositivo, veja o tutorial do leitor de código de barras .NET MAUI que estende a mesma API para alvos iOS e Android.

Perguntas frequentes

Qual é a principal utilização da leitura de código de barras em aplicações ASP.NET?

A leitura de códigos de barras em aplicações ASP.NET é usada principalmente para aprimorar sistemas de gerenciamento de estoque, processar ingressos em eventos e digitalizar documentos em papel, melhorando assim a eficiência e reduzindo erros.

Como o IronBarcode facilita a leitura de códigos de barras no ASP.NET?

O IronBarcode simplifica o processo de leitura de códigos de barras em ASP.NET, fornecendo componentes confiáveis e eficientes que podem ser facilmente integrados a aplicativos da web, permitindo que os desenvolvedores implementem recursos de leitura rapidamente.

Que tipos de códigos de barras podem ser lidos usando o IronBarcode?

O IronBarcode suporta a leitura de uma ampla variedade de formatos de código de barras, incluindo códigos de barras lineares tradicionais e códigos de barras 2D modernos, garantindo compatibilidade com diversas aplicações.

O IronBarcode consegue realizar a leitura de códigos de barras para processamento de documentos?

Sim, o IronBarcode é ideal para fluxos de trabalho de processamento de documentos, onde pode ser usado para digitalizar e organizar documentos em papel através da leitura de códigos de barras incorporados.

O IronBarcode é adequado para sistemas de gestão de estoque?

O IronBarcode é uma excelente opção para sistemas de gestão de estoque, pois permite o rastreamento eficiente de produtos através da leitura de códigos de barras, otimizando as operações e minimizando erros.

Como a integração do IronBarcode melhora o processamento de ingressos para eventos?

Ao integrar o IronBarcode, o processamento de ingressos para eventos torna-se perfeito, pois permite a leitura rápida dos códigos de barras, facilitando o gerenciamento de entrada rápido e preciso nos eventos.

Quais são as vantagens de usar o IronBarcode em projetos ASP.NET?

Utilizar o IronBarcode em projetos ASP.NET oferece diversas vantagens, incluindo facilidade de integração, suporte a múltiplos formatos de código de barras e melhor desempenho da aplicação, proporcionando assim uma solução robusta para as necessidades de leitura de códigos de barras.

O IronBarcode exige conhecimento avançado de programação para ser implementado?

Não, o IronBarcode foi projetado para ser amigável ao desenvolvedor, facilitando a implementação da funcionalidade de leitura de código de barras em aplicações ASP.NET com conhecimento mínimo de programação.

O IronBarcode pode ser usado em aplicativos web para dispositivos móveis?

Sim, o IronBarcode pode ser integrado em aplicativos web móveis, permitindo a leitura de códigos de barras em qualquer lugar e aumentando a versatilidade dos projetos ASP.NET.

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