# Como Validar Soma de verificaçãos de Código de Barras e Usar Leitura Compatível com Formatos em C#
Os checksums dos códigos de barras ajudam a detectar erros de substituição. Por exemplo, um único dígito invertido em uma etiqueta EAN-13 pode enviar um pacote para o armazém errado. A leitura com reconhecimento de formato fornece uma camada adicional de validação, restringindo o decodificador às simbologias esperadas. Essa abordagem reduz os falsos positivos causados por ruído de fundo e diminui o tempo de verificação, ignorando detectores de formato desnecessários.
O IronBarcode realiza a verificação de checksum automaticamente durante a decodificação. O algoritmo de dígito verificador de cada simbologia é executado por padrão, e os códigos de barras que falham são descartados antes que os resultados sejam retornados. A propriedade `BarcodeReaderOptions.ExpectBarcodeTypes` limita leituras a formatos específicos, enquanto `RemoveFalsePositive` adiciona uma varredura secundária para leituras ambíguas.
Este guia explica como validar checksums de código de barras, restringir leituras a formatos esperados e combinar ambas as técnicas em um portão de qualidade em camadas usando `BarcodeReaderOptions`.
*as-heading:2(Início Rápido: Validar Códigos de Barras com Restrições de Soma de verificação e Formato)*
Configure `BarcodeReaderOptions` com `ExpectBarcodeTypes` e `RemoveFalsePositive` para restringir leituras a simbologias esperadas com verificação automática de checksum.
```cs
using IronBarCode;
// Format-constrained read with false-positive removal.
// Limit the decoder to EAN-13 and Code128; checksums are
// validated automatically and failures are silently discarded.
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,
RemoveFalsePositive = true,
Speed = ReadingSpeed.Balanced
};
BarcodeResults results = BarcodeReader.Read("label.png", options);
```
<div class="hsg-featured-snippet">
<h3>Fluxo de trabalho mínimo (5 etapas)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/BarCode/">Baixe a biblioteca IronBarcode do NuGet</a></li>
<li>Crie uma instância de <code>BarcodeReaderOptions</code></li>
<li>Defina <code>ExpectBarcodeTypes</code> para as simbologias presentes no pipeline</li>
<li>Ative <code>RemoveFalsePositive</code> para verificação secundária</li>
<li>Chame <code>BarcodeReader.Read</code> para decodificar; os checksums são validados automaticamente durante a decodificação.</li>
</ol>
</div>
## Como Validar Soma de verificaçãos de Código de Barras?
O IronBarcode valida os checksums durante a decodificação de acordo com a especificação de cada simbologia. Por exemplo, ao ler um código de barras EAN-13, o dígito verificador Mod10 é calculado a partir dos primeiros 12 dígitos e comparado ao 13º. Se os dígitos não coincidirem, o código de barras é silenciosamente rejeitado e não aparece na coleção `BarcodeResults`. Essa abordagem se aplica a todos os formatos com dígito verificador obrigatório, incluindo UPC-A, UPC-E, EAN-8, Código 128, ITF e outros.
Este modelo implícito difere de bibliotecas que expõem uma alternância explícita. A tabela abaixo compara as duas abordagens:
<div class="content__data-table" data-content-table>
<table>
<caption>Comparação de modelos de validação de checksum: IronBarcode vs. Aspose.BarCode</caption>
<thead>
<tr><th>Aspecto</th><th>IronBarcode</th><th>Aspose.BarCode</th></tr>
</thead>
<tbody>
<tr><td>Gatilho de validação</td><td>Automático; executa durante cada decodificação.</td><td>Explícito: <code>ChecksumValidation.On</code> / <code>Off</code> / <code>Default</code></td></tr>
<tr><td>Ação do desenvolvedor necessária</td><td>Nenhum; códigos de barras inválidos são excluídos dos resultados.</td><td>Defina <code>BarcodeSettings.ChecksumValidation</code> antes de ler.</td></tr>
<tr><td>Desativar soma de verificação</td><td>Não exposto; as somas de verificação são sempre aplicadas para formatos obrigatórios.</td><td>Sim; <code>ChecksumValidation.Off</code> ignora a verificação.</td></tr>
<tr><td>Formatos de checksum opcional (Código 39)</td><td>Utiliza <code>Confidence</code> + <code>RemoveFalsePositive</code> para filtrar leituras de baixa qualidade.</td><td>Habilite explicitamente com <code>EnableChecksum.Yes</code></td></tr>
<tr><td>Comportamento de falha</td><td>Código de barras omitido silenciosamente dos resultados</td><td>O código de barras pode apresentar um valor de checksum separado para inspeção manual.</td></tr>
</tbody>
</table>
</div>
Para simbologias com checksums opcionais, como Código 39, a biblioteca usa pontuações de confiança e `RemoveFalsePositive` em vez de um alternador de checksum.
### Entrada
Uma etiqueta de prateleira de armazém Código 128 (caminho de sucesso) e uma imagem em branco sem código de barras (caminho de falha).
<div style="display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap;">
<div class="content-img-align-center" style="width: 45%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-warehouse-rack.png"
alt="Código 128 barcode encoding RACK-A1-LOT-7382 used as the warehouse rack scan input"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (caminho de sucesso)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 45%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-blank-no-barcode.png"
alt="Imagem branca em branco sem código de barras para acionar o caminho de resultado vazio"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">blank-no-barcode.png (caminho de falha - nenhum código de barras presente)</p>
</div>
</div>
</div>
```cs
using IronBarCode;
// Constrain reads to 1D formats and enable secondary verification.
// ConfidenceThreshold rejects decodes where the ML detector falls below 85%,
// acting as a quality gate for optional-checksum symbologies like Code39.
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional,
RemoveFalsePositive = true,
ConfidenceThreshold = 0.85,
Speed = ReadingSpeed.Detailed
};
BarcodeResults results = BarcodeReader.Read("warehouse-rack.png", options);
foreach (BarcodeResult result in results)
{
// Each result has passed checksum validation (mandatory formats)
// and the 85% confidence threshold, so no additional filtering is needed.
Console.WriteLine($"[{result.BarcodeType}] {result.Value} page={result.PageNumber}");
}
if (results.Count == 0)
{
Console.Error.WriteLine("No valid barcodes found. Possible causes:");
Console.Error.WriteLine(" - Check digit mismatch (barcode silently rejected)");
Console.Error.WriteLine(" - Confidence below 85% threshold");
Console.Error.WriteLine(" - Format not in ExpectBarcodeTypes");
}
```
### Saída
#### Caminho para o Sucesso
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-checksum-validation-success.webp"
alt="Saída do console mostrando o código 128 RACK-A1-LOT-7382 decodificado acima do limite de confiança."
class="img-responsive add-shadow" />
</div>
</div>
O código de barras do rack do armazém voltou como `RACK-A1-LOT-7382` na página 0. Ele ultrapassou o limite de confiança de 85% e passou na validação de checksum, portanto, aparece em `BarcodeResults`.
#### Caminho de Falha
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-checksum-validation-failure.webp"
alt="Saída do console mostrando o aviso: nenhum código de barras válido encontrado para a entrada de imagem em branco."
class="img-responsive add-shadow" />
</div>
</div>
Elevar `ConfidenceThreshold` acima de seu padrão de 0,7 aperta ainda mais este portão para simbologias de checksum opcional, como Código 39.
Com a validação de checksum resolvida, o próximo passo é restringir o leitor aos formatos de código de barras que seu pipeline espera.
---
## Como Usar a Leitura de Código de Barras Sensível ao Formato?
O enum `BarcodeEncoding` é um tipo de bandeiras, permitindo que vários formatos sejam combinados usando o operador OR bit a bit. Definir `ExpectBarcodeTypes` limita o leitor a esses formatos e pula a detecção para outros.
<div class="content__data-table" data-content-table>
<table>
<caption>Valores Comuns de BarcodeEncoding</caption>
<thead>
<tr><th>Valor</th><th>Categoria</th><th>Descrição</th><th>Soma de verificação</th></tr>
</thead>
<tbody>
<tr><td><code>BarcodeEncoding.All</code></td><td>Meta</td><td>Todos os formatos suportados (comportamento padrão)</td><td>Por formato</td></tr>
<tr><td><code>BarcodeEncoding.AllOneDimensional</code></td><td>Meta</td><td>Todos os formatos lineares (1D), incluindo empilhado</td><td>Por formato</td></tr>
<tr><td><code>BarcodeEncoding.AllTwoDimensional</code></td><td>Meta</td><td>Todos os formatos de matriz/rede (2D)</td><td>Por formato</td></tr>
<tr><td><code>BarcodeEncoding.Code128</code></td><td>1D</td><td>Alfanumérico de alta densidade (logística, transporte)</td><td>Obrigatório (Mod103 ponderado)</td></tr>
<tr><td><code>BarcodeEncoding.EAN13</code></td><td>1D</td><td>Identificação de produto de varejo, 13 dígitos</td><td>Obrigatório (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.QRCode</code></td><td>2D</td><td>Matriz de alta capacidade (URLs, dados estruturados)</td><td>ECC de Reed-Solomon</td></tr>
<tr><td><code>BarcodeEncoding.Code39</code></td><td>1D</td><td>Alfanumérico (defesa, automotivo)</td><td>Opcional (Mod43)</td></tr>
<tr><td><code>BarcodeEncoding.UPCA</code></td><td>1D</td><td>Varejo norte-americano, 12 dígitos</td><td>Obrigatório (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.DataMatrix</code></td><td>2D</td><td>Matriz compacta (eletrônica, indústria farmacêutica)</td><td>ECC de Reed-Solomon</td></tr>
<tr><td><code>BarcodeEncoding.PDF417</code></td><td>2D</td><td>Empilhados (carteiras de identidade, transporte)</td><td>ECC de Reed-Solomon</td></tr>
</tbody>
</table>
</div>
Além da velocidade, restringir o conjunto de formatos funciona como um mecanismo de validação: códigos de barras com qualquer simbologia não listada são excluídos dos resultados, mesmo que estejam fisicamente presentes na imagem.
### Entrada
Uma etiqueta de envio Código 128 (caminho de sucesso) e um código QR que não corresponde à restrição de aceitar apenas Código 128 (caminho de falha).
<div style="display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap;">
<div class="content-img-align-center" style="width: 45%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-shipping-label.png"
alt="Código 128 barcode encoding SHIP-2024-00438 used as the shipping label input"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">shipping-label.png (caminho de sucesso - Código 128 corresponde à restrição)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 45%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-qr-format-mismatch.png"
alt="QR code used as the format-mismatch failure path for the Código 128-only constrained read"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">qr-format-mismatch.png (caminho de falha - QR rejeitado pelo filtro somente Código 128)</p>
</div>
</div>
</div>
```cs
using IronBarCode;
// Constrained read: only Code128 barcodes are returned.
// Faster because the reader skips all other format detectors.
var constrainedOptions = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.Code128,
Speed = ReadingSpeed.Faster,
ExpectMultipleBarcodes = false
};
// Broad read: all supported formats are scanned.
// Useful for verification or when the image format is unknown.
var broadOptions = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.All,
Speed = ReadingSpeed.Detailed,
ExpectMultipleBarcodes = true
};
string imagePath = "shipping-label.png";
BarcodeResults constrained = BarcodeReader.Read(imagePath, constrainedOptions);
Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found");
BarcodeResults broad = BarcodeReader.Read(imagePath, broadOptions);
Console.WriteLine($"Broad: {broad.Count} barcode(s) found across all formats");
foreach (BarcodeResult result in broad)
{
Console.WriteLine($" [{result.BarcodeType}] {result.Value}");
}
```
### Saída
#### Caminho para o Sucesso
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-format-aware-success.webp"
alt="Saída do console mostrando leitura restrita encontrando 1 código de barras Código 128 e leitura ampla confirmando-o."
class="img-responsive add-shadow" />
</div>
</div>
A etiqueta de envio tem um valor de `SHIP-2024-00438`. A leitura restrita detecta imediatamente, já que o Código 128 é o que o filtro espera, e a leitura ampla confirma o mesmo resultado em todos os formatos.
#### Caminho de Falha
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-format-aware-failure.webp"
alt="Saída do console mostrando leitura restrita retornando 0 resultados para uma imagem de código QR."
class="img-responsive add-shadow" />
</div>
</div>
Resultados vazios de uma leitura restrita são um sinal de validação, não um erro; Registre a discrepância para revisão.
Para fluxos de trabalho que misturam tipos de código de barras (por exemplo, uma nota de embalagem com um código de produto EAN-13 e um número de rastreamento Código 128), combine os formatos esperados:
```cs
using IronBarCode;
// Combine multiple format flags with | to scan for more than one symbology
// in a single pass. Each BarcodeResult.BarcodeType identifies which format
// was decoded, enabling downstream routing logic per symbology.
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,
ExpectMultipleBarcodes = true
};
```
Cada `BarcodeResult.BarcodeType` retornado identifica qual formato foi decodificado, permitindo o encaminhamento a jusante.
### Quais Simbologias Suportam Validação de Soma de verificação?
Nem todos os formatos de códigos de barras usam checksums da mesma maneira. A tabela a seguir mapeia simbologias comuns para suas características de detecção de erros, o que informa quão agressivamente definir `ConfidenceThreshold` e `RemoveFalsePositive` para cada formato:
<div class="content__data-table" data-content-table>
<table>
<caption>Características do Soma de verificação por Simbologia</caption>
<thead>
<tr><th>Simbologia</th><th>Tipo de Soma de verificação</th><th>Obrigatório?</th><th>Recomendação</th></tr>
</thead>
<tbody>
<tr><td>EAN-13 / EAN-8</td><td>Mod10</td><td>Sim</td><td>Configurações padrão suficientes; verificação de soma de verificação sempre aplicada.</td></tr>
<tr><td>UPC-A / UPC-E</td><td>Mod10</td><td>Sim</td><td>Configurações padrão suficientes; dígito verificador corrigido automaticamente na gravação.</td></tr>
<tr><td>Código 128</td><td>Peso Mod103</td><td>Sim</td><td>Configurações padrão suficientes; obrigatórias conforme especificação</td></tr>
<tr><td>Código 39</td><td>Mod43</td><td>Opcional</td><td>Aumente <code>ConfidenceThreshold</code> para 0.8+ e ative <code>RemoveFalsePositive</code></td></tr>
<tr><td>Codabar</td><td>Mod16</td><td>Opcional</td><td>Semelhante ao Código 39; use a confiança como critério de qualidade.</td></tr>
<tr><td>ITF</td><td>Mod10</td><td>Opcional</td><td>Ative <code>RemoveFalsePositive</code> para formatos intercalados</td></tr>
<tr><td>Código QR / DataMatrix</td><td>ECC de Reed-Solomon</td><td>Sempre</td><td>Correção de erros estruturais; nenhuma configuração adicional necessária.</td></tr>
<tr><td>PDF417</td><td>ECC de Reed-Solomon</td><td>Sempre</td><td>Assim como em QR/DataMatrix, a correção de erros é inerente.</td></tr>
</tbody>
</table>
</div>
Para simbologias 2D como QR, DataMatrix e PDF417, a correção de erros está integrada na estrutura de codificação. Esses formatos podem se recuperar de danos parciais sem depender de um simples dígito verificador. O `ConfidenceThreshold` ainda se aplica durante a fase de detecção de ML, enquanto a etapa de decodificação se beneficia da redundância interna da simbologia.
Agora que ambas as técnicas foram compreendidas, vamos combiná-las em um único padrão de validação pronto para produção.
---
## Como Combinar Soma de verificaçãos com Restrições de Formato?
O padrão pronto para produção configura `ExpectBarcodeTypes`, `RemoveFalsePositive`, `ConfidenceThreshold` e `Speed` em um único objeto `BarcodeReaderOptions`. Juntos, eles formam um mecanismo de controle em camadas: as restrições de formato restringem o espaço de busca, a validação de checksum garante a integridade dos dados, o limiar de confiança filtra decodificações marginais e a remoção de falsos positivos adiciona uma segunda etapa de verificação.
### Entrada
Três códigos de barras de verificação de PDV do diretório `pos-scans/` usados como caminho de sucesso: dois EAN-13 e um UPC-A. Uma etiqueta de rack de armazém Código 128 é usada como o caminho de falha - a restrição EAN-13/UPC-A a rejeita e registra uma linha `REJECT`.
<div style="display: flex; gap: 1rem; justify-content: center; flex-wrap: wrap;">
<div class="content-img-align-center" style="width: 22%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-pos-scan-1.png"
alt="EAN-13 barcode encoding 5901234123471 used as POS scan input 1"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">pos-scan-1.png (sucesso)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 22%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-pos-scan-2.png"
alt="EAN-13 barcode encoding 4006381333931 used as POS scan input 2"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">pos-scan-2.png (sucesso)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 22%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-pos-scan-3.png"
alt="UPC-A barcode encoding 012345678905 used as POS scan input 3"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">pos-scan-3.png (sucesso)</p>
</div>
</div>
<div class="content-img-align-center" style="width: 22%;">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/input-warehouse-rack.png"
alt="Código 128 barcode encoding RACK-A1-LOT-7382 used as the combined-validation failure path input"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (falha - Código 128 rejeitado)</p>
</div>
</div>
</div>
```cs
using IronBarCode;
// Layered validation for retail POS: EAN-13, UPC-A, and UPC-E only.
// Each property adds a distinct filter to the read pipeline.
var options = new BarcodeReaderOptions
{
// Layer 1: format constraint, accept only retail symbologies
ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.UPCA | BarcodeEncoding.UPCE,
// Layer 2: confidence threshold, reject decodes below 80%
ConfidenceThreshold = 0.8,
// Layer 3: false-positive removal, runs a secondary verification pass
RemoveFalsePositive = true,
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false,
// Require 3 agreeing scan lines to reduce phantom reads from noisy images
MinScanLines = 3
};
string[] scanFiles = Directory.GetFiles("pos-scans/", "*.png");
foreach (string file in scanFiles)
{
BarcodeResults results = BarcodeReader.Read(file, options);
if (results.Count == 0)
{
// No barcode passed all validation layers
Console.Error.WriteLine($"REJECT {Path.GetFileName(file)}: "
+ "no valid EAN-13/UPC barcode (checksum, confidence, or format mismatch)");
continue;
}
BarcodeResult primary = results.First();
// Post-read assertion: verify the decoded format matches expectations.
// ExpectBarcodeTypes already constrains the reader; this check documents
// intent and surfaces unexpected results during future changes.
if (primary.BarcodeType != BarcodeEncoding.EAN13
&& primary.BarcodeType != BarcodeEncoding.UPCA
&& primary.BarcodeType != BarcodeEncoding.UPCE)
{
Console.Error.WriteLine($"UNEXPECTED FORMAT {Path.GetFileName(file)}: "
+ $"got {primary.BarcodeType}, expected EAN-13/UPC");
continue;
}
Console.WriteLine($"OK {Path.GetFileName(file)}: [{primary.BarcodeType}] {primary.Value}");
}
```
### Saída
#### Caminho para o Sucesso
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-combined-validation-success.webp"
alt="Saída do console mostrando todos os 3 códigos de barras lidos no PDV aceitos com status OK e valores decodificados."
class="img-responsive add-shadow" />
</div>
</div>
Todas as três imagens de leitura do PDV foram aprovadas. O leitor retornou valores de `5901234123471`, `4006381333931` e `012345678905`. Cada um correspondia ao `EAN13 |UPCA| O filtro `UPCE` tinha um checksum Mod10 válido e um nível de confiança superior a 0,8.
#### Caminho de Falha
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/barcode/how-to/checksum-and-format-validation/output-combined-validation-failure.webp"
alt="Saída do console mostrando o código de barras Código 128 do rack do armazém rejeitado pelo filtro EAN-13/UPC-A."
class="img-responsive add-shadow" />
</div>
</div>
Definir `MinScanLines` para 3 aumenta o número mínimo de linhas de verificação concordantes necessárias para que um código de barras 1D seja válido; O valor padrão é 2. Aumentar esse valor reduz o risco de leituras fantasmas causadas por linhas de varredura ruidosas, mas pode fazer com que códigos de barras finos ou parcialmente danificados sejam perdidos. Em ambientes de ponto de venda (PDV) com etiquetas impressas de alta qualidade, o valor 3 é uma escolha conservadora que reforça a validação sem afetar a produtividade.
A asserção `BarcodeType` pós-leitura é uma defesa em profundidade: `ExpectBarcodeTypes` já faz filtros, mas a verificação explícita documenta a intenção e captura desvios de configuração sem custo de tempo de execução. Para otimização de velocidade, `ReadingSpeed.Faster` se adequa a etiquetas de máquina impressas limpas; `Detailed` e `ExtremeDetail` recuperam códigos de barras danificados ou mal iluminados ao custo de tempos de varredura mais longos.
---
## Quais são os meus próximos passos?
Este artigo abordou o modelo de validação de checksum implícito do IronBarcode, o enum de bandeiras `BarcodeEncoding` para leituras restritas por formato, e um padrão de validação combinado usando `ExpectBarcodeTypes`, `ConfidenceThreshold`, `RemoveFalsePositive` e `MinScanLines` como portões de qualidade em camadas.
Para leitura adicional, explore estes recursos:
- [Tutoriais de IronBarcode - Lendo Códigos de Barras](https://ironsoftware.com/csharp/barcode/tutorials/reading-barcodes/) para guias completos de leitura.
- [Prevenção de Falsos Positivos](https://ironsoftware.com/csharp/barcode/troubleshooting/false-positives/) para o mecanismo `RemoveFalsePositive` em detalhe.
- [Exemplos de Limiar de Confiança](https://ironsoftware.com/csharp/barcode/examples/confidence-threshold/) para afinação de detecção baseada em ML.
- [Formatos de Dados de Saída](https://ironsoftware.com/csharp/barcode/how-to/output-data-formats/) para referência da propriedade `BarcodeResult`.
- [Como Corrigir Imagens](https://ironsoftware.com/csharp/barcode/how-to/image-correction/) para filtros que melhoram a precisão da decodificação.
- [Referência de API BarcodeReaderOptions](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeReaderOptions.html) para documentação completa de configuração.
- [Referência de API BarcodeEncoding](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeEncoding.html) para a lista completa de simbologias suportadas.
[Obtenha uma licença de teste gratuita](https://ironsoftware.com/csharp/barcode/#trial-license) para testar todos os recursos em um ambiente real ou [ver opções de licenciamento](https://ironsoftware.com/csharp/barcode/licensing/) quando o pipeline estiver pronto para produção.
Os checksums dos códigos de barras ajudam a detectar erros de substituição. Por exemplo, um único dígito invertido em uma etiqueta EAN-13 pode enviar um pacote para o armazém errado. A leitura com reconhecimento de formato fornece uma camada adicional de validação, restringindo o decodificador às simbologias esperadas. Essa abordagem reduz os falsos positivos causados por ruído de fundo e diminui o tempo de verificação, ignorando detectores de formato desnecessários.
O IronBarcode realiza a verificação de checksum automaticamente durante a decodificação. O algoritmo de dígito verificador de cada simbologia é executado por padrão, e os códigos de barras que falham são descartados antes que os resultados sejam retornados. A propriedade BarcodeReaderOptions.ExpectBarcodeTypes limita leituras a formatos específicos, enquanto RemoveFalsePositive adiciona uma varredura secundária para leituras ambíguas.
Este guia explica como validar checksums de código de barras, restringir leituras a formatos esperados e combinar ambas as técnicas em um portão de qualidade em camadas usando BarcodeReaderOptions.
Início Rápido: Validar Códigos de Barras com Restrições de Soma de verificação e Formato
Configure BarcodeReaderOptions com ExpectBarcodeTypes e RemoveFalsePositive para restringir leituras a simbologias esperadas com verificação automática de checksum.
using IronBarCode;// Format-constrained read with false-positive removal.// Limit the decoder to EAN-13 and Code128; checksums are// validated automatically and failures are silently discarded.var options = new BarcodeReaderOptions{ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,RemoveFalsePositive = true,Speed = ReadingSpeed.Balanced};BarcodeResults results = BarcodeReader.Read("label.png", options);
using IronBarCode;
// Format-constrained read with false-positive removal.
// Limit the decoder to EAN-13 and Code128; checksums are
// validated automatically and failures are silently discarded.
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,
RemoveFalsePositive = true,
Speed = ReadingSpeed.Balanced
};
BarcodeResults results = BarcodeReader.Read("label.png", options);
ImportsIronBarCode' Format-constrained read with false-positive removal.' Limit the decoder to EAN-13 and Code128; checksums are' validated automatically and failures are silently discarded.Dim options As New BarcodeReaderOptionsWith { .ExpectBarcodeTypes = BarcodeEncoding.EAN13OrBarcodeEncoding.Code128, .RemoveFalsePositive = True, .Speed = ReadingSpeed.Balanced}Dim results AsBarcodeResults = BarcodeReader.Read("label.png", options)
Imports IronBarCode
' Format-constrained read with false-positive removal.
' Limit the decoder to EAN-13 and Code128; checksums are
' validated automatically and failures are silently discarded.
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.EAN13 Or BarcodeEncoding.Code128,
.RemoveFalsePositive = True,
.Speed = ReadingSpeed.Balanced
}
Dim results As BarcodeResults = BarcodeReader.Read("label.png", options)
Defina ExpectBarcodeTypes para as simbologias presentes no pipeline
Ative RemoveFalsePositive para verificação secundária
Chame BarcodeReader.Read para decodificar; os checksums são validados automaticamente durante a decodificação.
Como Validar Soma de verificaçãos de Código de Barras?
O IronBarcode valida os checksums durante a decodificação de acordo com a especificação de cada simbologia. Por exemplo, ao ler um código de barras EAN-13, o dígito verificador Mod10 é calculado a partir dos primeiros 12 dígitos e comparado ao 13º. Se os dígitos não coincidirem, o código de barras é silenciosamente rejeitado e não aparece na coleção BarcodeResults. Essa abordagem se aplica a todos os formatos com dígito verificador obrigatório, incluindo UPC-A, UPC-E, EAN-8, Código 128, ITF e outros.
Este modelo implícito difere de bibliotecas que expõem uma alternância explícita. A tabela abaixo compara as duas abordagens:
Comparação de modelos de validação de checksum: IronBarcode vs. Aspose.BarCode
Aspecto
IronBarcode
Aspose.BarCode
Gatilho de validação
Automático; executa durante cada decodificação.
Explícito: ChecksumValidation.On / Off / Default
Ação do desenvolvedor necessária
Nenhum; códigos de barras inválidos são excluídos dos resultados.
Defina BarcodeSettings.ChecksumValidation antes de ler.
Desativar soma de verificação
Não exposto; as somas de verificação são sempre aplicadas para formatos obrigatórios.
Sim; ChecksumValidation.Off ignora a verificação.
Formatos de checksum opcional (Código 39)
Utiliza Confidence + RemoveFalsePositive para filtrar leituras de baixa qualidade.
Habilite explicitamente com EnableChecksum.Yes
Comportamento de falha
Código de barras omitido silenciosamente dos resultados
O código de barras pode apresentar um valor de checksum separado para inspeção manual.
Para simbologias com checksums opcionais, como Código 39, a biblioteca usa pontuações de confiança e RemoveFalsePositive em vez de um alternador de checksum.
Entrada
Uma etiqueta de prateleira de armazém Código 128 (caminho de sucesso) e uma imagem em branco sem código de barras (caminho de falha).
warehouse-rack.png (caminho de sucesso)
blank-no-barcode.png (caminho de falha - nenhum código de barras presente)
using IronBarCode;// Constrain reads to 1D formats and enable secondary verification.// ConfidenceThreshold rejects decodes where the ML detector falls below 85%,// acting as a quality gate for optional-checksum symbologies like Code39.var options = new BarcodeReaderOptions{ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional,RemoveFalsePositive = true,ConfidenceThreshold = 0.85,Speed = ReadingSpeed.Detailed};BarcodeResults results = BarcodeReader.Read("warehouse-rack.png", options);foreach (BarcodeResult result in results){ // Each result has passed checksum validation (mandatory formats) // and the 85% confidence threshold, so no additional filtering is needed.Console.WriteLine($"[{result.BarcodeType}] {result.Value} page={result.PageNumber}");}if (results.Count == 0){Console.Error.WriteLine("No valid barcodes found. Possible causes:");Console.Error.WriteLine(" - Check digit mismatch (barcode silently rejected)");Console.Error.WriteLine(" - Confidence below 85% threshold");Console.Error.WriteLine(" - Format not in ExpectBarcodeTypes");}
using IronBarCode;
// Constrain reads to 1D formats and enable secondary verification.
// ConfidenceThreshold rejects decodes where the ML detector falls below 85%,
// acting as a quality gate for optional-checksum symbologies like Code39.
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional,
RemoveFalsePositive = true,
ConfidenceThreshold = 0.85,
Speed = ReadingSpeed.Detailed
};
BarcodeResults results = BarcodeReader.Read("warehouse-rack.png", options);
foreach (BarcodeResult result in results)
{
// Each result has passed checksum validation (mandatory formats)
// and the 85% confidence threshold, so no additional filtering is needed.
Console.WriteLine($"[{result.BarcodeType}] {result.Value} page={result.PageNumber}");
}
if (results.Count == 0)
{
Console.Error.WriteLine("No valid barcodes found. Possible causes:");
Console.Error.WriteLine(" - Check digit mismatch (barcode silently rejected)");
Console.Error.WriteLine(" - Confidence below 85% threshold");
Console.Error.WriteLine(" - Format not in ExpectBarcodeTypes");
}
ImportsIronBarCode' Constrain reads to 1D formats and enable secondary verification.' ConfidenceThreshold rejects decodes where the ML detector falls below 85%,' acting as a quality gate for optional-checksum symbologies like Code39.Dim options As New BarcodeReaderOptionsWith { .ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional, .RemoveFalsePositive = True, .ConfidenceThreshold = 0.85, .Speed = ReadingSpeed.Detailed}Dim results AsBarcodeResults = BarcodeReader.Read("warehouse-rack.png", options)For Each result AsBarcodeResultIn results ' Each result has passed checksum validation (mandatory formats) ' and the 85% confidence threshold, so no additional filtering is needed.Console.WriteLine($"[{result.BarcodeType}] {result.Value} page={result.PageNumber}")NextIf results.Count = 0 ThenConsole.Error.WriteLine("No valid barcodes found. Possible causes:")Console.Error.WriteLine(" - Check digit mismatch (barcode silently rejected)")Console.Error.WriteLine(" - Confidence below 85% threshold")Console.Error.WriteLine(" - Format not in ExpectBarcodeTypes")End If
Imports IronBarCode
' Constrain reads to 1D formats and enable secondary verification.
' ConfidenceThreshold rejects decodes where the ML detector falls below 85%,
' acting as a quality gate for optional-checksum symbologies like Code39.
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional,
.RemoveFalsePositive = True,
.ConfidenceThreshold = 0.85,
.Speed = ReadingSpeed.Detailed
}
Dim results As BarcodeResults = BarcodeReader.Read("warehouse-rack.png", options)
For Each result As BarcodeResult In results
' Each result has passed checksum validation (mandatory formats)
' and the 85% confidence threshold, so no additional filtering is needed.
Console.WriteLine($"[{result.BarcodeType}] {result.Value} page={result.PageNumber}")
Next
If results.Count = 0 Then
Console.Error.WriteLine("No valid barcodes found. Possible causes:")
Console.Error.WriteLine(" - Check digit mismatch (barcode silently rejected)")
Console.Error.WriteLine(" - Confidence below 85% threshold")
Console.Error.WriteLine(" - Format not in ExpectBarcodeTypes")
End If
Saída
Caminho para o Sucesso
O código de barras do rack do armazém voltou como RACK-A1-LOT-7382 na página 0. Ele ultrapassou o limite de confiança de 85% e passou na validação de checksum, portanto, aparece em BarcodeResults.
Caminho de Falha
Elevar ConfidenceThreshold acima de seu padrão de 0,7 aperta ainda mais este portão para simbologias de checksum opcional, como Código 39.
Com a validação de checksum resolvida, o próximo passo é restringir o leitor aos formatos de código de barras que seu pipeline espera.
Como Usar a Leitura de Código de Barras Sensível ao Formato?
O enum BarcodeEncoding é um tipo de bandeiras, permitindo que vários formatos sejam combinados usando o operador OR bit a bit. Definir ExpectBarcodeTypes limita o leitor a esses formatos e pula a detecção para outros.
Valores Comuns de BarcodeEncoding
Valor
Categoria
Descrição
Soma de verificação
BarcodeEncoding.All
Meta
Todos os formatos suportados (comportamento padrão)
Por formato
BarcodeEncoding.AllOneDimensional
Meta
Todos os formatos lineares (1D), incluindo empilhado
Por formato
BarcodeEncoding.AllTwoDimensional
Meta
Todos os formatos de matriz/rede (2D)
Por formato
BarcodeEncoding.Code128
1D
Alfanumérico de alta densidade (logística, transporte)
Obrigatório (Mod103 ponderado)
BarcodeEncoding.EAN13
1D
Identificação de produto de varejo, 13 dígitos
Obrigatório (Mod10)
BarcodeEncoding.QRCode
2D
Matriz de alta capacidade (URLs, dados estruturados)
Além da velocidade, restringir o conjunto de formatos funciona como um mecanismo de validação: códigos de barras com qualquer simbologia não listada são excluídos dos resultados, mesmo que estejam fisicamente presentes na imagem.
Entrada
Uma etiqueta de envio Código 128 (caminho de sucesso) e um código QR que não corresponde à restrição de aceitar apenas Código 128 (caminho de falha).
shipping-label.png (caminho de sucesso - Código 128 corresponde à restrição)
qr-format-mismatch.png (caminho de falha - QR rejeitado pelo filtro somente Código 128)
using IronBarCode;// Constrained read: only Code128 barcodes are returned.// Faster because the reader skips all other format detectors.var constrainedOptions = new BarcodeReaderOptions{ExpectBarcodeTypes = BarcodeEncoding.Code128,Speed = ReadingSpeed.Faster,ExpectMultipleBarcodes = false};// Broad read: all supported formats are scanned.// Useful for verification or when the image format is unknown.var broadOptions = new BarcodeReaderOptions{ExpectBarcodeTypes = BarcodeEncoding.All,Speed = ReadingSpeed.Detailed,ExpectMultipleBarcodes = true};string imagePath = "shipping-label.png";BarcodeResults constrained = BarcodeReader.Read(imagePath, constrainedOptions);Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found");BarcodeResults broad = BarcodeReader.Read(imagePath, broadOptions);Console.WriteLine($"Broad: {broad.Count} barcode(s) found across all formats");foreach (BarcodeResult result in broad){Console.WriteLine($" [{result.BarcodeType}] {result.Value}");}
using IronBarCode;
// Constrained read: only Code128 barcodes are returned.
// Faster because the reader skips all other format detectors.
var constrainedOptions = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.Code128,
Speed = ReadingSpeed.Faster,
ExpectMultipleBarcodes = false
};
// Broad read: all supported formats are scanned.
// Useful for verification or when the image format is unknown.
var broadOptions = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.All,
Speed = ReadingSpeed.Detailed,
ExpectMultipleBarcodes = true
};
string imagePath = "shipping-label.png";
BarcodeResults constrained = BarcodeReader.Read(imagePath, constrainedOptions);
Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found");
BarcodeResults broad = BarcodeReader.Read(imagePath, broadOptions);
Console.WriteLine($"Broad: {broad.Count} barcode(s) found across all formats");
foreach (BarcodeResult result in broad)
{
Console.WriteLine($" [{result.BarcodeType}] {result.Value}");
}
ImportsIronBarCode' Constrained read: only Code128 barcodes are returned.' Faster because the reader skips all other format detectors.Dim constrainedOptions As New BarcodeReaderOptionsWith { .ExpectBarcodeTypes = BarcodeEncoding.Code128, .Speed = ReadingSpeed.Faster, .ExpectMultipleBarcodes = False}' Broad read: all supported formats are scanned.' Useful for verification or when the image format is unknown.Dim broadOptions As New BarcodeReaderOptionsWith { .ExpectBarcodeTypes = BarcodeEncoding.All, .Speed = ReadingSpeed.Detailed, .ExpectMultipleBarcodes = True}Dim imagePath AsString = "shipping-label.png"Dim constrained AsBarcodeResults = BarcodeReader.Read(imagePath, constrainedOptions)Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found")Dim broad AsBarcodeResults = BarcodeReader.Read(imagePath, broadOptions)Console.WriteLine($"Broad: {broad.Count} barcode(s) found across all formats")For Each result AsBarcodeResultIn broadConsole.WriteLine($" [{result.BarcodeType}] {result.Value}")Next
Imports IronBarCode
' Constrained read: only Code128 barcodes are returned.
' Faster because the reader skips all other format detectors.
Dim constrainedOptions As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.Code128,
.Speed = ReadingSpeed.Faster,
.ExpectMultipleBarcodes = False
}
' Broad read: all supported formats are scanned.
' Useful for verification or when the image format is unknown.
Dim broadOptions As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.All,
.Speed = ReadingSpeed.Detailed,
.ExpectMultipleBarcodes = True
}
Dim imagePath As String = "shipping-label.png"
Dim constrained As BarcodeResults = BarcodeReader.Read(imagePath, constrainedOptions)
Console.WriteLine($"Constrained: {constrained.Count} Code128 barcode(s) found")
Dim broad As BarcodeResults = BarcodeReader.Read(imagePath, broadOptions)
Console.WriteLine($"Broad: {broad.Count} barcode(s) found across all formats")
For Each result As BarcodeResult In broad
Console.WriteLine($" [{result.BarcodeType}] {result.Value}")
Next
Saída
Caminho para o Sucesso
A etiqueta de envio tem um valor de SHIP-2024-00438. A leitura restrita detecta imediatamente, já que o Código 128 é o que o filtro espera, e a leitura ampla confirma o mesmo resultado em todos os formatos.
Caminho de Falha
Resultados vazios de uma leitura restrita são um sinal de validação, não um erro; Registre a discrepância para revisão.
Para fluxos de trabalho que misturam tipos de código de barras (por exemplo, uma nota de embalagem com um código de produto EAN-13 e um número de rastreamento Código 128), combine os formatos esperados:
using IronBarCode;// Combine multiple format flags with | to scan for more than one symbology// in a single pass. Each BarcodeResult.BarcodeType identifies which format// was decoded, enabling downstream routing logic per symbology.var options = new BarcodeReaderOptions{ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,ExpectMultipleBarcodes = true};
using IronBarCode;
// Combine multiple format flags with | to scan for more than one symbology
// in a single pass. Each BarcodeResult.BarcodeType identifies which format
// was decoded, enabling downstream routing logic per symbology.
var options = new BarcodeReaderOptions
{
ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.Code128,
ExpectMultipleBarcodes = true
};
ImportsIronBarCode' Combine multiple format flags with Or to scan for more than one symbology' in a single pass. Each BarcodeResult.BarcodeType identifies which format' was decoded, enabling downstream routing logic per symbology.Dim options As New BarcodeReaderOptionsWith { .ExpectBarcodeTypes = BarcodeEncoding.EAN13OrBarcodeEncoding.Code128, .ExpectMultipleBarcodes = True}
Imports IronBarCode
' Combine multiple format flags with Or to scan for more than one symbology
' in a single pass. Each BarcodeResult.BarcodeType identifies which format
' was decoded, enabling downstream routing logic per symbology.
Dim options As New BarcodeReaderOptions With {
.ExpectBarcodeTypes = BarcodeEncoding.EAN13 Or BarcodeEncoding.Code128,
.ExpectMultipleBarcodes = True
}
Cada BarcodeResult.BarcodeType retornado identifica qual formato foi decodificado, permitindo o encaminhamento a jusante.
Quais Simbologias Suportam Validação de Soma de verificação?
Nem todos os formatos de códigos de barras usam checksums da mesma maneira. A tabela a seguir mapeia simbologias comuns para suas características de detecção de erros, o que informa quão agressivamente definir ConfidenceThreshold e RemoveFalsePositive para cada formato:
Características do Soma de verificação por Simbologia
Simbologia
Tipo de Soma de verificação
Obrigatório?
Recomendação
EAN-13 / EAN-8
Mod10
Sim
Configurações padrão suficientes; verificação de soma de verificação sempre aplicada.
UPC-A / UPC-E
Mod10
Sim
Configurações padrão suficientes; dígito verificador corrigido automaticamente na gravação.
Aumente ConfidenceThreshold para 0.8+ e ative RemoveFalsePositive
Codabar
Mod16
Opcional
Semelhante ao Código 39; use a confiança como critério de qualidade.
ITF
Mod10
Opcional
Ative RemoveFalsePositive para formatos intercalados
Código QR / DataMatrix
ECC de Reed-Solomon
Sempre
Correção de erros estruturais; nenhuma configuração adicional necessária.
PDF417
ECC de Reed-Solomon
Sempre
Assim como em QR/DataMatrix, a correção de erros é inerente.
Para simbologias 2D como QR, DataMatrix e PDF417, a correção de erros está integrada na estrutura de codificação. Esses formatos podem se recuperar de danos parciais sem depender de um simples dígito verificador. O ConfidenceThreshold ainda se aplica durante a fase de detecção de ML, enquanto a etapa de decodificação se beneficia da redundância interna da simbologia.
Agora que ambas as técnicas foram compreendidas, vamos combiná-las em um único padrão de validação pronto para produção.
Como Combinar Soma de verificaçãos com Restrições de Formato?
O padrão pronto para produção configura ExpectBarcodeTypes, RemoveFalsePositive, ConfidenceThreshold e Speed em um único objeto BarcodeReaderOptions. Juntos, eles formam um mecanismo de controle em camadas: as restrições de formato restringem o espaço de busca, a validação de checksum garante a integridade dos dados, o limiar de confiança filtra decodificações marginais e a remoção de falsos positivos adiciona uma segunda etapa de verificação.
Entrada
Três códigos de barras de verificação de PDV do diretório pos-scans/ usados como caminho de sucesso: dois EAN-13 e um UPC-A. Uma etiqueta de rack de armazém Código 128 é usada como o caminho de falha - a restrição EAN-13/UPC-A a rejeita e registra uma linha REJECT.
pos-scan-1.png (sucesso)
pos-scan-2.png (sucesso)
pos-scan-3.png (sucesso)
warehouse-rack.png (falha - Código 128 rejeitado)
using IronBarCode;// Layered validation for retail POS: EAN-13, UPC-A, and UPC-E only.// Each property adds a distinct filter to the read pipeline.var options = new BarcodeReaderOptions{ // Layer 1: format constraint, accept only retail symbologiesExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.UPCA | BarcodeEncoding.UPCE, // Layer 2: confidence threshold, reject decodes below 80%ConfidenceThreshold = 0.8, // Layer 3: false-positive removal, runs a secondary verification passRemoveFalsePositive = true,Speed = ReadingSpeed.Balanced,ExpectMultipleBarcodes = false, // Require 3 agreeing scan lines to reduce phantom reads from noisy imagesMinScanLines = 3};string[] scanFiles = Directory.GetFiles("pos-scans/", "*.png");foreach (string file in scanFiles){ BarcodeResults results = BarcodeReader.Read(file, options); if (results.Count == 0) { // No barcode passed all validation layersConsole.Error.WriteLine($"REJECT {Path.GetFileName(file)}: " + "no valid EAN-13/UPC barcode (checksum, confidence, or format mismatch)"); continue; } BarcodeResult primary = results.First(); // Post-read assertion: verify the decoded format matches expectations. // ExpectBarcodeTypes already constrains the reader; this check documents // intent and surfaces unexpected results during future changes. if (primary.BarcodeType != BarcodeEncoding.EAN13 && primary.BarcodeType != BarcodeEncoding.UPCA && primary.BarcodeType != BarcodeEncoding.UPCE) {Console.Error.WriteLine($"UNEXPECTED FORMAT {Path.GetFileName(file)}: " + $"got {primary.BarcodeType}, expected EAN-13/UPC"); continue; }Console.WriteLine($"OK {Path.GetFileName(file)}: [{primary.BarcodeType}] {primary.Value}");}
using IronBarCode;
// Layered validation for retail POS: EAN-13, UPC-A, and UPC-E only.
// Each property adds a distinct filter to the read pipeline.
var options = new BarcodeReaderOptions
{
// Layer 1: format constraint, accept only retail symbologies
ExpectBarcodeTypes = BarcodeEncoding.EAN13 | BarcodeEncoding.UPCA | BarcodeEncoding.UPCE,
// Layer 2: confidence threshold, reject decodes below 80%
ConfidenceThreshold = 0.8,
// Layer 3: false-positive removal, runs a secondary verification pass
RemoveFalsePositive = true,
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = false,
// Require 3 agreeing scan lines to reduce phantom reads from noisy images
MinScanLines = 3
};
string[] scanFiles = Directory.GetFiles("pos-scans/", "*.png");
foreach (string file in scanFiles)
{
BarcodeResults results = BarcodeReader.Read(file, options);
if (results.Count == 0)
{
// No barcode passed all validation layers
Console.Error.WriteLine($"REJECT {Path.GetFileName(file)}: "
+ "no valid EAN-13/UPC barcode (checksum, confidence, or format mismatch)");
continue;
}
BarcodeResult primary = results.First();
// Post-read assertion: verify the decoded format matches expectations.
// ExpectBarcodeTypes already constrains the reader; this check documents
// intent and surfaces unexpected results during future changes.
if (primary.BarcodeType != BarcodeEncoding.EAN13
&& primary.BarcodeType != BarcodeEncoding.UPCA
&& primary.BarcodeType != BarcodeEncoding.UPCE)
{
Console.Error.WriteLine($"UNEXPECTED FORMAT {Path.GetFileName(file)}: "
+ $"got {primary.BarcodeType}, expected EAN-13/UPC");
continue;
}
Console.WriteLine($"OK {Path.GetFileName(file)}: [{primary.BarcodeType}] {primary.Value}");
}
ImportsIronBarCodeImportsSystem.IO' Layered validation for retail POS: EAN-13, UPC-A, and UPC-E only.' Each property adds a distinct filter to the read pipeline.Dim options As New BarcodeReaderOptionsWith { ' Layer 1: format constraint, accept only retail symbologies .ExpectBarcodeTypes = BarcodeEncoding.EAN13OrBarcodeEncoding.UPCAOrBarcodeEncoding.UPCE, ' Layer 2: confidence threshold, reject decodes below 80% .ConfidenceThreshold = 0.8, ' Layer 3: false-positive removal, runs a secondary verification pass .RemoveFalsePositive = True, .Speed = ReadingSpeed.Balanced, .ExpectMultipleBarcodes = False, ' Require 3 agreeing scan lines to reduce phantom reads from noisy images .MinScanLines = 3}Dim scanFiles AsString() = Directory.GetFiles("pos-scans/", "*.png")For Each file AsStringIn scanFiles Dim results AsBarcodeResults = BarcodeReader.Read(file, options) If results.Count = 0 Then ' No barcode passed all validation layersConsole.Error.WriteLine($"REJECT {Path.GetFileName(file)}: " & "no valid EAN-13/UPC barcode (checksum, confidence, or format mismatch)") Continue For End If Dim primary AsBarcodeResult = results.First() ' Post-read assertion: verify the decoded format matches expectations. ' ExpectBarcodeTypes already constrains the reader; this check documents ' intent and surfaces unexpected results during future changes. If primary.BarcodeType <> BarcodeEncoding.EAN13AndAlso primary.BarcodeType <> BarcodeEncoding.UPCAAndAlso primary.BarcodeType <> BarcodeEncoding.UPCEThenConsole.Error.WriteLine($"UNEXPECTED FORMAT {Path.GetFileName(file)}: " & $"got {primary.BarcodeType}, expected EAN-13/UPC") Continue For End IfConsole.WriteLine($"OK {Path.GetFileName(file)}: [{primary.BarcodeType}] {primary.Value}")Next
Imports IronBarCode
Imports System.IO
' Layered validation for retail POS: EAN-13, UPC-A, and UPC-E only.
' Each property adds a distinct filter to the read pipeline.
Dim options As New BarcodeReaderOptions With {
' Layer 1: format constraint, accept only retail symbologies
.ExpectBarcodeTypes = BarcodeEncoding.EAN13 Or BarcodeEncoding.UPCA Or BarcodeEncoding.UPCE,
' Layer 2: confidence threshold, reject decodes below 80%
.ConfidenceThreshold = 0.8,
' Layer 3: false-positive removal, runs a secondary verification pass
.RemoveFalsePositive = True,
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = False,
' Require 3 agreeing scan lines to reduce phantom reads from noisy images
.MinScanLines = 3
}
Dim scanFiles As String() = Directory.GetFiles("pos-scans/", "*.png")
For Each file As String In scanFiles
Dim results As BarcodeResults = BarcodeReader.Read(file, options)
If results.Count = 0 Then
' No barcode passed all validation layers
Console.Error.WriteLine($"REJECT {Path.GetFileName(file)}: " &
"no valid EAN-13/UPC barcode (checksum, confidence, or format mismatch)")
Continue For
End If
Dim primary As BarcodeResult = results.First()
' Post-read assertion: verify the decoded format matches expectations.
' ExpectBarcodeTypes already constrains the reader; this check documents
' intent and surfaces unexpected results during future changes.
If primary.BarcodeType <> BarcodeEncoding.EAN13 AndAlso
primary.BarcodeType <> BarcodeEncoding.UPCA AndAlso
primary.BarcodeType <> BarcodeEncoding.UPCE Then
Console.Error.WriteLine($"UNEXPECTED FORMAT {Path.GetFileName(file)}: " &
$"got {primary.BarcodeType}, expected EAN-13/UPC")
Continue For
End If
Console.WriteLine($"OK {Path.GetFileName(file)}: [{primary.BarcodeType}] {primary.Value}")
Next
Saída
Caminho para o Sucesso
Todas as três imagens de leitura do PDV foram aprovadas. O leitor retornou valores de 5901234123471, 4006381333931 e 012345678905. Cada um correspondia ao EAN13 |UPCA| O filtro UPCE` tinha um checksum Mod10 válido e um nível de confiança superior a 0,8.
Caminho de Falha
Definir MinScanLines para 3 aumenta o número mínimo de linhas de verificação concordantes necessárias para que um código de barras 1D seja válido; O valor padrão é 2. Aumentar esse valor reduz o risco de leituras fantasmas causadas por linhas de varredura ruidosas, mas pode fazer com que códigos de barras finos ou parcialmente danificados sejam perdidos. Em ambientes de ponto de venda (PDV) com etiquetas impressas de alta qualidade, o valor 3 é uma escolha conservadora que reforça a validação sem afetar a produtividade.
A asserção BarcodeType pós-leitura é uma defesa em profundidade: ExpectBarcodeTypes já faz filtros, mas a verificação explícita documenta a intenção e captura desvios de configuração sem custo de tempo de execução. Para otimização de velocidade, ReadingSpeed.Faster se adequa a etiquetas de máquina impressas limpas; Detailed e ExtremeDetail recuperam códigos de barras danificados ou mal iluminados ao custo de tempos de varredura mais longos.
Quais são os meus próximos passos?
Este artigo abordou o modelo de validação de checksum implícito do IronBarcode, o enum de bandeiras BarcodeEncoding para leituras restritas por formato, e um padrão de validação combinado usando ExpectBarcodeTypes, ConfidenceThreshold, RemoveFalsePositive e MinScanLines como portões de qualidade em camadas.
O que é a validação de checksum de código de barras?
A validação de checksum de código de barras é um processo que garante a precisão dos dados do código de barras verificando o checksum calculado em relação ao valor codificado dentro do código de barras. Isso ajuda na detecção de erros no processo de varredura.
Como o IronBarcode lida com a validação de checksum?
O IronBarcode lida implicitamente com a validação de checksum calculando o checksum para os dados do código de barras e verificando-o em relação ao checksum codificado, garantindo a integridade dos dados durante o processo de varredura.
O que são filtros BarcodeEncoding?
Os filtros BarcodeEncoding no IronBarcode permitem especificar quais formatos de código de barras devem ser lidos ou ignorados durante a varredura, possibilitando um processamento de códigos de barras mais preciso e eficiente ao focar em tipos de códigos de barras específicos.
O IronBarcode pode realizar validação combinada?
Sim, o IronBarcode pode realizar validação combinada verificando tanto o checksum quanto o formato dos códigos de barras durante o processo de varredura, garantindo que apenas códigos de barras válidos e com formatação correta sejam processados.
É possível restringir leituras de códigos de barras por formato em C# com IronBarcode?
Sim, o IronBarcode permite restringir leituras de códigos de barras especificando os formatos que você deseja incluir ou excluir, garantindo que sua aplicação processe apenas os tipos de código de barras relevantes.
Por que a leitura sensível ao formato é importante no processamento de código de barras?
A leitura sensível ao formato é importante porque permite que sua aplicação processe apenas tipos específicos de códigos de barras, melhorando a velocidade e precisão ao ignorar formatos de código de barras irrelevantes ou não suportados.
Como implemento a leitura sensível ao formato no IronBarcode?
Para implementar a leitura sensível ao formato no IronBarcode, use filtros de BarcodeEncoding para especificar os formatos de código de barras que deseja ler. Isso pode ser feito através da API da biblioteca, que permite um controle preciso sobre os requisitos de leitura de código de barras.
Quais são os benefícios de usar o IronBarcode para a validação de códigos de barras?
O IronBarcode oferece vários benefícios para a validação de códigos de barras, incluindo verificação robusta de checksum, leitura sensível ao formato, e a capacidade de lidar com uma ampla gama de padrões de códigos de barras, garantindo alta precisão e flexibilidade no processamento de códigos de barras.
What does the ConfidenceThreshold property do in IronBarcode?
The `ConfidenceThreshold` property in IronBarcode sets a quality gate for decoding, rejecting barcodes where the machine learning detector's confidence falls below a specified percentage.
How can IronBarcode combine checksum validation with format constraints?
IronBarcode combines checksum validation with format constraints using `BarcodeReaderOptions`. By setting properties like `ExpectBarcodeTypes`, `ConfidenceThreshold`, and `RemoveFalsePositive`, it creates a layered validation approach.
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 bem estruturados e visualmente atraentes.