Altbilgi içeriğine atla
IRONBARCODE KULLANARAK
C# dilinde ASP .NET Barkod Tarayıcı Nasıl Yapılır | IronBarcode

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

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

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.

İstemci Tarafı vs. Sunucu Tarafı Barkod Tarama Karşılaştırması
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>
$vbLabelText   $csharpLabel

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

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ü

Makine tarafından okunabilir çubuklar ve altında insan tarafından okunabilir metinle 'https://ironsoftware.com/csharp/barcode/' URL'si olarak kodlanmış Code 128 barkod, ASP.NET barkod okuyucu uygulamalarında doğru tarama için

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:

ASP.NET Core web uygulaması arayüzü, dosya yükleme formu ile birlikte başarılı barkod tarama sonuçlarını gösteriyor, çözülen Code128 barkod değeri ve güven puanı meta verileri

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

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?

Üç farklı barkod formatı A B C olarak etiketlenmiş QR Kod, Code128 ve DataMatrix sembolojileri, IronBarcode'un üretim ortamlarında eşzamanlı işlediği sembolojiler

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.

Tarayıcı geliştirici araçları ağ sekmesi, tam meta veri ile algılanan üç barkod içeren başarılı JSON API yanıtını gösteriyor, tür değeri güven ve konum koordinatları dahil

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.

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

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

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:

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

Curtis Chau
Teknik Yazar

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapı...

Daha Fazla Oku

Iron Destek Ekibi

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