ASP.NET Barkod Tarayıcı: Dosya Yükleme ve IronBarcode ile REST API
ASP.NET'te barkod tarama, IronBarcode ile kolay hale gelir: NuGet aracılığıyla yükleyin, BarcodeReader.Read() çağırın ve tür, güven ve konum verileriyle birlikte kodlanmış değerleri tek adımda alın -- karmaşık yapılandırma gerekmez.
Barkod tarama işlemi, envanter yönetimi, belge işleme ve bilet doğrulama iş akışlarını güçlendiren modern web uygulamalarının standart bir gereksinimi haline gelmiştir. GS1'e göre, barkodlar dünya genelinde günlük 6 milyardan fazla işlemde kullanılmakta -- bu rakam, doğru barkod okumanın herhangi bir ticari sistem için ne kadar kritik olduğunu vurgular. ISO/IEC 15415 standardı, 2D barkod sembolleri için kalite ölçütlerini tanımlar ve ISO/IEC 15416 standardı, her ikisini de yerel olarak destekleyen IronBarcode tarafından desteklenen 1D doğrusallı barkodları kapsar.
Bu kılavuz, IronBarcode kullanarak ASP.NET Core uygulamanıza güvenilir barkod taramayı nasıl ekleyeceğinizi, kurulum, dosya yükleme işlemi, REST API entegrasyonu ve üretim dağıtım kalıplarını kapsayan şekilde gösterir. Sonunda, hem bir Razor sayfa dosya yükleme tarayıcısı hem de herhangi bir istemciden base64 kodlu görüntüler kabul eden bir JSON API uç noktası için çalışan bir kod alacaksınız.
Bir ASP.NET Projesine IronBarcode Nasıl Kurulur?
Başlamak sadece birkaç dakika sürer. Kütüphane hem ASP.NET Core hem de geleneksel ASP.NET MVC uygulamalarını destekleyerek çeşitli proje türlerine göre uyarlanabilir hale getirir. Kurumsal dağıtımlar da aynı şekilde Azure, AWS Lambda ve Docker kapsayıcıları üzerinde eşit derecede iyi çalışır. Kütüphanenin makine öğrenimi ile güçlendirilmiş algılama özelliği, değişken aydınlatma koşullarında mobil kameralarla çekilen fotoğrafları işlerken özellikle yararlı olan, zorlu barkod görüntülerine karmaşık görüntü düzeltme işlemi uygular.
NuGet Paket Yöneticisi Üzerinden Kurulum
Visual Studio'da Paket Yöneticisi Konsolunu açın ve şu komutu çalıştırın:
Install-Package BarCode
Alternatif olarak, .NET CLI'yi kullanın:
dotnet add package BarCode
"BarCode" için Visual Studio NuGet Paket Yöneticisi UI içinde arama yapın ve Yükle'ye tıklayın. Paket, tüm bağımlılıkları otomatik olarak yönetir.
Yapılandırmaya özel dağıtımlar için, hedef ortamınız için optimize edilmiş platforma özgü NuGet paketleri kullanmayı düşünün. Kütüphane, farklı dağıtım senaryoları için hem standart hem de BarCode.Slim paketlerini sunar. Tam kurulum için, IronBarcode kurulum rehberine bakın.
Projenizi Yapılandırma
Kurulumdan sonra, C# dosyalarınıza gerekli using ifadesini ekleyin:
using IronBarCode;
using IronBarCode;
Imports IronBarCode
Bu ithalat, IronBarcode'un kapsamlı barkod okuma ve üretim özelliklerini kullanma erişimi sağlar. Kütüphane, QR Kodu, Kod 128, Kod 39, Veri Matrisi ve PDF417 dahil 30'dan fazla barkod formatını destekler. Kendi kullanım senaryonuzla uyumluluğu teyit etmek için desteklenen barkod formatlarının tam listesine bakın.
Kurulum sorunlarını giderme konusunda, NuGet paketleri sorun giderme rehberine bakın veya özel destek için bir mühendislik talebi gönderin.
Doğru Mimari Deseni Seçmek
ASP.NET içinde barkod tarama uygularken, iki ana mimari yaklaşımınız vardır. Bu desenleri anlamak, her kullanım durumu için doğru barkod okuyucu ayarlarını seçmenize yardımcı olur:
// 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
Sunucu tarafı yaklaşımı, görüntü işlemesi üzerinde maksimum kontrol sağlar ve tüm tarayıcılarda tutarlı bir şekilde çalışır. Sunucu her görüntüyü işlediğinde, temiz bir denetim izi de elde edersiniz: her bir tarama, uygulama katmanınızdan geçerek kaydedilir, bir veritabanına doğrulanır veya aşağıya doğru iş akışlarını tetikleyebilir. Bu desen, her taramanın kaydedilmesi gereken sağlık, lojistik ve üretim gibi düzenlemeye tabi sektörler için özellikle uygundur.
Müşteri tarafı kamera entegrasyonu için modern tarayıcılar kamera erişimi için MediaDevices API'sini destekler ve bu, IronBarcode'un sunucu tarafı işlemesiyle REST API üzerinden birleştirilebilir -- bu kılavuzda daha sonra ayrıntılı olarak ele alınmıştır. Sunucu tarafı işlemeyi seçmek ayrıca güvenlik modelinizi basitleştirir: tarayıcıya açıkta hassas işleme mantığı olmaz ve tüm doğrulamalar uygulama sınırınızın arkasında gerçekleşir.
| Boyut | İstemci-Tarafı Yakalama + Sunucu İşleme | Saf Sunucu-Tarafı İşleme |
|---|---|---|
| En iyi | Kamera ile gerçek zamanlı tarama | Toplu işlem, dosya yüklemeleri |
| Tarayıcı desteği | Sadece modern tarayıcılar | Tüm tarayıcılar |
| Kullanıcı deneyimi | Anında geri bildirim | Standart yükleme akışı |
| Güvenlik modeli | Daha karmaşık (CORS, kimlik doğrulama) | Basit |
| Bant genişliği kullanımı | Daha düşük (cihazda ön işleme) | Daha yüksek (ham görüntü yükleme) |
Dosya Yükleme Barkod Tarama Nasıl Uygulanır?
Dosya yükleme taraması, ASP.NET web uygulamalarında en yaygın barkod senaryosudur. Bu desen, faturalar, nakliye etiketleri veya gömülü barkodlar içeren herhangi bir belgeyi işlemek için çalışır. Daha yüksek verimlilik için, asenkron barkod okuma uygulamayı düşünün, böylece birden fazla yüklemeyi eşzamanlı olarak işleyebilirsiniz.
Yükleme Formunu Oluşturma
ASP.NET görünümünüzde duyarlı bir HTML form oluşturun:
@* 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>
capture="environment" özniteliği, mobil cihazlarda arka kamerayı etkinleştirir ve kullanıcılara JavaScript gerektirmeden yerel bir kamera deneyimi sunar.
Güvenli Arka Uç İşleme Uygulaması
Denetleyici işlemi dosya doğrulaması, bellek akışı işleme ve sonuç formatlamasını gerçekleştirir:
[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
Bu uygulama, dosya türünü işlemden önce doğrular, bellek akışından barkodları okur ve tespit edilen sonuçları döndürür. IronBarcode, çeşitli görüntü formatlarını, çok sayfalı TIFF ve GIF ve PDF belgeleri dahil, format özgü işleme kodunu ortadan kaldırarak işler.
Tarama Girdisi ve Çıktısının Görünümü

Yukarıdaki örnek, nakliye ve envanter uygulamalarında yaygın bir format olan standart bir Code 128 barkodunu gösteriyor. Tarandıktan sonra, sonuç ekranı kod çözülmüş değeri ve güven puanı metadatasini doğrular:

IronBarcode, yüklenen görüntüde tespit edilen her bir barkod için barkod türü, çözülen değer, güven skoru ve konum verilerini döndürür.
Barkod Taraması için REST API Nasıl Oluşturulur?
Modern ASP.NET uygulamaları, mobil uygulamalar, tek sayfa uygulamalar veya üçüncü taraf hizmetlerle entegrasyon sağlayarak REST API'leri aracılığıyla barkod tarama yeteneklerini sıkça gösterir. Bu model, sunucu tarafı işlem ile istemci tarafı kamera yakalamayı destekler.
Barkod API'leri için Güvenlik Hususları
Denetleyiciyi yazmadan önce güvenlik katmanını planlayın. Barkod verileri rasgele içerik içerebilir, bu nedenle girişleri her zaman doğrulayın. Tam koruma için IronBarcode güvenlik yönergelerini izleyin:
- Giriş doğrulama: Barkod içeriğini saklamadan veya işlem yapmadan önce temizleyin
- Oran kısıtlaması: API kötüye kullanımını önlemek için ASP.NET Core'un yerleşik oran kısıtlama orta katmanını kullanın
- Kimlik doğrulama: Uç noktaları JWT jetonları veya API anahtarlarıyla güvenli hale getirin
- HTTPS zorunluluğu: Tüm barkod API trafiği TLS üzerinden aktarılmalıdır
- CORS politikası: Hangi kökenlerin tarama uç noktanıza çağrı yapabileceğini kısıtlayın
- Lisans anahtarı yönetimi: Üretim için lisans anahtarlarını doğru uygulayın ve web.config içinde yapılandırın
Üretim API Denetleyicisi Oluşturma
[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
Bu uç nokta, HTTP üzerinden görüntüleri iletmek için standart format olan base64 kodlamalı görüntüleri kabul eder. Yanıt, barkod türü, çözülen değer, güven skoru ve konum içerir. Yüksek hacimli senaryolar için, toplu barkod işleme ve okuma hızı optimizasyonu seçeneklerini inceleyin.
API Birden Fazla Barkodu Nasıl Yönetir?

IronBarcode, bir görüntüdeki birden fazla barkodu tek bir çağrıda işler ve bir sonuç dizisi döndürür. Yanıtta her bir giriş, istemci uygulamanın tespit edilen barkodları ekranda vurgulamasını sağlamak için konum verilerini içerir.

Yapısal JSON yanıtı, istemci uygulamalarına barkod sonuçlarını işlemek ve göstermek için gerekli her şeyi sağlar, ek aramalara gerek yoktur.
Zorlayıcı Barkod Görüntüleri Nasıl Yönetilir?
Gerçek dünyada barkod taraması sıklıkla açılı çekilmiş fotoğraflar, zayıf aydınlatma veya kısmen hasar görmüş barkodlar gibi kusurlu görüntüleri içerir. IronBarcode, gelişmiş görüntü işleme yetenekleri ve makine öğrenimi güven eşikleri sayesinde bu senaryoları ele alır.
Yaygın Tarama Sorunlarını Tanımlama
Düzeltmeler uygulamadan önce, sorunun hangi kategoriye girdiğini belirleyin. Üretim ortamındaki çoğu tarama hatası, beş gruptan birine girer: görüntü kalitesi sorunları (bulanıklık, gürültü, düşük çözünürlük), geometrik sorunlar (dönme, eğrilik, perspektif bozulması), hasar sorunları (yırtık etiketler, lekeli mürekkep), çevre sorunları (parlama, gölgeler, tutarsız aydınlatma) ve var olmayan bir barkod bulan yanlış pozitif tespit.
Kategoriyi bilmek, gereksiz işleme yapmadan doğru filtre kombinasyonunu ve okuma hızını seçmenize yardımcı olur. Çoğu web uygulaması senaryosu için, ReadingSpeed.Balanced ve AutoRotate = true ile başlamak, vakaların çoğunu kapsar. İlk geçiş sonuç vermediğinde yalnızca ExtremeDetail 'e yükseltin.
Aşağıdaki kodda çoklu geçiş yaklaşımı, bu katmanlı stratejiyi uygular. Hızlı ilk geçiş, tipik görüntüleri hızla işler, yaygın durum için ortalama gecikmeyi düşük tutar. Detaylı ikinci geçiş yalnızca ilk geçiş başarısız olduğunda tetiklenir, böylece ek işleme maliyetini yalnızca gerçekten gerektiğinde ödersiniz. Bu model, ASP.NET uç noktanızın normal yük altında duyarlı kalmasını ve zorlayıcı kenar durumlarını güvenilir bir şekilde yönetmesini sağlar.
| Sorun | Semptom | Çözüm |
|---|---|---|
| Bulanık görüntü | Düşük güven skorları, kaçırılan okumalar | SharpenFilter uygulayın, ExtremeDetail hızını artırın |
| Dönmüş barkod | Barkod hiç tespit edilmedi | AutoRotate = true etkinleştirin |
| Hasarlı barkod | Kısmi okumalar, yanlış değerler | Hata düzeltmeyi etkinleştirin, RemoveFalsePositive kullanın |
| Zayıf kontrast | Tutarsız tespit | ContrastFilter ve BrightnessFilter uygulayın |
| Yavaş performans | Yüklemelerde yüksek gecikme | ReadingSpeed.Faster kullanın, çoklu iş parçacığını etkinleştirin |
Çoklu Geçiş Görüntü İşleme Uygulaması
Zorlayıcı görüntüler için, katmanlı bir işlem yaklaşımı, kolay görüntülerde performanstan ödün vermeden en iyi sonuçları verir:
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
BarcodeReaderOptions sınıfı, taramanın her yönü üzerinde detaylı kontrol sağlar. AutoRotate ayarlamak, herhangi açıdan yakalanan görüntüleri işlerken görüntü filtreleri bulanık veya düşük kontrastlı barkodların netliğini artırır. Detaylı yapılandırma için, barkod okuyucu ayarları örneği ve PDF özel okuyucu ayarlarına bakın.
PDF'lerle çalışırken, barkodları PDF'lere damgalamayı veya barkodları PDF belgeleri olarak oluşturmayı düşünün. Yüksek hacimli işleme için, asenkron ve çoklu iş parçacığı yetenekleri aracılığıyla çoklu iş parçacıklarını etkinleştirmek, verimi önemli ölçüde artırır.
Tarayıcı Uyumluluğu ve Yedekleme Stratejileri Ekleme
Çeşitli tarayıcıları desteklemek, aşamalı gelişim gerektirir. Android ve masaüstü Chrome, Edge, ve Firefox üzerindeki modern tarayıcılar, kamera erişimi için MediaDevices.getUserMedia() API'sini destekler. iOS'ta Safari, sürüm 11'den itibaren destekler. Eski iş tarayıcıları, IE11 uyumluluk modları ve bazı kilitlenmiş kurumsal ortamlar, kamera erişimini tamamen desteklemeyebilir, bu nedenle yedek dosya yükleme yolunuz her zaman işlevsel kalmalıdır.
Önerilen yaklaşım, çalışma zamanında özellik algılama yapmak ve bu şekilde kamera arayüzünü göstermek ya da gizlemektir, kullanıcı ajanı koklamak yerine. Kamera işlevine sahip bir arabirimle başlayın ve dosya yüklemeye yumuşakça geçin:
@* 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>
Blazor entegrasyonu, bileşen tabanlı bir yaklaşımı tercih ederseniz, minimum yapılandırmayla modern web uygulama desteği sağlar. Dağıtım sorun giderme için, çalışma zamanları kopyalama istisna kılavuzuna danışın.
Sonraki Adımlarınız Neler?
ASP.NET'te barkod taraması, IronBarcode ile basittir. Bir NuGet paketi yükleyin, BarcodeReader.Read() çağırın ve 30'dan fazla formatta güvenilir kodlanmış sonuçlar edinin -- diğer kütüphanelerin zorlandığı gerçek dünyadaki resimler dahil.
Bu temel üzerine inşa etmeye devam etmek için bu kaynakları araştırın:
- Barkod Okuma Eğitimi - tüm tarama senaryoları için detaylı kılavuz
- Barkod Oluşturma - programlı barkodlar ve QR kodları oluşturma
- QR Kod Oluşturucu - QR kod özellikleri ve stil özellikleri
- Görüntü Düzeltme - zorlayıcı görüntülerde tarama doğruluğunu artırma teknikleri
- Asenkron ve Çoklu İş Parçacığı - yüksek trafikli uygulamalar için barkod işleme ölçeklendirme
- Çapraz Platform Uyumluluğu - Windows, Linux, Docker, Azure ve AWS üzerinde dağıtım
- Desteklenen Barkod Formatları - okunabilir ve yazılabilir simgolojilerin tam listesi
- Hata Toleransı Özellikleri - olumsuz koşullar altında güvenilir işlem
- API Referansı - tüm sınıflar ve seçenekler için tam dokümantasyon
- Lisanslama Seçenekleri - üretim dağıtımları için SaaS, OEM ve kurumsal lisanslama
ücretsiz deneme lisansı ile ASP.NET uygulamanızda IronBarcode'u siteniz üzerinde test edin hiçbir kısıtlama olmadan. Deneme sürümü, çok formatlı tespit, görüntü düzeltme ve bu kılavuzda gösterilen REST API modelleri dahil olmak üzere tüm özelliklere tam erişim sağlar - böylece üretim lisansına taahhüt etmeden önce kendi görüntüleriniz üzerindeki performansı değerlendirebilirsiniz. .NET MAUI mobil uygulamaları için, cihaz üzerinde tarama gerektiren .NET MAUI barkod tarayıcı eğitimine bakın, bu eğitim aynı API'nin iOS ve Android hedeflerine genişletir.
Sıkça Sorulan Sorular
Barkod taramanın ASP.NET uygulamalarında birincil kullanımı nedir?
ASP.NET uygulamalarında barkod tarama, esas olarak envanter yönetim sistemlerini geliştirmek, etkinliklerde biletleri işlemek ve kağıt belgeleri dijitalleştirmek için kullanılır, dolayısıyla verimliliği artırır ve hataları azaltır.
IronBarcode, ASP.NET'te barkod taramayı nasıl kolaylaştırır?
IronBarcode, ASP.NET'te barkod taramanın uygulanmasını hızlı ve etkili bir şekilde sağlayan bileşenler sunarak, bu süreci basit hale getirir. Geliştiricilere tarama özelliklerini hızla uygulama olanağı tanır.
Hangi tipte barkodlar IronBarcode ile taranabilir?
IronBarcode, geleneksel doğrusal barkodlar ve modern 2D barkodlar dahil tezahürat geniş bir barkod format yelpazesini taramayı destekler, bu da çeşitli uygulamalarla uyumluluğunu garanti eder.
IronBarcode, belge işleme için barkod taramayı yönetebilir mi?
Evet, IronBarcode belge işleme iş akışları için son derece uygun olup, gömülü barkodları tarayıp kağıt belgeleri dijitalleştirmek ve düzenlemek amacıyla kullanılabilir.
IronBarcode envanter yönetim sistemleri için uygun mu?
IronBarcode, envanter yönetim sistemleri için mükemmel bir tercihtir, çünkü barkodları tarayarak ürünlerin verimli bir şekilde takibini sağlar ve böylece operasyonları düzenlerken hataları en aza indirir.
IronBarcode'u entegre etmek, etkinlik bilet işleme süreçlerini nasıl geliştirir?
IronBarcode'u entegre ederek, bilet barkodlarının hızlı ve doğru bir şekilde taranmasına olanak tanınarak, etkinliklerde sorunsuz bir bilet işleme süreci sağlanır ve giriş yönetimi hızlandırılır.
ASP.NET projelerinde IronBarcode kullanmanın avantajları nelerdir?
ASP.NET projelerinde IronBarcode kullanımı, entegrasyon kolaylığı, birden fazla barkod formatı desteği ve geliştirilmiş uygulama performansı gibi birçok avantaj sunarak, barkod tarama ihtiyaçları için sağlam bir çözüm sağlar.
IronBarcode'un uygulanması için geniş çaplı bir kod bilgisi gerekir mi?
Hayır, IronBarcode, ASP.NET uygulamalarında barkod tarama işlevselliğini minimal kod bilgisiyle uygulamayı kolaylaştıran, geliştirici dostu bir şekilde tasarlanmıştır.
IronBarcode mobil web uygulamalarında kullanılabilir mi?
Evet, IronBarcode, ASP.NET projelerinin çok yönlülüğünü artırarak mobil web uygulamalarına entegre edilebilir ve böylelikle hareket halindeyken barkod tarama sağlanabilir.




