Altbilgi içeriğine atla
IRONBARCODE KULLANARAK

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
SHELL

Alternatif olarak, .NET CLI'yi kullanın:

dotnet add package BarCode
dotnet add package BarCode
SHELL

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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.

Müşteri Taraflı ve Sunucu Taraflı Barkod Taraması Ticaretleri
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>
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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

 ASP.NET barkod okuyucu uygulamalarında hassas tarama için makine tarafından okunabilir çubuklarla birlikte aşağıda insan tarafından okunabilir metin görüntüleyen 'https://ironsoftware.com/csharp/barcode/' URL'sine sahip Code 128 barkod kodlama

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:

 ASP.NET Core web uygulama arayüzü, kodlanmış Code128 barkod değeri ve güven puanı meta verileri gösteren dosya yükleme formu ile başarılı barkod tarama sonuçları görüntülüyor

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
$vbLabelText   $csharpLabel

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'un üretim ortamlarında eşzamanlı olarak işlediği QR Code, Code128 ve DataMatrix sembolojilerini gösteren A B C etiketli üç farklı barkod formatı

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.

 Tarayıcı geliştirici araçlarının ağ sekmesi, tür, değer, güven ve konum koordinatları dahil olmak üzere tam meta verileri içeren üç tespit edilmiş barkodun dizisini içeren başarılı bir JSON API yanıtını gösteriyor

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.

Ortak Barkod Tarama Sorunları ve Çözümleri
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
$vbLabelText   $csharpLabel

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>
$vbLabelText   $csharpLabel

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:

ü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.

Jordi Bardia
Yazılım Mühendisi
Jordi Python, C# ve C++ konularında en yetkin, Iron Software'deki yeteneklerini kullanmadığı zamanlarda; oyun programlıyor. Ürün testi, ürün geliştirme ve araştırma sorumluluklarını paylaşan Jordi, sürekli ürün gelişimine büyük değer katıyor. Çeşitli deneyimleri onu ...
Daha Fazlasını Oku

Iron Destek Ekibi

Haftanın 5 günü, 24 saat çevrimiçiyiz.
Sohbet
E-posta
Beni Ara