ASP.NET Çizgikodu Tarayıcı: IronBarcode ile Dosya Yükleme ve REST API
ASP.NET'te barkod tarama, IronBarcode ile basit hale gelir: NuGet ile yükleyin, BarcodeReader.Read() çağırın ve tek adımda tür, güven ve konum verileriyle kodlanmış değerler alın -- karmaşık yapılandırma gerekmez.
Barkod tarama, modern web uygulamalarında, stok yönetimi, belge işleme ve bilet doğrulama çalışma akışlarını güçlendiren bir standart gereksinimdir. GS1'e göre, barkodlar dünya genelinde her gün 6 milyardan fazla işlemde kullanılıyor -- bu rakam, herhangi bir iş sisteminin doğru barkod okuma konusundaki kritik önemini vurgulamaktadır. ISO/IEC 15415 standardı 2D barkod sembolleri için kalite ölçütlerini tanımlar, ISO/IEC 15416 standardı ise 1D lineer barkodları kapsar, bunların her ikisini de IronBarcode yerel olarak destekler.
Bu kılavuz size ASP.NET Core uygulamanıza güvenilir barkod taraması eklemeyi gösterir, kurulum, dosya yükleme işlemi, REST API entegrasyonu ve üretim dağıtım desenlerini kapsar. Sonunda, istemci cihazlardan alınan base64 kodlanmış görüntüleri kabul eden bir JSON API uç noktası ile birlikte bir Razor sayfa dosya yükleyicisi tarayıcı için çalışan bir kodunuz olacak.
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ı destekler, bu da çeşitli proje türlerine uyarlanabilirlik sağlar. Enterprise dağıtımları, Azure, AWS Lambda ve Docker konteynerlerinde eşit derecede iyi çalışır. Kütüphanenin makine öğrenimi destekli algılaması, özellikle mobil kameralarla değişken ışık koşullarında çekilmiş fotoğraflar işlendiğinde, otomatik olarak gelişmiş görüntü düzeltme uygulayarak zorlu barkod görüntüleriyle başa çıkar.
NuGet Paket Yöneticisi ile Kurulum
Visual Studio'da Paket Yöneticisi Konsolunu açın ve çalıştırın:
Install-Package BarCode
Install-Package BarCode
Alternatif olarak, .NET CLI'yi kullanın:
dotnet add package BarCode
dotnet add package BarCode
Visual Studio NuGet Paket Yöneticisi arayüzünde 'BarCode' araması yapın ve Yükle'ye tıklayın. Paket tüm bağımlılıkları otomatik olarak yönetir.
Hedef ortamınız için optimize edilmiş platforma özgü NuGet paketlerini kullanmayı düşünebilirsiniz. Kütüphane, farklı dağıtım senaryolarına uygun standart ve BarCode.Slim paketleri sunar. Tam kurulum kılavuzu için IronBarcode kurulum kılavuzuna bakın.
Projenizi Yapılandırma
Kurulduktan sonra, C# dosyalarınıza gerekli using ifadesini ekleyin:
using IronBarCode;
using IronBarCode;
Imports IronBarCode
Bu ithalat, IronBarcode'un tam barkod okuma ve oluşturma yeteneklerine erişiminizi sağlar. Kütüphane, QR Code, Code 128, Code 39, Data Matrix ve PDF417 gibi 30'dan fazla barkod formatını destekler. Kullanım senaryonuzla uyumu doğrulamak için tam desteklenen barkod formatları listesini görüntüleyin.
Kurulum sorunları için NuGet paketleri sorun giderme kılavuzuna veya özel destek için bir mühendislik isteği gönderin.
Doğru Mimari Deseni Seçmek
ASP.NET içinde barkod taramayı uygularken iki ana mimari yaklaşımınız vardır. Bu kalıpları 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 taraflı yaklaşım, görüntü işleme üzerinde maksimum kontrol sağlar ve tüm tarayıcılarda tutarlıdır. Sunucu her görüntüyü işlediğinde, ayrıca temiz bir denetim izi elde edersiniz: taranan her barkod, loglayabileceğiniz, bir veritabanına karşı doğrulayabileceğiniz veya aşağı akış iş akışlarını tetikleyebileceğiniz uygulama katmanınızdan geçer. Bu desen, her taramanın kaydedilmesi gereken sağlık hizmetleri, lojistik ve üretim gibi düzenlemeli endüstriler için özellikle uygundur.
İstemci tarafı kamera yakalama entegrasyonu için modern tarayıcılar, kamera erişimi için MediaDevices API'sini destekler ve bu, IronBarcode'un sunucu tarafı işlemesi ile bir REST API üzerinden birleştirilebilir -- bu kılavuzda daha sonra ayrıntılı olarak ele alınmıştır. Sunucu tarafı işlemesini seçmek, güvenlik modelinizi de basitleştirir: tarayıcıya maruz kalan hassas işleme mantığı yoktur ve tüm doğrulama uygulama sınırınızın arkasında gerçekleşir.
| Aspekt | Müşteri Taraflı Yakalama + Sunucu İşleme | Tam Sunucu Taraflı İşleme |
|---|---|---|
| En uygun | Kamera ile gerçek zamanlı tarama | Toplu işlem, dosya yükleme |
| 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ı | Düşük (cihazda ön işleme yapılmış) | Yüksek (işlenmemiş görüntü yükleme) |
Dosya Yükleme Barkod Taraması Nasıl Uygulanır?
Dosya yükleme taraması, ASP.NET web uygulamalarında en yaygın barkod senaryosudur. Bu desen, faturaları, gönderi etiketlerini veya gömülü barkodlara sahip herhangi bir belgeyi işlemekte kullanılabilir. Daha iyi bir verim için, birden fazla yüklemeyi aynı anda işlemek için asenkron barkod okuma uygulamayı düşünün.
Yükleme Formunu Oluşturma
ASP.NET görünümünüzde duyarlı bir HTML formu 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" özelliği, mobil cihazlarda arka kamerayı etkinleştirir ve kullanıcılara JavaScript olmadan doğal kamera benzeri bir deneyim sunar.
Güvenli Arka Uç İşlemeyi Gerçekleştirme
Denetleyici eylemi, dosya doğrulaması, hafıza akışı işleme ve sonuç formatlama işlemlerini ele alır:
[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, işleme öncesinde dosya türünü doğrular, hafıza akışından barkodları okur ve tüm tespit edilen sonuçları döndürür. IronBarcode, çoklu sayfa TIFF ve GIF dahil çok sayfalı TIFF ve GIF ve PDF belgeleri de dahil olmak üzere çeşitli görüntü formatlarını işler ve böylece format-spesifik işlem kodunu ortadan kaldırır.
Taranan Girdi ve Çıktı Nasıl Görünür

Yukarıdaki örnek, nakliye ve envanter uygulamalarında yaygın bir format olan standart bir Code 128 barkodunu gösterir. Tarama yapıldıktan sonra, sonuç ekranı kodlanan değeri ve güvenilirlik meta verilerini onaylar:

IronBarcode, yüklenen görüntüden tespit edilen her barkod için barkod türünü, çözülmüş değeri, güven doğruluğunu ve konum verilerini döndürür.
Barkod Taraması İçin REST API Nasıl Oluşturulur?
Modern ASP.NET uygulamaları, mobil uygulamalar, tek sayfa uygulamalar veya üçüncü taraf hizmetlerle entegrasyonu sağlamak için genellikle REST API'leri aracılığıyla barkod okuma yeteneklerini ortaya koyar. Bu desen, istemci tarafı kamera yakalamayı sunucu taraflı işlemeyle destekler.
Barkod API'leri İçin Güvenlik Hususları
Denetleyiciyi yazmadan önce, güvenlik katmanını planlayın. Barkod verileri rastgele içerik içerebilir, bu yüzden her zaman girişleri doğrulayın. Tam koruma için IronBarcode güvenlik kılavuzlarını takip edin:
- Giriş doğrulama: Barkod içeriğini kaydetmeden veya işlem yapmadan önce temizleyin
- Hız kısıtlama: API kötüye kullanımını önlemek için ASP.NET Core'un yerleşik hız sınırlama ara yazılımını kullanın
- Kimlik doğrulama: Uç noktaları JWT tokenler veya API anahtarları ile güvence altına alın
- HTTPS zorunluluğu: Tüm barkod API trafiği TLS üzerinden geçmelidir
- CORS politikası: Tarama uç noktanızı arayabilen kökenleri kısıtlayın
- Lisans anahtar yönetimi: Lisans anahtarlarını doğru şekilde uygulayın ve prodüksiyon için web.config'de ayarlayın
Üretim API Denetleyicisini 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ü iletmek için standart format olan base64 kodlanmış görüntüleri kabul eder. Yanıt, barkod türünü, çözülmüş değeri, güven puanı ve konumunu içerir. Büyük hacimli senaryolar için, toplu barkod işlemi ve okuma hızı optimizasyonu seçeneklerini inceleyin.
API Birden Fazla Barkodu Nasıl İşler?

IronBarcode, bir aramada tek bir görüntüde birden fazla barkodu işleyerek bir sonuç dizisi döndürür. Yanıttaki her giriş, istemci uygulamasının ekranda tespit edilen barkodları vurgulamasını sağlayan konum verilerini içerir.

Yapısal JSON yanıtı, istemci uygulamalarının barkod sonuçlarını işlemesi ve göstermesi için gerekli olan her şeyi sağlar, böylece ek aramalara gerek kalmaz.
Zorlayıcı Barkod Görüntüleri Nasıl İşlenir?
Gerçek dünya barkod taraması, çoğu zaman perspektif açılarından çekilmiş fotoğrafları, düşük ışıkta çekilmiş ya da kısmen zarar görmüş barkodları içerir. IronBarcode, bu senaryoları gelişmiş görüntü işleme yetenekleri ve makine öğrenimi güvenilirlik eşikleri ile ele alır.
Ortak Tarama Sorunlarını Tanılama
Düzeltmeleri uygulamadan önce, sorununuzun hangi kategoriye düştüğünü belirleyin. Üretimdeki ç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önüş, eğiklik, perspektif bozulması), hasar sorunları (yırtık etiketler, bulaşmış mürekkep), ortam sorunları (parlama, gölgeler, tutarsız aydınlatma) ve okuyucunun var olmayan bir barkodu bulduğu yanlış pozitif tespit.
Kategoriyi bilmek, her görüntüye gereksiz işlem 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şlamanız, vakaların çoğunu kapsar. İlk geçiş sonuç vermediğinde yalnızca ExtremeDetail'e yükseltin.
Aşağıdaki kodda çok geçişli yaklaşım, bu kademeli stratejiyi uygular. Hızlı birinci geçiş, tipik görüntüleri hızla işler, ortak durum için medyan bekleme süresini düşük tutar. Detaylı ikinci geçiş yalnızca ilk geçiş başarısız olduğunda tetiklenir ve böylece ekstra işlem maliyetini yalnızca gerçekten ihtiyaç duyulduğunda ödemenizi sağlar. Bu desen, ASP.NET uç noktanızı normal yük altında duyarlı tutarken, zorlu uç durumları güvenilir bir şekilde ele alır.
| Sorun | Belirti | Çözüm |
|---|---|---|
| Bulanık görüntü | Düşük güvenilirlik puanları, kaçan okumalar | SharpenFilter uygulayın, ExtremeDetail hızını artırın |
| Dönmüş barkod | Barkod hiç tespit edilmedi | AutoRotate = true etkinleştirin |
| Zarar görmüş barkod | Kısmi okumalar, yanlış değerler | Hata düzeltmeyi etkinleştirin, RemoveFalsePositive kullanın |
| Zayıf kontrast | Tutarsız algılama | ContrastFilter ve BrightnessFilter uygulayın |
| Performans çok yavaş | Yüklemelerde yüksek gecikme | ReadingSpeed.Faster kullanın, çoklu iş parçacığı etkinleştirin |
Çoklu Geçişli Görüntü İşleme Uygulama
Zorlayıcı görüntüler için kademeli bir işleme 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 ince kontrol sağlar. AutoRotate ayarı, herhangi bir açıda yakalanan görüntüleri işlerken görüntü filtreleri, bulanık veya düşük kontrastlı barkodlar için netliği artırır. Ayrıntılı yapılandırma için barkod okuyucu ayarları örneği ve PDF'e özel okuyucu ayarlarına bakın.
PDF'lerle çalışırken, PDF'lere barkod damgalamayı veya barkodları PDF belgeleri olarak oluşturmayı düşünün. Yüksek hacimli işlemeler için eşzamanlı ve çoklu iş parçacığı yeteneklerini 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ştirme gerektirir. Android ve masaüstü Chrome, Edge ve Firefox'ta modern tarayıcılar, kamera erişimi için MediaDevices.getUserMedia() API'sini destekler. iOS üzerindeki Safari, 11 sürümünden itibaren bunu destekler. Daha eski kurumsal tarayıcılar, IE11 uyumluluk modları ve belirli korumalı kurumsal ortamlar kamera erişimini hiç desteklemeyebilir, bu yüzden yedek dosya yükleme yolunuz her zaman çalışır durumda kalmalıdır.
Önerilen yaklaşım, kullanıcı ajanı koklama yerine çalışma zamanında özellik algılaması kullanmak ve ardından kamera arayüzünü gösterip gizlemektir. Kamera destekli arayüzle başlayın ve dosya yüklemeye düzgün bir şekilde yedekleyin:
@* 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>
Bileşen tabanlı bir yaklaşımı tercih ediyorsanız, Blazor entegrasyonu minimum yapılandırma ile modern web uygulama desteği sağlar. Dağıtım sorunlarını gidermek için çalışma zamanları kopyalama istisna kılavuzuna başvurun.
Sıradaki Adımlarınız Neler?
ASP.NET'te barkod tarama IronBarcode ile basittir. Bir NuGet paketi yüklersiniz, BarcodeReader.Read() çağırırsınız ve diğer kütüphanelerin zorlandığı gerçek dünya görüntüler dahil olmak üzere 30'dan fazla formatta güvenilir kodlanmış sonuçlar alırsınız.
Bu temeli geliştirmeye devam etmek için şu kaynakları keşfedin:
- Barkod Okuma Eğitimi -- tüm tarama senaryoları için detaylı kılavuz
- Barkod Oluşturma -- programatik olarak barkodlar ve QR kodları oluşturun
- QR Kod Oluşturucu -- QR koda özel özellikler ve stillendirme
- Görüntü Düzeltme -- zor görüntülerde tarama doğruluğunu arttırma teknikleri
- Eşzamanlılık ve Çoklu İş Parçacığı -- yüksek trafikli uygulamalar için barkod işlemesini ölçeklendirin
- Çapraz Platform Uyumluluğu -- Windows, Linux, Docker, Azure ve AWS üzerinde dağıtım
- Desteklenen Barkod Formatları -- okunabilen ve yazılabilen sembolojilerin tam listesi
- Hata Toleransı Özellikleri -- zorlu koşullarda güvenilir operasyon
- API Referansi -- tüm sınıflar ve seçenekler için eksiksiz 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 sınırlama olmadan test edin. Deneme, bu kılavuzda gösterilen çok formatlı algılama, görüntü düzeltme ve REST API kalıplarını içeren tüm özelliklere tam erişimi içerir -- böylece üretim lisansına bağlı kalmadan önce kendi görüntülerinizde performansı değerlendirebilirsiniz. .NET MAUI mobil uygulamaları için cihaz üzerinde tarama gerekli olduğunda, aynı API'yi iOS ve Android hedeflerine genişleten .NET MAUI barkod tarayıcı eğitimine bakın.
Sıkça Sorulan Sorular
Barkod taramanin ASP.NET uygulamalarinda birincil kullanımi nedir?
Barkod tarama, ASP.NET uygulamalarinda birincil olarak envanter yönetim sistemlerini iyilestirmek, etkinliklerde biletleri işlemek ve kagit belgeleri sayisal hale getirmek için kullanilir. Bu şekilde verimliligi artirir ve hatalari azaltir.
IronBarcode, ASP.NET'te barkod taramayi nasil saglar?
IronBarcode, ASP.NET'te barkod taramayi, web uygulamalarina kolayca entegre edilebilen guvenilir ve verimli bileşenler saglayarak basitlestirir ve geliştiricilerin tarama özelliklerini hızlı bir şekilde uygulamalarina imkan tanir.
Hangi tur barkodlar IronBarcode ile taranabilir?
IronBarcode, geleneksel lineer barkodlar ve modern 2D barkodlar dahil genis bir barkod formatını taramayı destekler ve çeşitli uygulamalarla uyumlulugunu saglar.
IronBarcode, belge işleme için barkod tarama yapabilir mi?
Evet, IronBarcode, belge işleme calisma akislari için uygundur ve icindeki barkodlari tarayarak kagit belgeleri sayisal hale getirmek ve düzenlemek için kullanilabilir.
IronBarcode, envanter yönetim sistemleri için uygun mudur?
IronBarcode, envanter yönetim sistemleri için mükemmel bir seçenektir, cunku barkodlari tarayarak ürünlerin etkin bir şekilde izlenmesini saglar ve bu suretle işlemleri düzenler ve hatalari minimuma indirir.
IronBarcode'yi entegre etmek etkinlik bileti işlemlerini nasil iyilestirir?
IronBarcode entegrasyonu sayesinde, etkinlik bileti işlemleri kusursuz hale gelir, cunku bilet barkodlarinin hizli bir şekilde taranmasina izin verir ve etkinliklerde hizli ve doğru giris yönetimini kolaylastırır.
ASP.NET projelerinde IronBarcode kullanmanin avantajlari nelerdir?
IronBarcode'nin ASP.NET projelerinde kullanilmasi, entegrasyonun kolayligi, birden fazla barkod formatina destek ve uygulama performansini iyilestirme gibi bircok avantaj sunar ve barkod tarama ihtiyaçlari için güçlü bir çözüm saglar.
IronBarcode'yi uygulamak için genis kod bilgisi gerekli midir?
Hayir, IronBarcode, geliştirici dostu olacak şekilde tasarlanmistir ve bu sayede ASP.NET uygulamalarinda barkod tarama fonksiyonlarini minimal kod bilgisi ile uygulamayi kolaylastirir.
IronBarcode, mobil web uygulamalari için kullanilabilir mi?
Evet, IronBarcode, mobil web uygulamalarina entegre edilebilir ve seyahat halindeyken barkod taramayi mumkun kilarak ASP.NET projelerinin çok yonlulugunu artirir.




