Scanner de codes-barres ASP.NET : Téléchargement de fichiers et API REST avec IronBarcode
La lecture des codes-barres dans ASP.NET devient simple avec IronBarcode: installez-le via NuGet, appelez BarcodeReader.Read() et obtenez en une seule étape les valeurs décodées avec les données de type, de confiance et de position — aucune configuration complexe n'est requise.
La lecture des codes-barres est une exigence standard des applications web modernes, permettant la gestion des stocks, le traitement des documents et les flux de travail de validation des billets. Selon GS1 , les codes-barres sont utilisés dans plus de 6 milliards de transactions quotidiennes dans le monde entier – un chiffre qui souligne à quel point une lecture précise des codes-barres est essentielle pour tout système d'entreprise. La norme ISO/IEC 15415 définit des indicateurs de qualité pour les symboles de codes-barres 2D, tandis que la norme ISO/IEC 15416 couvre les codes-barres linéaires 1D, les deux étant prises en charge nativement par IronBarcode .
Ce guide vous montre comment ajouter une fonctionnalité de lecture de codes-barres fiable à votre application ASP.NET Core à l'aide d' IronBarcode, en abordant l'installation, le traitement des téléchargements de fichiers, l'intégration de l'API REST et les modèles de déploiement en production. À la fin, vous disposerez d'un code fonctionnel pour un scanner de téléchargement de fichiers de page Razor et un point de terminaison d'API JSON qui accepte les images encodées en base64 de n'importe quel client.
Comment installer IronBarcode dans un projet ASP.NET ?
La mise en route ne prend que quelques minutes. La bibliothèque prend en charge les applications ASP.NET Core et ASP.NET MVC classiques, ce qui la rend adaptable à différents types de projets. Les déploiements en Enterprise fonctionnent aussi bien sur Azure , AWS Lambda et les conteneurs Docker . La détection basée sur l'apprentissage automatique de la bibliothèque gère les images de codes-barres complexes en appliquant automatiquement une correction d'image sophistiquée, ce qui est particulièrement utile lors du traitement de photos prises avec des appareils photo mobiles dans des conditions d'éclairage variables.
Installation via le gestionnaire de packages NuGet
Ouvrez la console du Package Manager dans Visual Studio et exécutez :
Install-Package BarCode
Install-Package BarCode
Vous pouvez également utiliser l'interface de ligne de commande .NET :
dotnet add package BarCode
dotnet add package BarCode
Vous pouvez également rechercher " BarCode " dans l'interface utilisateur du gestionnaire de packages NuGet de Visual Studio et cliquer sur Installer. Le package gère automatiquement toutes les dépendances.
Pour les déploiements spécifiques à une plateforme, envisagez d'utiliser des packages NuGet spécifiques à la plateforme et optimisés pour votre environnement cible. La bibliothèque propose des packages standard et BarCode.Slim pour s'adapter à différents scénarios de déploiement. Pour obtenir la procédure d'installation complète, consultez le guide d'installation IronBarcode .
Configuration de votre projet
Une fois installé, ajoutez l'instruction using nécessaire à vos fichiers C# :
using IronBarCode;
using IronBarCode;
Imports IronBarCode
Cette importation vous donne accès aux fonctionnalités complètes de lecture et de génération de codes-barres d'IronBarcode. La bibliothèque prend en charge plus de 30 formats de codes-barres, notamment QR Code, Code 128, Code 39, Data Matrix et PDF417. Consultez la liste complète des formats de codes-barres pris en charge pour vérifier la compatibilité avec votre cas d'utilisation.
Pour résoudre les problèmes d'installation, consultez le guide de dépannage des packages NuGet ou soumettez une demande d'assistance technique spécialisée.
Choisir le bon modèle architectural
Lors de la mise en œuvre de la lecture de codes-barres dans ASP.NET, vous avez deux approches architecturales principales. Comprendre ces modèles vous aide à choisir les paramètres de lecteur de codes-barres adaptés à chaque cas d'utilisation :
// Server-side processing -- recommended for most ASP.NET scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.85
};
var results = BarcodeReader.Read(stream, options);
foreach (var barcode in results)
{
Console.WriteLine($"Type: {barcode.BarcodeType}, Value: {barcode.Text}");
}
// Server-side processing -- recommended for most ASP.NET scenarios
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.85
};
var results = BarcodeReader.Read(stream, options);
foreach (var barcode in results)
{
Console.WriteLine($"Type: {barcode.BarcodeType}, Value: {barcode.Text}");
}
Imports System
' Server-side processing -- recommended for most ASP.NET scenarios
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.UseConfidenceThreshold = True,
.ConfidenceThreshold = 0.85
}
Dim results = BarcodeReader.Read(stream, options)
For Each barcode In results
Console.WriteLine($"Type: {barcode.BarcodeType}, Value: {barcode.Text}")
Next
L'approche côté serveur vous offre un contrôle maximal sur le traitement des images et fonctionne de manière cohérente sur tous les navigateurs. Lorsque le serveur traite chaque image, vous obtenez également une piste d'audit complète : chaque code-barres scanné passe par votre couche applicative où vous pouvez l'enregistrer, le valider par rapport à une base de données ou déclencher des flux de travail en aval. Ce modèle est particulièrement adapté aux secteurs réglementés comme la santé, la logistique et la fabrication, où chaque scan doit être enregistré.
Pour l'intégration de la capture vidéo côté client, les navigateurs modernes prennent en charge l'API MediaDevices d'accès à la caméra, qui peut être combinée avec le traitement côté serveur d'IronBarcode via une API REST – décrite en détail plus loin dans ce guide. Le choix du traitement côté serveur simplifie également votre modèle de sécurité : aucune logique de traitement sensible n'est exposée au navigateur et toute la validation s'effectue en dehors de votre application.
| Aspect | Capture côté client + traitement côté serveur | Traitement côté serveur pur |
|---|---|---|
| Meilleur pour | Numérisation en temps réel avec caméra | Traitement par lots, chargement de fichiers |
| Prise en charge du navigateur | Navigateurs modernes uniquement | Tous les navigateurs |
| expérience utilisateur | Réponse instantanée | Flux de téléchargement standard |
| Modèle de sécurité | Plus complexe (CORS, authentification) | Direct |
| Utilisation de la bande passante | Inférieur (prétraité sur l'appareil) | Supérieur (téléchargement d'image brute) |
Comment mettre en œuvre la lecture des codes-barres pour le téléchargement de fichiers ?
Le scan de fichiers téléchargés est le scénario de code-barres le plus courant dans les applications web ASP.NET . Ce modèle convient au traitement des factures, des étiquettes d'expédition ou de tout document comportant des codes-barres intégrés. Pour améliorer le débit, envisagez la mise en œuvre d'une lecture asynchrone des codes-barres afin de gérer plusieurs téléchargements simultanément.
Création du formulaire de téléchargement
Créez un formulaire HTML réactif dans votre vue ASP.NET :
@* Razor view -- barcode upload form *@
<form method="post" enctype="multipart/form-data" id="barcodeForm">
<div class="form-group">
<label for="barcodeFile">Select Barcode Image:</label>
<input type="file" name="barcodeFile" id="barcodeFile"
accept="image/*,.pdf" class="form-control"
capture="environment" />
</div>
<button type="submit" class="btn btn-primary" id="scanBtn">
<span class="spinner-border spinner-border-sm d-none" role="status"></span>
Scan Barcode
</button>
</form>
<div id="results">
@ViewBag.BarcodeResult
</div>
@* Razor view -- barcode upload form *@
<form method="post" enctype="multipart/form-data" id="barcodeForm">
<div class="form-group">
<label for="barcodeFile">Select Barcode Image:</label>
<input type="file" name="barcodeFile" id="barcodeFile"
accept="image/*,.pdf" class="form-control"
capture="environment" />
</div>
<button type="submit" class="btn btn-primary" id="scanBtn">
<span class="spinner-border spinner-border-sm d-none" role="status"></span>
Scan Barcode
</button>
</form>
<div id="results">
@ViewBag.BarcodeResult
</div>
@* Razor view -- barcode upload form *@
<form method="post" enctype="multipart/form-data" id="barcodeForm">
<div class="form-group">
<label for="barcodeFile">Select Barcode Image:</label>
<input type="file" name="barcodeFile" id="barcodeFile"
accept="image/*,.pdf" class="form-control"
capture="environment" />
</div>
<button type="submit" class="btn btn-primary" id="scanBtn">
<span class="spinner-border spinner-border-sm d-none" role="status"></span>
Scan Barcode
</button>
</form>
<div id="results">
@ViewBag.BarcodeResult
</div>
L'attribut capture="environment" active la caméra arrière sur les appareils mobiles, offrant aux utilisateurs une expérience similaire à celle d'une caméra native sans JavaScript.
Mise en œuvre d'un traitement backend sécurisé
L'action du contrôleur gère la validation des fichiers, le traitement du flux mémoire et la mise en forme des résultats :
[HttpPost]
[ValidateAntiForgeryToken]
[RequestSizeLimit(10_000_000)] // 10MB limit
public async Task<IActionResult> ScanBarcode(IFormFile barcodeFile)
{
var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif",
".tiff", ".bmp", ".pdf" };
var extension = Path.GetExtension(barcodeFile.FileName).ToLowerInvariant();
if (!allowedExtensions.Contains(extension))
{
ModelState.AddModelError("", "Invalid file type");
return View();
}
if (barcodeFile != null && barcodeFile.Length > 0)
{
using var stream = new MemoryStream();
await barcodeFile.CopyToAsync(stream);
stream.Position = 0;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional |
BarcodeEncoding.QRCode |
BarcodeEncoding.DataMatrix,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter()
}
};
var results = BarcodeReader.Read(stream, options);
ViewBag.BarcodeResult = results.Any()
? string.Join("<br/>", results.Select(r => $"<strong>{r.BarcodeType}:</strong> {r.Text}"))
: "No barcodes found in the image.";
}
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
[RequestSizeLimit(10_000_000)] // 10MB limit
public async Task<IActionResult> ScanBarcode(IFormFile barcodeFile)
{
var allowedExtensions = new[] { ".jpg", ".jpeg", ".png", ".gif",
".tiff", ".bmp", ".pdf" };
var extension = Path.GetExtension(barcodeFile.FileName).ToLowerInvariant();
if (!allowedExtensions.Contains(extension))
{
ModelState.AddModelError("", "Invalid file type");
return View();
}
if (barcodeFile != null && barcodeFile.Length > 0)
{
using var stream = new MemoryStream();
await barcodeFile.CopyToAsync(stream);
stream.Position = 0;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional |
BarcodeEncoding.QRCode |
BarcodeEncoding.DataMatrix,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter()
}
};
var results = BarcodeReader.Read(stream, options);
ViewBag.BarcodeResult = results.Any()
? string.Join("<br/>", results.Select(r => $"<strong>{r.BarcodeType}:</strong> {r.Text}"))
: "No barcodes found in the image.";
}
return View();
}
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.AspNetCore.Http
Imports System.IO
Imports System.Threading.Tasks
Imports ZXing
<HttpPost>
<ValidateAntiForgeryToken>
<RequestSizeLimit(10_000_000)> ' 10MB limit
Public Async Function ScanBarcode(barcodeFile As IFormFile) As Task(Of IActionResult)
Dim allowedExtensions As String() = {".jpg", ".jpeg", ".png", ".gif", ".tiff", ".bmp", ".pdf"}
Dim extension As String = Path.GetExtension(barcodeFile.FileName).ToLowerInvariant()
If Not allowedExtensions.Contains(extension) Then
ModelState.AddModelError("", "Invalid file type")
Return View()
End If
If barcodeFile IsNot Nothing AndAlso barcodeFile.Length > 0 Then
Using stream As New MemoryStream()
Await barcodeFile.CopyToAsync(stream)
stream.Position = 0
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional Or
BarcodeEncoding.QRCode Or
BarcodeEncoding.DataMatrix,
.ImageFilters = New ImageFilterCollection From {
New SharpenFilter(),
New ContrastFilter()
}
}
Dim results = BarcodeReader.Read(stream, options)
ViewBag.BarcodeResult = If(results.Any(),
String.Join("<br/>", results.Select(Function(r) $"<strong>{r.BarcodeType}:</strong> {r.Text}")),
"No barcodes found in the image.")
End Using
End If
Return View()
End Function
Cette implémentation valide le type de fichier avant traitement, lit les codes-barres à partir d'un flux mémoire et renvoie tous les résultats détectés. IronBarcode traite différents formats d'image , notamment les documents TIFF et GIF multipages et les documents PDF , éliminant ainsi le code de gestion spécifique au format.
À quoi ressemblent les entrées et sorties scannées ?

L'exemple ci-dessus illustre un code-barres standard Code 128, un format courant dans les applications d'expédition et de gestion des stocks. Après l'analyse, l'écran de résultats confirme la valeur décodée ainsi que les métadonnées de confiance :

IronBarcode renvoie le type de code-barres, la valeur décodée, le score de confiance et les données de position pour chaque code-barres détecté dans l'image téléchargée.
Comment créer une API REST pour la lecture de codes-barres ?
Les applications ASP.NET modernes exposent souvent des fonctionnalités de lecture de codes-barres via des API REST, permettant ainsi l'intégration avec des applications mobiles, des applications monopages ou des services tiers. Ce modèle prend en charge la capture vidéo côté client avec traitement côté serveur.
Considérations de sécurité pour les API de codes-barres
Avant d'écrire le contrôleur, planifiez la couche de sécurité. Les données des codes-barres peuvent contenir des informations arbitraires ; il est donc impératif de toujours valider les données saisies. Suivez les consignes de sécurité IronBarcode pour une protection complète :
- Validation des données saisies : Nettoyer le contenu du code-barres avant de le stocker ou de l'utiliser.
- Limitation du débit : Utilisez le middleware de limitation de débit intégré à ASP.NET Core pour empêcher les abus d'API.
- Authentification : Sécurisez les points de terminaison avec des jetons JWT ou des clés API.
- Application du protocole HTTPS : Tout le trafic de l'API de codes-barres doit transiter par TLS.
- Politique CORS : limitez les origines autorisées à appeler votre point de terminaison d'analyse
- Gestion des clés de licence : Appliquer correctement les clés de licence et les configurer dans le fichier web.config pour la production
Création du contrôleur d'API de production
[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
private readonly ILogger<BarcodeController> _logger;
private readonly IMemoryCache _cache;
public BarcodeController(ILogger<BarcodeController> logger, IMemoryCache cache)
{
_logger = logger;
_cache = cache;
}
[HttpPost("scan")]
[ProducesResponseType(typeof(BarcodeResponse), 200)]
[ProducesResponseType(typeof(ErrorResponse), 400)]
public async Task<IActionResult> ScanBarcode([FromBody] BarcodeRequest request)
{
try
{
if (string.IsNullOrEmpty(request.ImageBase64))
return BadRequest(new ErrorResponse { Error = "Image data is required" });
var cacheKey = $"barcode_{request.ImageBase64.GetHashCode()}";
if (_cache.TryGetValue(cacheKey, out BarcodeResponse cachedResult))
return Ok(cachedResult);
byte[] imageBytes = Convert.FromBase64String(request.ImageBase64);
if (imageBytes.Length > 10 * 1024 * 1024)
return BadRequest(new ErrorResponse { Error = "Image size exceeds 10MB limit" });
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Faster,
ExpectMultipleBarcodes = request.ExpectMultiple ?? false,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.8
};
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var response = new BarcodeResponse
{
Success = true,
Barcodes = results.Select(r => new BarcodeData
{
Type = r.BarcodeType.ToString(),
Value = r.Text,
Confidence = r.Confidence,
Position = new BarcodePosition
{
X = r.Points.Select(p => p.X).Min(),
Y = r.Points.Select(p => p.Y).Min(),
Width = r.Width,
Height = r.Height
}
}).ToList()
};
_cache.Set(cacheKey, response, TimeSpan.FromMinutes(5));
return Ok(response);
}
catch (FormatException)
{
return BadRequest(new ErrorResponse { Error = "Invalid base64 image data" });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing barcode scan");
return StatusCode(500, new ErrorResponse { Error = "Internal server error" });
}
}
}
public record BarcodeRequest(string ImageBase64, bool? ExpectMultiple);
public record BarcodeResponse
{
public bool Success { get; init; }
public List<BarcodeData> Barcodes { get; init; } = new();
}
public record BarcodeData
{
public string Type { get; init; }
public string Value { get; init; }
public double Confidence { get; init; }
public BarcodePosition Position { get; init; }
}
public record BarcodePosition(int X, int Y, int Width, int Height);
public record ErrorResponse
{
public bool Success => false;
public string Error { get; init; }
}
[ApiController]
[Route("api/[controller]")]
public class BarcodeController : ControllerBase
{
private readonly ILogger<BarcodeController> _logger;
private readonly IMemoryCache _cache;
public BarcodeController(ILogger<BarcodeController> logger, IMemoryCache cache)
{
_logger = logger;
_cache = cache;
}
[HttpPost("scan")]
[ProducesResponseType(typeof(BarcodeResponse), 200)]
[ProducesResponseType(typeof(ErrorResponse), 400)]
public async Task<IActionResult> ScanBarcode([FromBody] BarcodeRequest request)
{
try
{
if (string.IsNullOrEmpty(request.ImageBase64))
return BadRequest(new ErrorResponse { Error = "Image data is required" });
var cacheKey = $"barcode_{request.ImageBase64.GetHashCode()}";
if (_cache.TryGetValue(cacheKey, out BarcodeResponse cachedResult))
return Ok(cachedResult);
byte[] imageBytes = Convert.FromBase64String(request.ImageBase64);
if (imageBytes.Length > 10 * 1024 * 1024)
return BadRequest(new ErrorResponse { Error = "Image size exceeds 10MB limit" });
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Faster,
ExpectMultipleBarcodes = request.ExpectMultiple ?? false,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.8
};
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var response = new BarcodeResponse
{
Success = true,
Barcodes = results.Select(r => new BarcodeData
{
Type = r.BarcodeType.ToString(),
Value = r.Text,
Confidence = r.Confidence,
Position = new BarcodePosition
{
X = r.Points.Select(p => p.X).Min(),
Y = r.Points.Select(p => p.Y).Min(),
Width = r.Width,
Height = r.Height
}
}).ToList()
};
_cache.Set(cacheKey, response, TimeSpan.FromMinutes(5));
return Ok(response);
}
catch (FormatException)
{
return BadRequest(new ErrorResponse { Error = "Invalid base64 image data" });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error processing barcode scan");
return StatusCode(500, new ErrorResponse { Error = "Internal server error" });
}
}
}
public record BarcodeRequest(string ImageBase64, bool? ExpectMultiple);
public record BarcodeResponse
{
public bool Success { get; init; }
public List<BarcodeData> Barcodes { get; init; } = new();
}
public record BarcodeData
{
public string Type { get; init; }
public string Value { get; init; }
public double Confidence { get; init; }
public BarcodePosition Position { get; init; }
}
public record BarcodePosition(int X, int Y, int Width, int Height);
public record ErrorResponse
{
public bool Success => false;
public string Error { get; init; }
}
Imports System
Imports Microsoft.AspNetCore.Mvc
Imports Microsoft.Extensions.Logging
Imports Microsoft.Extensions.Caching.Memory
Imports System.Threading.Tasks
<ApiController>
<Route("api/[controller]")>
Public Class BarcodeController
Inherits ControllerBase
Private ReadOnly _logger As ILogger(Of BarcodeController)
Private ReadOnly _cache As IMemoryCache
Public Sub New(logger As ILogger(Of BarcodeController), cache As IMemoryCache)
_logger = logger
_cache = cache
End Sub
<HttpPost("scan")>
<ProducesResponseType(GetType(BarcodeResponse), 200)>
<ProducesResponseType(GetType(ErrorResponse), 400)>
Public Async Function ScanBarcode(<FromBody> request As BarcodeRequest) As Task(Of IActionResult)
Try
If String.IsNullOrEmpty(request.ImageBase64) Then
Return BadRequest(New ErrorResponse With {.Error = "Image data is required"})
End If
Dim cacheKey = $"barcode_{request.ImageBase64.GetHashCode()}"
Dim cachedResult As BarcodeResponse = Nothing
If _cache.TryGetValue(cacheKey, cachedResult) Then
Return Ok(cachedResult)
End If
Dim imageBytes As Byte() = Convert.FromBase64String(request.ImageBase64)
If imageBytes.Length > 10 * 1024 * 1024 Then
Return BadRequest(New ErrorResponse With {.Error = "Image size exceeds 10MB limit"})
End If
Dim options = New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Faster,
.ExpectMultipleBarcodes = request.ExpectMultiple.GetValueOrDefault(False),
.UseConfidenceThreshold = True,
.ConfidenceThreshold = 0.8
}
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
Dim response = New BarcodeResponse With {
.Success = True,
.Barcodes = results.Select(Function(r) New BarcodeData With {
.Type = r.BarcodeType.ToString(),
.Value = r.Text,
.Confidence = r.Confidence,
.Position = New BarcodePosition With {
.X = r.Points.Select(Function(p) p.X).Min(),
.Y = r.Points.Select(Function(p) p.Y).Min(),
.Width = r.Width,
.Height = r.Height
}
}).ToList()
}
_cache.Set(cacheKey, response, TimeSpan.FromMinutes(5))
Return Ok(response)
Catch ex As FormatException
Return BadRequest(New ErrorResponse With {.Error = "Invalid base64 image data"})
Catch ex As Exception
_logger.LogError(ex, "Error processing barcode scan")
Return StatusCode(500, New ErrorResponse With {.Error = "Internal server error"})
End Try
End Function
End Class
Public Class BarcodeRequest
Public Property ImageBase64 As String
Public Property ExpectMultiple As Boolean?
End Class
Public Class BarcodeResponse
Public Property Success As Boolean
Public Property Barcodes As List(Of BarcodeData) = New List(Of BarcodeData)()
End Class
Public Class BarcodeData
Public Property Type As String
Public Property Value As String
Public Property Confidence As Double
Public Property Position As BarcodePosition
End Class
Public Class BarcodePosition
Public Property X As Integer
Public Property Y As Integer
Public Property Width As Integer
Public Property Height As Integer
End Class
Public Class ErrorResponse
Public ReadOnly Property Success As Boolean
Get
Return False
End Get
End Property
Public Property Error As String
End Class
Ce point de terminaison accepte les images encodées en base64, le format standard pour la transmission d'images via HTTP. La réponse comprend le type de code-barres, sa valeur décodée, son score de confiance et sa position. Pour les scénarios à volume élevé, examinez les options d'optimisation du traitement par lots des codes-barres et de la vitesse de lecture .
Comment l'API gère-t-elle plusieurs codes-barres ?

IronBarcode traite plusieurs codes-barres dans une seule image en un seul appel, et renvoie un tableau de résultats. Chaque entrée de la réponse comprend des données de position permettant à l'application cliente de mettre en évidence les codes-barres détectés à l'écran.

La réponse JSON structurée fournit aux applications clientes tout ce dont elles ont besoin pour traiter et afficher les résultats des codes-barres sans recherches supplémentaires.
Comment gérez-vous les images de codes-barres difficiles à traiter ?
La lecture des codes-barres dans le monde réel implique fréquemment des images imparfaites : photos prises de biais, mauvais éclairage ou codes-barres partiellement endommagés. IronBarcode répond à ces scénarios grâce à ses capacités avancées de traitement d'images et à ses seuils de confiance d'apprentissage automatique .
Diagnostic des problèmes de numérisation courants
Avant d'appliquer des corrections, identifiez la catégorie à laquelle appartient votre problème. La plupart des échecs de numérisation en production se répartissent en cinq groupes : problèmes de qualité d'image (flou, bruit, faible résolution), problèmes géométriques (rotation, inclinaison, distorsion de perspective), problèmes de dommages (étiquettes déchirées, encre bavée), problèmes environnementaux (reflets, ombres, éclairage irrégulier) et faux positifs, lorsque le lecteur détecte un code-barres inexistant.
Connaître la catégorie vous aide à sélectionner la bonne combinaison de filtres et la vitesse de lecture sans effectuer de traitement inutile sur chaque image. Pour la plupart des scénarios d'application Web, commencer par ReadingSpeed.Balanced et AutoRotate = true couvre la majorité des cas. N'utilisez le code ExtremeDetail que lorsque la première passe ne donne aucun résultat.
L'approche multi-passes du code ci-dessous met en œuvre cette stratégie hiérarchisée. Le premier passage rapide traite rapidement les images typiques, maintenant ainsi une latence médiane faible dans la plupart des cas. La seconde analyse détaillée n'est déclenchée que lorsque la première échoue, vous assurant ainsi de ne payer les frais de traitement supplémentaires que lorsqu'ils sont réellement nécessaires. Ce modèle permet à votre point de terminaison ASP.NET de rester réactif sous une charge normale tout en gérant de manière fiable les cas limites difficiles.
| Problème | Symptôme | Solution |
|---|---|---|
| Image floue | Faibles scores de confiance, lectures manquées | Appliquer `SharpenFilter` , augmenter la vitesse `ExtremeDetail` |
| Code-barres pivoté | Code-barres non détecté du tout | Activer `AutoRotate = true` |
| Code-barres endommagé | Lectures partielles, valeurs incorrectes | Activez la correction d'erreurs, utilisez `RemoveFalsePositive` |
| Faible contraste | Détection incohérente | Appliquer `ContrastFilter` et `BrightnessFilter` |
| Performances trop lentes | Latence élevée lors des chargements | Utilisez `ReadingSpeed.Faster` , activez le multithreading |
Mise en œuvre du traitement d'images multi-passes
Pour les images complexes, une approche de traitement par étapes donne les meilleurs résultats sans sacrifier les performances sur les images faciles :
public class AdvancedBarcodeProcessor
{
private readonly ILogger<AdvancedBarcodeProcessor> _logger;
public async Task<List<ScannedBarcode>> ProcessChallengingImage(Stream imageStream)
{
// First pass -- fast, minimal processing
var fastOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
AutoRotate = false,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.85
};
var results = BarcodeReader.Read(imageStream, fastOptions);
if (!results.Any())
{
// Second pass -- aggressive image correction
imageStream.Position = 0;
var detailedOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = true,
AutoRotate = true,
RemoveFalsePositive = true,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.6,
Multithreaded = true,
ExpectBarcodeTypes = BarcodeEncoding.All,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(2.5f),
new ContrastFilter(2.0f),
new BrightnessFilter(1.2f),
new InvertFilter()
}
};
results = BarcodeReader.Read(imageStream, detailedOptions);
_logger.LogInformation("Second pass detected {Count} barcodes", results.Count());
}
return results.Select(r => new ScannedBarcode
{
Value = r.Text,
BarcodeType = r.BarcodeType.ToString(),
Confidence = r.Confidence,
RotationAngle = r.RotationAngle,
PageNumber = r.PageNumber
}).ToList();
}
}
public record ScannedBarcode
{
public string Value { get; init; }
public string BarcodeType { get; init; }
public double Confidence { get; init; }
public float RotationAngle { get; init; }
public int PageNumber { get; init; }
}
public class AdvancedBarcodeProcessor
{
private readonly ILogger<AdvancedBarcodeProcessor> _logger;
public async Task<List<ScannedBarcode>> ProcessChallengingImage(Stream imageStream)
{
// First pass -- fast, minimal processing
var fastOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
AutoRotate = false,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.85
};
var results = BarcodeReader.Read(imageStream, fastOptions);
if (!results.Any())
{
// Second pass -- aggressive image correction
imageStream.Position = 0;
var detailedOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = true,
AutoRotate = true,
RemoveFalsePositive = true,
UseConfidenceThreshold = true,
ConfidenceThreshold = 0.6,
Multithreaded = true,
ExpectBarcodeTypes = BarcodeEncoding.All,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(2.5f),
new ContrastFilter(2.0f),
new BrightnessFilter(1.2f),
new InvertFilter()
}
};
results = BarcodeReader.Read(imageStream, detailedOptions);
_logger.LogInformation("Second pass detected {Count} barcodes", results.Count());
}
return results.Select(r => new ScannedBarcode
{
Value = r.Text,
BarcodeType = r.BarcodeType.ToString(),
Confidence = r.Confidence,
RotationAngle = r.RotationAngle,
PageNumber = r.PageNumber
}).ToList();
}
}
public record ScannedBarcode
{
public string Value { get; init; }
public string BarcodeType { get; init; }
public double Confidence { get; init; }
public float RotationAngle { get; init; }
public int PageNumber { get; init; }
}
Imports System.IO
Imports System.Collections.Generic
Imports System.Linq
Imports System.Threading.Tasks
Public Class AdvancedBarcodeProcessor
Private ReadOnly _logger As ILogger(Of AdvancedBarcodeProcessor)
Public Async Function ProcessChallengingImage(imageStream As Stream) As Task(Of List(Of ScannedBarcode))
' First pass -- fast, minimal processing
Dim fastOptions As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.AutoRotate = False,
.UseConfidenceThreshold = True,
.ConfidenceThreshold = 0.85
}
Dim results = BarcodeReader.Read(imageStream, fastOptions)
If Not results.Any() Then
' Second pass -- aggressive image correction
imageStream.Position = 0
Dim detailedOptions As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = True,
.AutoRotate = True,
.RemoveFalsePositive = True,
.UseConfidenceThreshold = True,
.ConfidenceThreshold = 0.6,
.Multithreaded = True,
.ExpectBarcodeTypes = BarcodeEncoding.All,
.ImageFilters = New ImageFilterCollection From {
New SharpenFilter(2.5F),
New ContrastFilter(2.0F),
New BrightnessFilter(1.2F),
New InvertFilter()
}
}
results = BarcodeReader.Read(imageStream, detailedOptions)
_logger.LogInformation("Second pass detected {Count} barcodes", results.Count())
End If
Return results.Select(Function(r) New ScannedBarcode With {
.Value = r.Text,
.BarcodeType = r.BarcodeType.ToString(),
.Confidence = r.Confidence,
.RotationAngle = r.RotationAngle,
.PageNumber = r.PageNumber
}).ToList()
End Function
End Class
Public Class ScannedBarcode
Public Property Value As String
Public Property BarcodeType As String
Public Property Confidence As Double
Public Property RotationAngle As Single
Public Property PageNumber As Integer
End Class
La classe BarcodeReaderOptions offre un contrôle précis sur chaque aspect de la numérisation. Le paramètre AutoRotate gère les images capturées sous n'importe quel angle, tandis que les filtres d'image améliorent la clarté des codes-barres flous ou à faible contraste. Pour une configuration détaillée, consultez l' exemple de paramètres du lecteur de codes-barres et les paramètres spécifiques au lecteur PDF .
Lorsque vous travaillez avec des fichiers PDF, pensez à y apposer des codes-barres ou à créer des codes-barres sous forme de documents PDF . Pour le traitement de volumes importants, l'activation du multithreading via les fonctionnalités asynchrones et multithread améliore considérablement le débit.
Ajout de la compatibilité navigateur et de stratégies de repli
La prise en charge de différents navigateurs nécessite une amélioration progressive. Les navigateurs modernes sur Android et sur ordinateur Chrome, Edge et Firefox prennent en charge l'API MediaDevices.getUserMedia() pour l'accès à la caméra. Safari sur iOS le prend en charge à partir de la version 11. Les navigateurs Enterprise plus anciens, les modes de compatibilité IE11 et certains environnements d'entreprise verrouillés peuvent ne pas prendre en charge l'accès à la caméra ; votre solution de secours pour le téléchargement de fichiers doit donc toujours rester fonctionnelle.
L'approche recommandée consiste à utiliser la détection de caractéristiques en temps réel plutôt que la détection de l'agent utilisateur, puis à afficher ou masquer l'interface de la caméra en conséquence. Commencez par une interface compatible avec une caméra et basculez facilement vers le téléchargement de fichiers :
@* Razor view with progressive enhancement *@
<div class="barcode-scanner-container">
@* Camera capture -- hidden until JavaScript confirms support *@
<div id="cameraSection" class="d-none">
<video id="videoPreview" class="w-100" autoplay></video>
<button id="captureBtn" class="btn btn-primary mt-2">Capture and Scan</button>
</div>
@* File upload -- always available as fallback *@
<div id="uploadSection">
<form method="post" enctype="multipart/form-data"
asp-action="ScanBarcode" asp-controller="Barcode">
<div class="form-group">
<label>Upload Barcode Image:</label>
<input type="file" name="file" accept="image/*,.pdf"
class="form-control" required />
</div>
<button type="submit" class="btn btn-primary">Upload and Scan</button>
</form>
</div>
</div>
@* Razor view with progressive enhancement *@
<div class="barcode-scanner-container">
@* Camera capture -- hidden until JavaScript confirms support *@
<div id="cameraSection" class="d-none">
<video id="videoPreview" class="w-100" autoplay></video>
<button id="captureBtn" class="btn btn-primary mt-2">Capture and Scan</button>
</div>
@* File upload -- always available as fallback *@
<div id="uploadSection">
<form method="post" enctype="multipart/form-data"
asp-action="ScanBarcode" asp-controller="Barcode">
<div class="form-group">
<label>Upload Barcode Image:</label>
<input type="file" name="file" accept="image/*,.pdf"
class="form-control" required />
</div>
<button type="submit" class="btn btn-primary">Upload and Scan</button>
</form>
</div>
</div>
@* Razor view with progressive enhancement *@
<div class="barcode-scanner-container">
@* Camera capture -- hidden until JavaScript confirms support *@
<div id="cameraSection" class="d-none">
<video id="videoPreview" class="w-100" autoplay></video>
<button id="captureBtn" class="btn btn-primary mt-2">Capture and Scan</button>
</div>
@* File upload -- always available as fallback *@
<div id="uploadSection">
<form method="post" enctype="multipart/form-data"
asp-action="ScanBarcode" asp-controller="Barcode">
<div class="form-group">
<label>Upload Barcode Image:</label>
<input type="file" name="file" accept="image/*,.pdf"
class="form-control" required />
</div>
<button type="submit" class="btn btn-primary">Upload and Scan</button>
</form>
</div>
</div>
L' intégration Blazor offre une prise en charge des applications web modernes avec une configuration minimale si vous préférez une approche basée sur les composants. Pour le dépannage du déploiement, consultez le guide des exceptions de copie des environnements d' exécution.
Quelles sont vos prochaines étapes ?
La lecture des codes-barres dans ASP.NET est simple avec IronBarcode. Vous installez un package NuGet , appelez BarcodeReader.Read(), et obtenez des résultats décodés fiables sur plus de 30 formats, y compris des images du monde réel difficiles avec lesquelles d'autres bibliothèques ont du mal.
Pour continuer à bâtir sur ces bases, explorez ces ressources :
- Tutoriel de lecture des codes-barres : guide détaillé pour tous les scénarios de lecture -Génération de codes-barres : créez des codes-barres et des codes QR par programmation. Générateur de codes QR : fonctionnalités et style spécifiques aux codes QR
- Correction d'image : techniques pour améliorer la précision de numérisation des images difficiles
- Asynchrone et multithreading : traitement des codes-barres à grande échelle pour les applications à fort trafic
- Compatibilité multiplateforme : déploiement sur Windows, Linux, Docker, Azure et AWS
- Formats de codes-barres pris en charge -- liste complète des symbologies lisibles et inscriptibles
- Fonctionnalités de tolérance aux pannes : fonctionnement fiable même dans des conditions difficiles
- Référence API : documentation complète pour toutes les classes et options
- Options de licence : licences SaaS, OEM et Enterprise pour les déploiements en production
Commencez par une licence d'essai gratuite pour tester IronBarcode dans votre application ASP.NET sans aucune restriction. L'essai comprend un accès complet à toutes les fonctionnalités, notamment la détection multiformat, la correction d'image et les modèles d'API REST présentés dans ce guide ; vous pouvez ainsi évaluer les performances sur vos propres images avant de souscrire à une licence de production. Pour les applications mobiles .NET MAUI nécessitant une numérisation sur l'appareil, consultez le tutoriel sur le lecteur de codes-barres .NET MAUI qui étend la même API aux cibles iOS et Android.
Questions Fréquemment Posées
Quelle est l'utilisation principale de la numérisation de codes-barres dans les applications ASP.NET ?
La numérisation de codes-barres dans les applications ASP.NET est principalement utilisée pour améliorer les systèmes de gestion des stocks, traiter les billets lors d'événements et numériser les documents papier, améliorant ainsi l'efficacité et réduisant les erreurs.
Comment IronBarcode facilite-t-il la numérisation de codes-barres dans ASP.NET ?
IronBarcode simplifie le processus de numérisation de codes-barres dans ASP.NET en fournissant des composants fiables et efficaces qui peuvent être facilement intégrés dans des applications web, permettant aux développeurs de mettre rapidement en œuvre des fonctionnalités de numérisation.
Quels types de codes-barres peuvent être numérisés avec IronBarcode ?
IronBarcode prend en charge la numérisation d'une grande variété de formats de codes-barres, y compris les codes-barres linéaires traditionnels et les codes-barres 2D modernes, garantissant la compatibilité avec des applications diverses.
IronBarcode peut-il gérer la numérisation de codes-barres pour le traitement de documents ?
Oui, IronBarcode est bien adapté aux flux de traitement de documents, où il peut être utilisé pour numériser et organiser des documents papier en scannant les codes-barres intégrés.
IronBarcode est-il adapté aux systèmes de gestion des stocks ?
IronBarcode est un excellent choix pour les systèmes de gestion des stocks, car il permet un suivi efficace des produits en scannant les codes-barres, simplifiant ainsi les opérations et minimisant les erreurs.
Comment l'intégration d'IronBarcode améliore-t-elle le traitement des billets d'événement ?
En intégrant IronBarcode, le traitement des billets d'événement devient fluide car il permet une numérisation rapide des codes-barres des billets, facilitant une gestion d'entrée rapide et précise lors des événements.
Quels sont les avantages de l'utilisation d'IronBarcode dans les projets ASP.NET ?
L'utilisation d'IronBarcode dans les projets ASP.NET offre plusieurs avantages, notamment la facilité d'intégration, la prise en charge de multiples formats de codes-barres et l'amélioration des performances de l'application, offrant ainsi une solution robuste pour les besoins de numérisation de codes-barres.
IronBarcode nécessite-t-il des connaissances approfondies en codage pour être mis en œuvre ?
Non, IronBarcode est conçu pour être convivial pour les développeurs, rendant facile la mise en œuvre de la fonctionnalité de numérisation de codes-barres dans les applications ASP.NET avec des connaissances minimales en codage.
IronBarcode peut-il être utilisé pour les applications web mobiles ?
Oui, IronBarcode peut être intégré dans des applications web mobiles, permettant la numérisation de codes-barres en déplacement et améliorant la polyvalence des projets ASP.NET.



