# Comment Valider les Sommes de Contrôle des Codes-Barres et Utiliser la Lecture Sensible au Format en C#
Les sommes de contrôle des codes-barres permettent de détecter les erreurs de substitution. Par exemple, une simple inversion de chiffres dans une étiquette EAN-13 peut envoyer un colis au mauvais entrepôt. La lecture prenant en compte le format offre une couche de validation supplémentaire en limitant le décodeur aux symbologies attendues. Cette approche réduit les faux positifs dus au bruit de fond et raccourcit le temps d'analyse en ignorant les détecteurs de format inutiles.
IronBarcode effectue automatiquement une vérification de somme de contrôle lors du décodage. L'algorithme de contrôle de chaque symbologie s'exécute par défaut, et les codes-barres qui échouent sont écartés avant que les résultats ne soient renvoyés. La propriété `BarcodeReaderOptions.ExpectBarcodeTypes` limite les lectures à des formats spécifiques, tandis que `RemoveFalsePositive` ajoute un scan secondaire pour les lectures ambiguës.
Ce guide explique comment valider les sommes de contrôle des codes-barres, contraindre les lectures aux formats attendus, et combiner ces deux techniques en une porte de qualité en couches utilisant `BarcodeReaderOptions`.
*as-heading:2(Guide rapide : Valider les Codes-Barres avec Contraintes de Sommes de Contrôle et de Format)*
Configurez `BarcodeReaderOptions` avec `ExpectBarcodeTypes` et `RemoveFalsePositive` pour contraindre les lectures aux symbologies attendues avec vérification automatique de la somme de contrôle.
```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>Flux de travail minimal (5 étapes)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/BarCode/">Téléchargez la bibliothèque IronBarcode depuis NuGet</a></li>
<li>Créez une instance <code>BarcodeReaderOptions</code></li>
<li>Définissez <code>ExpectBarcodeTypes</code> aux symbologies présentes dans le pipeline</li>
<li>Activez <code>RemoveFalsePositive</code> pour une vérification secondaire</li>
<li>Appelez <code>BarcodeReader.Read</code> pour décoder ; les sommes de contrôle sont validées automatiquement lors du décodage.</li>
</ol>
</div>
## Comment Valider les Sommes de Contrôle des Codes-Barres ?
IronBarcode valide les sommes de contrôle lors du décodage conformément aux spécifications de chaque symbologie. Par exemple, lors de la lecture d'un code-barres EAN-13, le chiffre de contrôle Mod10 est calculé à partir des 12 premiers chiffres et comparé au 13e. Si les chiffres ne correspondent pas, le code-barres est silencieusement rejeté et n'apparaît pas dans la collection `BarcodeResults`. Cette approche s'applique à tous les formats comportant un chiffre de contrôle obligatoire, notamment UPC-A, UPC-E, EAN-8, Code128, ITF et autres.
Ce modèle implicite diffère des bibliothèques qui exposent un basculement explicite. Le tableau ci-dessous compare les deux approches :
<div class="content__data-table" data-content-table>
<table>
<caption>Comparaison des modèles de validation de somme de contrôle : IronBarcode vs. Aspose.BarCode</caption>
<thead>
<tr><th>Aspect</th><th>IronBarcode</th><th>Aspose.BarCode</th></tr>
</thead>
<tbody>
<tr><td>Déclencheur de validation</td><td>Automatique ; s'exécute à chaque décodage</td><td>Explicite : <code>ChecksumValidation.On</code> / <code>Off</code> / <code>Default</code></td></tr>
<tr><td>Action du développeur requise</td><td>Aucun ; les codes-barres invalides sont exclus des résultats.</td><td>Configurez <code>BarcodeSettings.ChecksumValidation</code> avant la lecture</td></tr>
<tr><td>Désactivation de la somme de contrôle</td><td>Non exposé ; les sommes de contrôle sont toujours appliquées aux formats obligatoires</td><td>Oui ; <code>ChecksumValidation.Off</code> ignore la vérification</td></tr>
<tr><td>Formats avec somme de contrôle optionnelle (Code39)</td><td>Utilise <code>Confidence</code> + <code>RemoveFalsePositive</code> pour filtrer les lectures de faible qualité.</td><td>Activez explicitement cette fonction avec <code>EnableChecksum.Yes</code></td></tr>
<tr><td>Comportement en cas d'échec</td><td>Le code-barres est silencieusement omis des résultats</td><td>Le code-barres peut comporter une valeur de contrôle distincte pour une inspection manuelle.</td></tr>
</tbody>
</table>
</div>
Pour les symbologies avec des sommes de contrôle optionnelles, telles que Code39, la bibliothèque utilise des scores de confiance et `RemoveFalsePositive` au lieu d'un commutateur de somme de contrôle.
### Entrée
Une étiquette de rayonnage d'entrepôt Code128 (chemin de réussite) et une image vierge sans code-barres (chemin d'échec).
<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="Code-barres Code128 encodant RACK-A1-LOT-7382 utilisé comme entrée pour le scan d'un rayonnage d'entrepôt"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (chemin de réussite)</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="Image blanche vierge sans code-barres pour déclencher le traitement du résultat vide"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">blank-no-barcode.png (chemin d'échec - aucun code-barres présent)</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");
}
```
### Sortie
#### Chemin vers le succès
<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="Sortie console affichant le code 128 RACK-A1-LOT-7382 décodé au-dessus du seuil de confiance"
class="img-responsive add-shadow" />
</div>
</div>
Le code-barres de l'étagère du dépôt est revenu en tant que `RACK-A1-LOT-7382` sur la page 0. Il a passé le seuil de confiance de 85 % et validé la somme de contrôle, il apparaît donc dans `BarcodeResults`.
#### Chemin de défaillance
<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="Sortie de la console affichant l'avertissement : aucun code-barres valide n'a été trouvé pour l'image vierge saisie."
class="img-responsive add-shadow" />
</div>
</div>
Augmenter `ConfidenceThreshold` au-dessus de son défaut de 0,7 resserre cette porte davantage pour les symbologies à somme de contrôle optionnelle telles que Code39.
Une fois la validation de la somme de contrôle effectuée, l'étape suivante consiste à limiter le lecteur aux formats de codes-barres attendus par votre pipeline.
---
## Comment Utiliser la Lecture de Codes-Barres Sensible au Format ?
L'énumération `BarcodeEncoding` est de type drapeaux, permettant de combiner plusieurs formats en utilisant l'opérateur OU bit à bit. Définir `ExpectBarcodeTypes` limite le lecteur à ces formats et saute la détection pour les autres.
<div class="content__data-table" data-content-table>
<table>
<caption>Valeurs Communes de BarcodeEncoding</caption>
<thead>
<tr><th>Valeur</th><th>Catégorie</th><th>Description du projet</th><th>Somme de contrôle</th></tr>
</thead>
<tbody>
<tr><td><code>BarcodeEncoding.All</code></td><td>Méta</td><td>Tous les formats pris en charge (comportement par défaut)</td><td>Par format</td></tr>
<tr><td><code>BarcodeEncoding.AllOneDimensional</code></td><td>Méta</td><td>Tous les formats linéaires (1D) y compris empilés</td><td>Par format</td></tr>
<tr><td><code>BarcodeEncoding.AllTwoDimensional</code></td><td>Méta</td><td>Tous les formats matriciels/grilles (2D)</td><td>Par format</td></tr>
<tr><td><code>BarcodeEncoding.Code128</code></td><td>1D</td><td>Alphanumérique haute densité (logistique, expédition)</td><td>Obligatoire (pondéré Mod103)</td></tr>
<tr><td><code>BarcodeEncoding.EAN13</code></td><td>1D</td><td>Identification du produit de détail, 13 chiffres</td><td>Obligatoire (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.QRCode</code></td><td>2D</td><td>Matrice haute capacité (URL, données structurées)</td><td>ECC Reed-Solomon</td></tr>
<tr><td><code>BarcodeEncoding.Code39</code></td><td>1D</td><td>Alphanumérique (défense, automobile)</td><td>Optionnelle (Mod43)</td></tr>
<tr><td><code>BarcodeEncoding.UPCA</code></td><td>1D</td><td>Commerce de détail nord-américain, 12 chiffres</td><td>Obligatoire (Mod10)</td></tr>
<tr><td><code>BarcodeEncoding.DataMatrix</code></td><td>2D</td><td>Matrice compacte (électronique, pharmaceutique)</td><td>ECC Reed-Solomon</td></tr>
<tr><td><code>BarcodeEncoding.PDF417</code></td><td>2D</td><td>Empilés (cartes d'identité, transport)</td><td>ECC Reed-Solomon</td></tr>
</tbody>
</table>
</div>
Au-delà de la vitesse, la limitation du format défini agit comme un mécanisme de validation : les codes-barres de toute symbologie non répertoriée sont exclus des résultats, même s'ils sont physiquement présents dans l'image.
### Entrée
Une étiquette d'expédition Code128 (chemin de réussite) et un code QR qui ne correspond pas à la contrainte Code128 uniquement (chemin d'échec).
<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="Code-barres Code128 encodant SHIP-2024-00438 utilisé comme entrée pour l'étiquette d'expédition"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">shipping-label.png (chemin de réussite - Code128 correspond à la contrainte)</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 utilisé comme scénario d'échec pour non-correspondance de format lors de la lecture contrainte au seul Code128"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">qr-format-mismatch.png (chemin d'échec - QR rejeté par le filtre Code128 uniquement)</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}");
}
```
### Sortie
#### Chemin vers le succès
<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="Sortie de la console affichant la lecture contrainte trouvant 1 code-barres Code128 et la lecture large confirmant cela"
class="img-responsive add-shadow" />
</div>
</div>
L'étiquette d'expédition a une valeur de `SHIP-2024-00438`. La lecture restreinte le détecte immédiatement puisque le filtre attend le code 128, et la lecture large confirme le même résultat pour tous les formats.
#### Chemin de défaillance
<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="Sortie de la console indiquant que la lecture contrainte ne renvoie aucun résultat pour une image de code QR"
class="img-responsive add-shadow" />
</div>
</div>
Les résultats vides d'une lecture contrainte constituent un signal de validation, et non une erreur ; Consignez l'écart pour examen.
Pour les pipelines qui mélangent les types de codes-barres (par exemple, un bordereau d'expédition avec à la fois un code produit EAN-13 et un numéro de suivi Code128), combinez les formats attendus :
```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
};
```
Chaque `BarcodeResult.BarcodeType` retourné identifie quel format a été décodé, permettant un routage en aval.
### Quelles Symbologies Supportent la Validation de Somme de Contrôle ?
Tous les formats de codes-barres n'utilisent pas les sommes de contrôle de la même manière. Le tableau suivant associe les symbologies courantes à leurs caractéristiques de détection d'erreur, ce qui informe de la manière de configurer `ConfidenceThreshold` et `RemoveFalsePositive` pour chaque format :
<div class="content__data-table" data-content-table>
<table>
<caption>Caractéristiques des Sommes de Contrôle par Symbologie</caption>
<thead>
<tr><th>Symbologie</th><th>Type de Somme de Contrôle</th><th>Obligatoire ?</th><th>Recommandation</th></tr>
</thead>
<tbody>
<tr><td>EAN-13 / EAN-8</td><td>Mod10</td><td>Oui</td><td>Paramètres par défaut suffisants ; somme de contrôle toujours appliquée</td></tr>
<tr><td>UPC-A / UPC-E</td><td>Mod10</td><td>Oui</td><td>Paramètres par défaut suffisants ; le chiffre de contrôle est corrigé automatiquement à l'écriture</td></tr>
<tr><td>Code128</td><td>Mod103 pondéré</td><td>Oui</td><td>Les paramètres par défaut sont suffisants ; obligatoires selon les spécifications</td></tr>
<tr><td>Code39</td><td>Mod43</td><td>Optionnelle</td><td>Élevez <code>ConfidenceThreshold</code> à 0.8+ et activez <code>RemoveFalsePositive</code></td></tr>
<tr><td>Codabar</td><td>Mod16</td><td>Optionnelle</td><td>Identique à Code39 ; utiliser le niveau de confiance comme critère de qualité.</td></tr>
<tr><td>ITF</td><td>Mod10</td><td>Optionnelle</td><td>Activez <code>RemoveFalsePositive</code> pour les formats entrelacés</td></tr>
<tr><td>Code QR / Matrice de données</td><td>ECC Reed-Solomon</td><td>Toujours</td><td>Correction des erreurs structurelles ; aucune configuration supplémentaire requise</td></tr>
<tr><td>PDF417</td><td>ECC Reed-Solomon</td><td>Toujours</td><td>Identique aux QR/DataMatrix ; la correction d'erreurs est intégrée.</td></tr>
</tbody>
</table>
</div>
Pour les symbologies 2D telles que QR, DataMatrix et PDF417, la correction d'erreurs est intégrée à la structure d'encodage. Ces formats peuvent se remettre de dommages partiels sans dépendre d'un simple chiffre de contrôle. L'`ConfidenceThreshold` s'applique toujours pendant la phase de détection ML, tandis que l'étape de décodage bénéficie de la redondance intégrée de la symbologie.
Maintenant que nous comprenons ces deux techniques, combinons-les en un seul modèle de validation prêt pour la production.
---
## Comment Combiner les Sommes de Contrôle avec les Contraintes de Format ?
Le modèle prêt pour la production définit `ExpectBarcodeTypes`, `RemoveFalsePositive`, `ConfidenceThreshold` et `Speed` dans un seul objet `BarcodeReaderOptions`. Ensemble, ils forment une barrière à plusieurs niveaux : les contraintes de format restreignent l'espace de recherche, la validation de la somme de contrôle garantit l'intégrité des données, le seuillage de confiance filtre les décodages marginaux et la suppression des faux positifs ajoute une seconde étape de vérification.
### Entrée
Trois codes-barres de scan POS du répertoire `pos-scans/` utilisés comme chemin de succès : deux EAN-13 et un UPC-A. Une étiquette de rack de dépôt Code128 est utilisée comme chemin d'échec - la contrainte EAN-13/UPC-A la rejette et enregistre une ligne `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 (succès)</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 (succès)</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 (succès)</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="Code-barres Code128 encodant RACK-A1-LOT-7382 utilisé comme entrée pour le traitement d'échec de la validation combinée"
class="img-responsive add-shadow" />
<p style="color: #181818; font-style: italic; text-align: center;">warehouse-rack.png (échec - Code 128 rejeté)</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}");
}
```
### Sortie
#### Chemin vers le succès
<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="Affichage de la console indiquant que les 3 codes-barres scannés par le terminal de point de vente ont été acceptés avec le statut OK et les valeurs décodées"
class="img-responsive add-shadow" />
</div>
</div>
Les trois images de numérisation des points de vente ont été validées. Le lecteur a renvoyé les valeurs de `5901234123471`, `4006381333931` et `012345678905`. Chacun correspondait au code EAN13 |UPCA| Le filtre UPCE` avait une somme de contrôle Mod10 valide et la confiance était supérieure à 0,8.
#### Chemin de défaillance
<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="Sortie de la console indiquant que le code-barres Code128 de l'entrepôt a été rejeté par le filtre EAN-13/UPC-A"
class="img-responsive add-shadow" />
</div>
</div>
Configurer `MinScanLines` sur 3 augmente le nombre minimum de lignes de scan concordantes requises pour qu'un code-barres 1D soit valide ; La valeur par défaut est 2. Augmenter cette valeur réduit le risque de lectures fantômes dues à des lignes de balayage bruyantes, mais peut entraîner la non-détection de codes-barres fins ou partiellement endommagés. Dans les environnements de points de vente au détail avec des étiquettes imprimées nettes, une valeur de 3 est un choix prudent qui renforce la validation sans affecter le débit.
L'assertion post-lecture `BarcodeType` est une défense en profondeur : `ExpectBarcodeTypes` filtre déjà, mais la vérification explicite documente l'intention et capture la dérive de configuration sans coût d'exécution. Pour l'accordage de la vitesse, `ReadingSpeed.Faster` convient aux étiquettes imprimées en machine propres ; `Detailed` et `ExtremeDetail` récupèrent les codes-barres endommagés ou mal éclairés au prix de temps de scan plus longs.
---
## Quelles Sont Mes Prochaines Étapes ?
Cet article a couvert le modèle de validation de somme de contrôle implicite de IronBarcode, l'énumération de drapeaux `BarcodeEncoding` pour les lectures contraintes par format, et un modèle de validation combiné utilisant `ExpectBarcodeTypes`, `ConfidenceThreshold`, `RemoveFalsePositive` et `MinScanLines` comme portes de qualité en couches.
Pour des lectures supplémentaires, explorez ces ressources :
- [Tutoriels IronBarcode - Lecture de Codes-Barres](https://ironsoftware.com/csharp/barcode/tutorials/reading-barcodes/) pour des parcours de lecture de bout en bout.
- [Prévention des faux positifs](https://ironsoftware.com/csharp/barcode/troubleshooting/false-positives/) pour le mécanisme `RemoveFalsePositive` en détail.
- [Exemples de Seuil de Confiance](https://ironsoftware.com/csharp/barcode/examples/confidence-threshold/) pour l'ajustement de détection basé sur ML.
- [Formats de données de sortie](https://ironsoftware.com/csharp/barcode/how-to/output-data-formats/) pour la référence de la propriété `BarcodeResult`.
- [Comment Corriger les Images](https://ironsoftware.com/csharp/barcode/how-to/image-correction/) pour les filtres qui améliorent l'exactitude du décodage.
- [Référence API de BarcodeReaderOptions](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeReaderOptions.html) pour la documentation complète de configuration.
- [Référence API de BarcodeEncoding](https://ironsoftware.com/csharp/barcode/object-reference/api/IronBarCode.BarcodeEncoding.html) pour la liste complète des symbologies prises en charge.
[Obtenez une licence d'essai gratuite](https://ironsoftware.com/csharp/barcode/#trial-license) pour tester chaque fonctionnalité dans un environnement en direct, ou [consultez les options de licence](https://ironsoftware.com/csharp/barcode/licensing/) lorsque le pipeline est prêt pour la production.
Les sommes de contrôle des codes-barres permettent de détecter les erreurs de substitution. Par exemple, une simple inversion de chiffres dans une étiquette EAN-13 peut envoyer un colis au mauvais entrepôt. La lecture prenant en compte le format offre une couche de validation supplémentaire en limitant le décodeur aux symbologies attendues. Cette approche réduit les faux positifs dus au bruit de fond et raccourcit le temps d'analyse en ignorant les détecteurs de format inutiles.
IronBarcode effectue automatiquement une vérification de somme de contrôle lors du décodage. L'algorithme de contrôle de chaque symbologie s'exécute par défaut, et les codes-barres qui échouent sont écartés avant que les résultats ne soient renvoyés. La propriété BarcodeReaderOptions.ExpectBarcodeTypes limite les lectures à des formats spécifiques, tandis que RemoveFalsePositive ajoute un scan secondaire pour les lectures ambiguës.
Ce guide explique comment valider les sommes de contrôle des codes-barres, contraindre les lectures aux formats attendus, et combiner ces deux techniques en une porte de qualité en couches utilisant BarcodeReaderOptions.
Guide rapide : Valider les Codes-Barres avec Contraintes de Sommes de Contrôle et de Format
Configurez BarcodeReaderOptions avec ExpectBarcodeTypes et RemoveFalsePositive pour contraindre les lectures aux symbologies attendues avec vérification automatique de la somme de contrôle.
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)
Définissez ExpectBarcodeTypes aux symbologies présentes dans le pipeline
Activez RemoveFalsePositive pour une vérification secondaire
Appelez BarcodeReader.Read pour décoder ; les sommes de contrôle sont validées automatiquement lors du décodage.
Comment Valider les Sommes de Contrôle des Codes-Barres ?
IronBarcode valide les sommes de contrôle lors du décodage conformément aux spécifications de chaque symbologie. Par exemple, lors de la lecture d'un code-barres EAN-13, le chiffre de contrôle Mod10 est calculé à partir des 12 premiers chiffres et comparé au 13e. Si les chiffres ne correspondent pas, le code-barres est silencieusement rejeté et n'apparaît pas dans la collection BarcodeResults. Cette approche s'applique à tous les formats comportant un chiffre de contrôle obligatoire, notamment UPC-A, UPC-E, EAN-8, Code128, ITF et autres.
Ce modèle implicite diffère des bibliothèques qui exposent un basculement explicite. Le tableau ci-dessous compare les deux approches :
Comparaison des modèles de validation de somme de contrôle : IronBarcode vs. Aspose.BarCode
Aspect
IronBarcode
Aspose.BarCode
Déclencheur de validation
Automatique ; s'exécute à chaque décodage
Explicite : ChecksumValidation.On / Off / Default
Action du développeur requise
Aucun ; les codes-barres invalides sont exclus des résultats.
Configurez BarcodeSettings.ChecksumValidation avant la lecture
Désactivation de la somme de contrôle
Non exposé ; les sommes de contrôle sont toujours appliquées aux formats obligatoires
Oui ; ChecksumValidation.Off ignore la vérification
Formats avec somme de contrôle optionnelle (Code39)
Utilise Confidence + RemoveFalsePositive pour filtrer les lectures de faible qualité.
Activez explicitement cette fonction avec EnableChecksum.Yes
Comportement en cas d'échec
Le code-barres est silencieusement omis des résultats
Le code-barres peut comporter une valeur de contrôle distincte pour une inspection manuelle.
Pour les symbologies avec des sommes de contrôle optionnelles, telles que Code39, la bibliothèque utilise des scores de confiance et RemoveFalsePositive au lieu d'un commutateur de somme de contrôle.
Entrée
Une étiquette de rayonnage d'entrepôt Code128 (chemin de réussite) et une image vierge sans code-barres (chemin d'échec).
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
Sortie
Chemin vers le succès
Le code-barres de l'étagère du dépôt est revenu en tant que RACK-A1-LOT-7382 sur la page 0. Il a passé le seuil de confiance de 85 % et validé la somme de contrôle, il apparaît donc dans BarcodeResults.
Chemin de défaillance
Augmenter ConfidenceThreshold au-dessus de son défaut de 0,7 resserre cette porte davantage pour les symbologies à somme de contrôle optionnelle telles que Code39.
Une fois la validation de la somme de contrôle effectuée, l'étape suivante consiste à limiter le lecteur aux formats de codes-barres attendus par votre pipeline.
Comment Utiliser la Lecture de Codes-Barres Sensible au Format ?
L'énumération BarcodeEncoding est de type drapeaux, permettant de combiner plusieurs formats en utilisant l'opérateur OU bit à bit. Définir ExpectBarcodeTypes limite le lecteur à ces formats et saute la détection pour les autres.
Valeurs Communes de BarcodeEncoding
Valeur
Catégorie
Description du projet
Somme de contrôle
BarcodeEncoding.All
Méta
Tous les formats pris en charge (comportement par défaut)
Au-delà de la vitesse, la limitation du format défini agit comme un mécanisme de validation : les codes-barres de toute symbologie non répertoriée sont exclus des résultats, même s'ils sont physiquement présents dans l'image.
Entrée
Une étiquette d'expédition Code128 (chemin de réussite) et un code QR qui ne correspond pas à la contrainte Code128 uniquement (chemin d'échec).
shipping-label.png (chemin de réussite - Code128 correspond à la contrainte)
qr-format-mismatch.png (chemin d'échec - QR rejeté par le filtre Code128 uniquement)
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
Sortie
Chemin vers le succès
L'étiquette d'expédition a une valeur de SHIP-2024-00438. La lecture restreinte le détecte immédiatement puisque le filtre attend le code 128, et la lecture large confirme le même résultat pour tous les formats.
Chemin de défaillance
Les résultats vides d'une lecture contrainte constituent un signal de validation, et non une erreur ; Consignez l'écart pour examen.
Pour les pipelines qui mélangent les types de codes-barres (par exemple, un bordereau d'expédition avec à la fois un code produit EAN-13 et un numéro de suivi Code128), combinez les formats attendus :
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
}
Chaque BarcodeResult.BarcodeType retourné identifie quel format a été décodé, permettant un routage en aval.
Quelles Symbologies Supportent la Validation de Somme de Contrôle ?
Tous les formats de codes-barres n'utilisent pas les sommes de contrôle de la même manière. Le tableau suivant associe les symbologies courantes à leurs caractéristiques de détection d'erreur, ce qui informe de la manière de configurer ConfidenceThreshold et RemoveFalsePositive pour chaque format :
Caractéristiques des Sommes de Contrôle par Symbologie
Symbologie
Type de Somme de Contrôle
Obligatoire ?
Recommandation
EAN-13 / EAN-8
Mod10
Oui
Paramètres par défaut suffisants ; somme de contrôle toujours appliquée
UPC-A / UPC-E
Mod10
Oui
Paramètres par défaut suffisants ; le chiffre de contrôle est corrigé automatiquement à l'écriture
Code128
Mod103 pondéré
Oui
Les paramètres par défaut sont suffisants ; obligatoires selon les spécifications
Code39
Mod43
Optionnelle
Élevez ConfidenceThreshold à 0.8+ et activez RemoveFalsePositive
Codabar
Mod16
Optionnelle
Identique à Code39 ; utiliser le niveau de confiance comme critère de qualité.
ITF
Mod10
Optionnelle
Activez RemoveFalsePositive pour les formats entrelacés
Code QR / Matrice de données
ECC Reed-Solomon
Toujours
Correction des erreurs structurelles ; aucune configuration supplémentaire requise
PDF417
ECC Reed-Solomon
Toujours
Identique aux QR/DataMatrix ; la correction d'erreurs est intégrée.
Pour les symbologies 2D telles que QR, DataMatrix et PDF417, la correction d'erreurs est intégrée à la structure d'encodage. Ces formats peuvent se remettre de dommages partiels sans dépendre d'un simple chiffre de contrôle. L'ConfidenceThreshold s'applique toujours pendant la phase de détection ML, tandis que l'étape de décodage bénéficie de la redondance intégrée de la symbologie.
Maintenant que nous comprenons ces deux techniques, combinons-les en un seul modèle de validation prêt pour la production.
Comment Combiner les Sommes de Contrôle avec les Contraintes de Format ?
Le modèle prêt pour la production définit ExpectBarcodeTypes, RemoveFalsePositive, ConfidenceThreshold et Speed dans un seul objet BarcodeReaderOptions. Ensemble, ils forment une barrière à plusieurs niveaux : les contraintes de format restreignent l'espace de recherche, la validation de la somme de contrôle garantit l'intégrité des données, le seuillage de confiance filtre les décodages marginaux et la suppression des faux positifs ajoute une seconde étape de vérification.
Entrée
Trois codes-barres de scan POS du répertoire pos-scans/ utilisés comme chemin de succès : deux EAN-13 et un UPC-A. Une étiquette de rack de dépôt Code128 est utilisée comme chemin d'échec - la contrainte EAN-13/UPC-A la rejette et enregistre une ligne REJECT.
pos-scan-1.png (succès)
pos-scan-2.png (succès)
pos-scan-3.png (succès)
warehouse-rack.png (échec - Code 128 rejeté)
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
Sortie
Chemin vers le succès
Les trois images de numérisation des points de vente ont été validées. Le lecteur a renvoyé les valeurs de 5901234123471, 4006381333931 et 012345678905. Chacun correspondait au code EAN13 |UPCA| Le filtre UPCE` avait une somme de contrôle Mod10 valide et la confiance était supérieure à 0,8.
Chemin de défaillance
Configurer MinScanLines sur 3 augmente le nombre minimum de lignes de scan concordantes requises pour qu'un code-barres 1D soit valide ; La valeur par défaut est 2. Augmenter cette valeur réduit le risque de lectures fantômes dues à des lignes de balayage bruyantes, mais peut entraîner la non-détection de codes-barres fins ou partiellement endommagés. Dans les environnements de points de vente au détail avec des étiquettes imprimées nettes, une valeur de 3 est un choix prudent qui renforce la validation sans affecter le débit.
L'assertion post-lecture BarcodeType est une défense en profondeur : ExpectBarcodeTypes filtre déjà, mais la vérification explicite documente l'intention et capture la dérive de configuration sans coût d'exécution. Pour l'accordage de la vitesse, ReadingSpeed.Faster convient aux étiquettes imprimées en machine propres ; Detailed et ExtremeDetail récupèrent les codes-barres endommagés ou mal éclairés au prix de temps de scan plus longs.
Quelles Sont Mes Prochaines Étapes ?
Cet article a couvert le modèle de validation de somme de contrôle implicite de IronBarcode, l'énumération de drapeaux BarcodeEncoding pour les lectures contraintes par format, et un modèle de validation combiné utilisant ExpectBarcodeTypes, ConfidenceThreshold, RemoveFalsePositive et MinScanLines comme portes de qualité en couches.
Pour des lectures supplémentaires, explorez ces ressources :
Qu'est-ce que la validation de la somme de contrôle des codes-barres ?
La validation de la somme de contrôle des codes-barres est un processus qui garantit l'exactitude des données de code-barres en vérifiant la somme de contrôle calculée par rapport à la valeur encodée dans le code-barres. Cela aide à détecter les erreurs dans le processus de lecture.
Comment IronBarcode gère-t-il la validation des sommes de contrôle ?
IronBarcode gère implicitement la validation des sommes de contrôle en calculant la somme de contrôle pour les données de code-barres et en la vérifiant par rapport à la somme de contrôle encodée, assurant ainsi l'intégrité des données pendant le processus de lecture.
Qu'est-ce que les filtres BarcodeEncoding ?
Les filtres BarcodeEncoding dans IronBarcode vous permettent de spécifier quels formats de codes-barres lire ou ignorer lors de la lecture, permettant un traitement des codes-barres plus précis et efficace en se concentrant sur des types spécifiques de codes-barres.
IronBarcode peut-il effectuer une validation combinée ?
Oui, IronBarcode peut effectuer une validation combinée en vérifiant à la fois la somme de contrôle et le format des codes-barres pendant le processus de lecture, garantissant que seuls les codes-barres valides et correctement formatés sont traités.
Est-il possible de limiter les lectures de codes-barres par format en C# avec IronBarcode ?
Oui, IronBarcode vous permet de limiter les lectures de codes-barres en spécifiant les formats que vous souhaitez inclure ou exclure, garantissant que votre application ne traite que les types de codes-barres pertinents.
Pourquoi la lecture consciente du format est-elle importante dans le traitement des codes-barres ?
La lecture consciente du format est importante car elle permet à votre application de traiter uniquement des types spécifiques de codes-barres, améliorant ainsi la vitesse et la précision en ignorant les formats de codes-barres non pertinents ou non pris en charge.
Comment puis-je implémenter la lecture consciente du format dans IronBarcode ?
Pour implémenter la lecture consciente du format dans IronBarcode, utilisez des filtres BarcodeEncoding pour spécifier les formats de codes-barres que vous souhaitez lire. Cela peut être fait à travers l'API de la bibliothèque, qui permet un contrôle précis des exigences de lecture de codes-barres.
Quels sont les avantages d'utiliser IronBarcode pour la validation des codes-barres ?
IronBarcode offre plusieurs avantages pour la validation des codes-barres, y compris une vérification robuste des sommes de contrôle, une lecture consciente du format, et la capacité de gérer une large gamme de normes de codes-barres, garantissant une haute précision et flexibilité dans le traitement des codes-barres.
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 détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes et créer des manuels bien structurés et visuellement attrayants.