Przejdź do treści stopki
FILMY

Jak odczytywać BarCodes ze strumieni w języku C#

Migracja z SDK barKoder do IronBarcode

Barkoder dostarcza oficjalne pakiety .NET — Plugin.Maui.Barkoder i Barkoder.Xamarin — jednak oba są ściśle mobilnymi komponentami do skanowania kamerą. Jeśli oceniałeś barKoder dla jego algorytmu MatrixSight, trybu DeBlur, wykrywania wielu kodów kreskowych lub wsparcia DPM, a następnie odkryłeś, że potrzebujesz wejścia plikowego, przetwarzania PDF, wdrożenia serwerowego lub generowania kodów kreskowych, żaden z nich nie jest dostępny w barKoder na .NET. Niniejszy przewodnik pokazuje, jak IronBarcode pokrywa każdy z tych wymagań, dostarczając działający kod dla każdego scenariusza.

Dlaczego migrować z SDK barKoder

Zespoły, które przechodzą z oceny barKoder na IronBarcode, konsekwentnie zgłaszają te same źródła motywacji:

Tylko powierzchnia aparatu mobilnego: Obszar .NET Barkoder to Plugin.Maui.Barkoder (v1.6.8, marzec 2026) i Barkoder.Xamarin (v1.3.0). Oba obejmują natywne SDK dla iOS / Androida i udostępniają kontrolkę kamerą BarkoderView. Brak jest uniwersalnej biblioteki Barkoder.NET, brak wsparcia dla ASP.NET Core, nie obsługują także celów konsolowych / roboczych / desktopowych oraz serwerów Linux.

Architektura tylko do odczytu: Barkoder to zestaw SDK przeznaczony wyłącznie do skanowania. Jeśli Twoja aplikacja wymaga generowania kodów kreskowych — drukowania etykiet wysyłkowych, tworzenia kodów QR na opakowaniach, osadzania kodów w dokumentach — Barkoder nie oferuje żadnych rozwiązań. Zespoły, które w trakcie projektu odkrywają potrzebę generowania kodu, potrzebują biblioteki, która obejmuje obie strony procesu.

Brak przetwarzania plików PDF: W aplikacjach Enterprise .NET BarCodes często pojawiają się w dokumentach PDF — fakturach, listach przewozowych, dokumentacji medycznej, dokumentach dotyczących zgodności. Barkoder nie ma pojęcia o tym przepływie pracy. Jest przeznaczony do obsługi obrazu z kamery na żywo na urządzeniu mobilnym i nie obsługuje plików PDF.

Brak wdrażania po stronie serwera: Model przetwarzania Barkoder opiera się na skanowaniu mobilnym na urządzeniu. Nie może działać w ASP.NET Core, Azure Functions, kontenerach Docker ani AWS Lambda. Zespoły tworzące serwerowe interfejsy API BarCode, potoki przetwarzania dokumentów lub funkcje w chmurze nie mają możliwości wdrożenia Barkoder.

Brak plikowego / strumieniowego wejścia: Nawet wewnątrz aplikacji MAUI, BarkoderView przetwarza jedynie klatki z kamery na żywo. Brak opcji ścieżki do pliku, tablicy bajtów lub przeciążenia Stream, więc przetwarzanie przesłanego obrazu lub zdjęcia z galerii wymaga innej biblioteki.

Podstawowa granica

Powierzchnia MAUI Barkodera jest związana z kamerą. Deweloper .NET używający Plugin.Maui.Barkoder pisze kod wyglądający następująco:

// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.SetFlashEnabled(false);
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
            Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
    }
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.SetFlashEnabled(false);
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
            Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
    }
}
Imports Barkoder.Maui

Public Partial Class ScanPage
    Inherits ContentPage
    Implements IBarkoderDelegate

    Public Sub New()
        InitializeComponent()
        BarkoderView.SetFlashEnabled(False)
        BarkoderView.StartScanning(Me)
    End Sub

    Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
        For Each r In result
            Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
        Next
    End Sub
End Class
$vbLabelText   $csharpLabel

IronBarcode zapewnia API pliku/strumienia/PDF dla tych samych danych:

// dotnet add package BarCode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

Dim results = BarcodeReader.Read("scanned-label.png", options)
For Each result In results
    Console.WriteLine($"Format: {result.Format} | Value: {result.Value}")
Next
$vbLabelText   $csharpLabel

Porównanie funkcji: SDK IronBarcode vs barKoder

Funkcja SDK barKoder IronBarcode
.NET / C# API MAUI / Xamarin UI kamery tylko Pełna powierzchnia .NET
Pakiet NuGet Plugin.Maui.Barkoder, Barkoder.Xamarin BarCode
Odzyskiwanie uszkodzonych kodów BarCode MatrixSight / DeBlur ReadingSpeed.ExtremeDetail + ML
Wykrywanie wielu BarCodes Tak ExpectMultipleBarcodes = true
DataMatrix / DPM Tak (tylko do odczytu) Tak — przeczytaj i wygeneruj
Kod QR Tak (tylko do odczytu) Tak — przeczytaj i wygeneruj
PDF417 Tak Tak
Aztec Tak Tak
Code128, Code39, EAN Tak Tak — ponad 50 formatów
Generowanie kodów kreskowych None Pełna wersja — wszystkie formaty
Przetwarzanie plików PDF None Język ojczysty
Wejście pliku/strumienia/tablicy bajtów Brak — tylko ramki kamery Tak
ASP.NET Core None Pełna
Docker / Linux None Pełna
Azure Functions None Pełna
AWS Lambda None Pełna
Tryb offline / Air-Gapped Na urządzeniu W pełni zlokalizowane
Async / Await Oparte na wywołaniach zwrotnych Pełna
Wstrzykiwanie zależności None Pełna DI .NET
iOS poprzez MAUI Plugin.Maui.Barkoder (interfejs użytkownika kamery) Programatyczne (plik/strumień)
Android poprzez MAUI Plugin.Maui.Barkoder (interfejs użytkownika kamery) Programatyczne (plik/strumień)
Ceny Roczna subskrypcja Od 749 USD (licencja wieczysta)

Szybki start: migracja z SDK barKoder do IronBarcode

Krok 1: Zastąp pakiet NuGet

Zainstaluj IronBarcode:

dotnet add package BarCode

Jeśli twój projekt używa Plugin.Maui.Barkoder lub Barkoder.Xamarin tylko dla przepływów bez kamery (lub przechodzisz całkowicie na przetwarzanie plików / PDF), usuń go:

dotnet remove package Plugin.Maui.Barkoder
dotnet remove package Plugin.Maui.Barkoder
SHELL

Jeśli aplikacja nadal potrzebuje interfejsu użytkownika kamery na żywo, zachowaj Plugin.Maui.Barkoder i dodaj IronBarcode w celu pracy z plikami / PDF / generowaniem.

Krok 2: Aktualizacja przestrzeni nazw

Usuń przestrzeń nazw barKoder tam, gdzie nie jest już potrzebna, i dodaj przestrzeń nazw IronBarcode:

// Remove (if no longer needed)
// using Barkoder.Maui;

// Add
using IronBarCode;
// Remove (if no longer needed)
// using Barkoder.Maui;

// Add
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

Krok 3: Inicjalizacja licencji

Dodaj inicjalizację licencji podczas uruchamiania aplikacji — w Program.cs dla ASP.NET Core, lub przed każdym działaniem na kodach kreskowych w aplikacjach konsolowych lub desktopowych:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

Przykłady migracji kodu

Odczytywanie BarCodes z obrazów

Podstawowy scenariusz odczytu mapuje się z ramek kamery barKoder na API IronBarcode pliku/strumienia/tablicy bajtów.

Podejście barKoder MAUI:

// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
        {
            Console.WriteLine($"Barcode: {r.TextualData}");
            Console.WriteLine($"Type: {r.BarcodeTypeName}");
        }
    }
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;

public partial class ScanPage : ContentPage, IBarkoderDelegate
{
    public ScanPage()
    {
        InitializeComponent();
        BarkoderView.StartScanning(this);
    }

    public void DidFinishScanning(BarcodeResult[] result)
    {
        foreach (var r in result)
        {
            Console.WriteLine($"Barcode: {r.TextualData}");
            Console.WriteLine($"Type: {r.BarcodeTypeName}");
        }
    }
}
Imports Barkoder.Maui

Public Partial Class ScanPage
    Inherits ContentPage
    Implements IBarkoderDelegate

    Public Sub New()
        InitializeComponent()
        BarkoderView.StartScanning(Me)
    End Sub

    Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
        For Each r In result
            Console.WriteLine($"Barcode: {r.TextualData}")
            Console.WriteLine($"Type: {r.BarcodeTypeName}")
        Next
    End Sub
End Class
$vbLabelText   $csharpLabel

Podejście IronBarcode:

// dotnet add package BarCode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
    Console.WriteLine($"Format: {result.Format}");
    Console.WriteLine($"Value: {result.Value}");
}
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim results = BarcodeReader.Read("scan.png")
For Each result In results
    Console.WriteLine($"Format: {result.Format}")
    Console.WriteLine($"Value: {result.Value}")
Next
$vbLabelText   $csharpLabel

Funkcja BarcodeReader.Read()IronBarcode automatycznie rozpoznaje format kodu kreskowego bez konieczności wcześniejszego jego określania. To samo wywołanie działa w przypadku obrazów przechwyconych przez urządzenie mobilne i przesłanych na serwer, obrazów załadowanych z systemu plików lub obrazów otrzymanych jako tablice bajtów ze strumienia. Aby uzyskać wyczerpujące informacje na temat odczytu, zapoznaj się z przewodnikiem odczytu IronBarcode.

Odzyskiwanie uszkodzonych BarCodes (odpowiednik trybu DeBlur)

Tryb DeBlur aplikacji Barkoder jest jedną z jej najczęściej wymienianych funkcji.IronBarcode zapewnia ekwiwalent dla wejścia plikowego przez ReadingSpeed.ExtremeDetail.

Podejście barKoder MAUI:

// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;

BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Recovered: {r.TextualData}");
}
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;

BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Recovered: {r.TextualData}");
}
Imports Barkoder.Maui

' Live camera scanning with DeBlur enabled via configuration
BarkoderView.SetEnabledBarcodeTypes() ' configure formats
BarkoderView.StartScanning(Me)

Public Sub DidFinishScanning(result As BarcodeResult())
    For Each r In result
        Console.WriteLine($"Recovered: {r.TextualData}")
    Next
End Sub
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("worn-shipping-label.png", options);

if (results.Any())
{
    Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
    Console.WriteLine("Could not decode — image quality too low");
}
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("worn-shipping-label.png", options);

if (results.Any())
{
    Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
    Console.WriteLine("Could not decode — image quality too low");
}
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

Dim results = BarcodeReader.Read("worn-shipping-label.png", options)

If results.Any() Then
    Console.WriteLine($"Recovered barcode: {results.First().Value}")
Else
    Console.WriteLine("Could not decode — image quality too low")
End If
$vbLabelText   $csharpLabel

ReadingSpeed.ExtremeDetail uruchamia opartą na ML linię analizy obrazu z wieloma porządkami, stosując korekcję kontrastu, wyostrzanie, korekcję rotacji i odzyskiwanie uszkodzeń przed próbą dekodowania. Dla przepływów wsadowych używaj ReadingSpeed.Balanced jako domyślnego i przejdź na ExtremeDetail tylko dla obrazów, których Balanced nie uda się dekodować.

Wykrywanie wielu BarCodes

Skanowanie wielu kodów kreskowych na klatkę przez Barkoder odpowiada opcji ExpectMultipleBarcodes w IronBarcode, która działa zarówno na obrazach, jak i na plikach PDF.

Podejście barKoder MAUI:

// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
Imports Barkoder.Maui

BarkoderView.StartScanning(Me)

Public Sub DidFinishScanning(result As BarcodeResult())
    For Each r In result
        Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
    Next
End Sub
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
};

// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);

foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
};

// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);

foreach (var barcode in results)
{
    Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}

' Works identically on images and PDFs
Dim results = BarcodeReader.Read("shipping-manifest.pdf", options)

For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Jest to pojedyncze wywołanie metody. Brak wyodrębniania stron, brak wielokrotnych żądań, brak obciążenia związanego z przetwarzaniem poszczególnych BarCode'ów. Plik PDF jest odczytywany natywnie.

Generowanie i odczytywanie kodów DataMatrix

Barkoder odczytuje kody DataMatrix, ale nie może ich generować.IronBarcode obejmuje obie strony procesu, co jest powszechnym wymogiem w przemysłowych systemach śledzenia.

Podejście barKoder MAUI:

// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Part ID: {r.TextualData}");
}
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;

BarkoderView.StartScanning(this);

public void DidFinishScanning(BarcodeResult[] result)
{
    foreach (var r in result)
        Console.WriteLine($"Part ID: {r.TextualData}");
}
Imports Barkoder.Maui

' Camera-only DataMatrix scanning; no generation available
BarkoderView.StartScanning(Me)

Public Sub DidFinishScanning(result As BarcodeResult())
    For Each r In result
        Console.WriteLine($"Part ID: {r.TextualData}")
    Next
End Sub
$vbLabelText   $csharpLabel

Podejście IronBarcode:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
    .SaveAsPng("part-label.png");

// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Part Serial: {result.Value}");
    Console.WriteLine($"Barcode Type: {result.Format}");
}
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
    .SaveAsPng("part-label.png");

// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
    Console.WriteLine($"Part Serial: {result.Value}");
    Console.WriteLine($"Barcode Type: {result.Format}");
}
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"

' Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("part-label.png")

' Read DataMatrix from a scanned industrial part image
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

Dim results = BarcodeReader.Read("etched-part-photo.png", options)
For Each result In results
    Console.WriteLine($"Part Serial: {result.Value}")
    Console.WriteLine($"Barcode Type: {result.Format}")
Next
$vbLabelText   $csharpLabel

Pełna lista obsługiwanych formatów kodowania i opcji generowania znajduje się w dokumentacji dotyczącej generowania BarCode.

Generowanie kodów QR z brandingiem

Barkoder nie generuje barcode'ów.IronBarcode generuje kody QR z osadzonymi logo, co jest powszechnym wymaganiem w procesach marketingowych, pakowania i identyfikacji produktów.

Podejście barKoder MAUI:

Not available — Plugin.Maui.Barkoder is a reader-only SDK with no
generation API on any platform.

Podejście IronBarcode:

using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
    .AddBrandLogo("company-logo.png")
    .SaveAsPng("branded-qr.png");
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
    .AddBrandLogo("company-logo.png")
    .SaveAsPng("branded-qr.png");
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"

' QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500) _
    .AddBrandLogo("company-logo.png") _
    .SaveAsPng("branded-qr.png")
$vbLabelText   $csharpLabel

Punkt końcowy API BarCode ASP.NET Core

Barkoder nie posiada modelu wdrożenia po stronie serwera. Odpowiednik mobilnego punktu końcowego do skanowania i przesyłania danych — odbierającego obraz z dowolnego klienta i zwracającego dane BARCODE — wymaga biblioteki .NET.

Podejście barKoder:

Not available — Plugin.Maui.Barkoder runs only inside a MAUI app head
against a live camera. There is no ASP.NET Core integration and no
server-side execution model.

Podejście IronBarcode:

// In Program.cs
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

app.MapPost("/api/scan", async (IFormFile file) =>
{
    using var stream = file.OpenReadStream();
    var imageBytes = new byte[stream.Length];
    await stream.ReadAsync(imageBytes);

    var options = new BarcodeReaderOptions
    {
        Speed = ReadingSpeed.Balanced,
        ExpectMultipleBarcodes = true,
    };

    var results = BarcodeReader.Read(imageBytes, options);

    return Results.Ok(results.Select(r => new
    {
        Value = r.Value,
        Format = r.Format.ToString(),
    }));
});
// In Program.cs
using IronBarCode;

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

app.MapPost("/api/scan", async (IFormFile file) =>
{
    using var stream = file.OpenReadStream();
    var imageBytes = new byte[stream.Length];
    await stream.ReadAsync(imageBytes);

    var options = new BarcodeReaderOptions
    {
        Speed = ReadingSpeed.Balanced,
        ExpectMultipleBarcodes = true,
    };

    var results = BarcodeReader.Read(imageBytes, options);

    return Results.Ok(results.Select(r => new
    {
        Value = r.Value,
        Format = r.Format.ToString(),
    }));
});
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"

app.MapPost("/api/scan", Async Function(file As IFormFile) As Task(Of IResult)
    Using stream = file.OpenReadStream()
        Dim imageBytes(CInt(stream.Length) - 1) As Byte
        Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)

        Dim options As New BarcodeReaderOptions With {
            .Speed = ReadingSpeed.Balanced,
            .ExpectMultipleBarcodes = True
        }

        Dim results = BarcodeReader.Read(imageBytes, options)

        Return Results.Ok(results.Select(Function(r) New With {
            .Value = r.Value,
            .Format = r.Format.ToString()
        }))
    End Using
End Function)
$vbLabelText   $csharpLabel

Odnośnik mapowania API SDK barKoder do IronBarcode

Ta tabela mapuje powierzchnię MAUI/Xamarin Barkodera na odpowiednie wywołanie IronBarcode:

API barKoder Odpowiednik IronBarcode
Ustawienie licencji poprzez portal/kokpit barKoder IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Konfiguracja DeBlur na BarkoderView Speed = ReadingSpeed.ExtremeDetail
Konfiguracja wielokrotnego skanowania na BarkoderView ExpectMultipleBarcodes = true
SetEnabledBarcodeTypes(...) BarcodeEncoding.<Format> (automatycznie wykrywana podczas odczytu)
BarkoderView.StartScanning(IBarkoderDelegate) BarcodeReader.Read("image.png") — synchroniczne
BarcodeResult.TextualData result.Value
BarcodeResult.BarcodeTypeName result.Format
MatrixSight – odzyskiwanie danych po awarii ReadingSpeed.ExtremeDetail z wstępną obróbką ML
Wejście z ramki kamery na żywo Ścieżka do pliku / Stream / wejście byte[]
Przetwarzanie na urządzeniu W pełni lokalne — bez połączeń sieciowych
Brak obsługi generacji BarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode()
Brak obsługi plików PDF BarcodeReader.Read("document.pdf") — natywne
Brak wdrożenia na serwerze Działa w ASP.NET Core, Docker, Azure Functions, Lambda
Brak indeksu strony (nie dotyczy) result.PageNumber — dostępne przy odczycie PDF

Typowe problemy związane z migracją i ich rozwiązania

Kwestia 1: Nazwy pakietów NuGet

barKoder SDK: Oficjalne pakiety .NET to Plugin.Maui.Barkoder i Barkoder.Xamarin. Żaden z nich nie obejmuje scenariuszy niemożliwających użycia na mobile.

Rozwiązanie: Zainstaluj IronBarcode:

dotnet add package BarCode

Jeśli Plugin.Maui.Barkoder nie jest już potrzebny (przechodzisz całkowicie na przetwarzanie plików / PDF / serwerowe), usuń go:

dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
SHELL

Kwestia 2: Wejście z ramki kamery kontra wejście plikowe

SDK barKoder: Wszystkie wejścia są dostarczane jako ramki kamery na żywo — ciągła transmisja wideo przetwarzana na urządzeniu. Nie ma trybu wejścia ścieżki pliku.

Rozwiązanie:IronBarcode akceptuje pliki, strumienie, tablice bajtów oraz obiekty System.Drawing.Image. W przypadku obrazów przesłanych z klienta mobilnego należy odczytać strumień żądania bezpośrednio:

using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
Imports System.IO

Using stream = file.OpenReadStream()
    Dim imageBytes = New Byte(stream.Length - 1) {}
    Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
    Dim results = BarcodeReader.Read(imageBytes, options)
End Using
$vbLabelText   $csharpLabel

Problem 3: API oparte na wywołaniach zwrotnych a wyniki synchroniczne

barKoder SDK: BarkoderView.StartScanning(IBarkoderDelegate) używa wzorca delegata / wywołania zwrotnego — DidFinishScanning(BarcodeResult[]) wywoływane jest asynchronicznie, gdy kody kreskowe są wykrywane w strumieniu z kamery.

Rozwiązanie: BarcodeReader.Read()IronBarcode jest synchroniczne i zwraca bezpośrednio IEnumerable<BarcodeResult>. W kontekstach ASP.NET Core, gdzie wymagane jest użycie async, owiń w Task.Run():

var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
$vbLabelText   $csharpLabel

Problem 4: Konfiguracja trybu DeBlur

barKoder SDK: DeBlur jest włączony w konfiguracji BarkoderView przed rozpoczęciem skanowania i ma zastosowanie do wszystkich kolejnych skanów.

Rozwiązanie: W IronBarcode, ekwiwalentem jest ReadingSpeed.ExtremeDetail ustawione dla każdego odczytu przez BarcodeReaderOptions. Utwórz obiekt opcji raz i wykorzystuj go ponownie:

var deepOptions = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
var deepOptions = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.ExtremeDetail,
    ExpectMultipleBarcodes = false,
};

// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
Imports System

Dim deepOptions As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.ExtremeDetail,
    .ExpectMultipleBarcodes = False
}

' Reuse across multiple reads
Dim results = BarcodeReader.Read("image.png", deepOptions)
$vbLabelText   $csharpLabel

Problem 5: Brak możliwości generowania

SDK barKoder: Barkoder jest trybem tylko do odczytu. Nie ma API do generowania kodów kreskowych ani kodów QR.

Rozwiązanie:IronBarcode obsługuje zarówno odczyt, jak i generowanie. Używaj BarcodeWriter dla standardowych formatów i QRCodeWriter dla kodów QR:

// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");

// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
    .SaveAsPng("product-qr.png");

// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
    .ToPngBinaryData();
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");

// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
    .SaveAsPng("product-qr.png");

// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports System

' Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping-label.png")

' QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500) _
    .SaveAsPng("product-qr.png")

' Get as bytes for embedding in API response or PDF
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

Lista kontrolna migracji SDK barKoder

Zadania przed migracją

Przeglądnij swoją bazę kodu pod kątem referencji barKoder:

grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
SHELL

Opisz obecnie wdrożone lub planowane scenariusze wykorzystania BarCode'ów:

  • Jakie formaty BARCODE-ów muszą być odczytywane (Code128, DataMatrix, QR, PDF417 itp.)
  • Czy wymagane jest odzyskiwanie uszkodzonego kodu kreskowego (ReadingSpeed.ExtremeDetail)
  • Czy wymagane jest wykrywanie wielu kodów kreskowych (ExpectMultipleBarcodes = true)
  • Czy wymagane jest generowanie kodów kreskowych (BarcodeWriter, QRCodeWriter)
  • Czy wymagane jest przetwarzanie PDF (BarcodeReader.Read("doc.pdf"))
  • Środowiska docelowe (.NET Core, Azure Functions, Docker, Lambda, komputery stacjonarne, MAUI)

Zadania związane z aktualizacją kodu

  1. Usuń Plugin.Maui.Barkoder lub Barkoder.Xamarin z .csproj tam, gdzie nie jest już potrzebne
  2. Zainstaluj pakiet NuGet BarCode
  3. Usuń using Barkoder.Maui; (lub odpowiednik Xamarin) tam, gdzie nie jest już potrzebne
  4. Dodaj using IronBarCode; do wszystkich plików przetwarzania kodów kreskowych
  5. Dodaj IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; przy uruchamianiu aplikacji
  6. Zastąp wywołania zwrotne BarkoderView.StartScanning / DidFinishScanning z BarcodeReader.Read(filePath, options)
  7. Mapuj BarcodeResult.TextualData do result.Value
  8. Mapuj BarcodeResult.BarcodeTypeName do result.Format
  9. Mapuj konfigurację DeBlur do Speed = ReadingSpeed.ExtremeDetail w BarcodeReaderOptions
  10. Mapuj konfigurację wielokrotnego skanowania do ExpectMultipleBarcodes = true w BarcodeReaderOptions
  11. Dodaj wywołania BarcodeWriter.CreateBarcode() dla wszelkich wymagań generowania
  12. Dodaj wywołania QRCodeWriter.CreateQrCode() dla wymagań generowania kodów QR
  13. Zastąp jakikolwiek kod wstępnego przetwarzania PDF BarcodeReader.Read("document.pdf")
  14. Owiń synchroniczne wywołania BarcodeReader.Read() w Task.Run() dla asynchronicznych punktów końcowych ASP.NET Core

Testy po migracji

Po zakończeniu aktualizacji kodu sprawdź, czy:

  • Potwierdź, że BarcodeReader.Read() zwraca wyniki dla wszystkich używanych formatów obrazów (PNG, JPEG, TIFF, BMP)
  • Zweryfikuj, że ReadingSpeed.ExtremeDetail odzyskuje kody kreskowe z próbek najniższej jakości w twoim zestawie testowym
  • Potwierdź, że ExpectMultipleBarcodes = true zwraca poprawną liczbę kodów kreskowych z dokumentów z wieloma kodami kreskowymi
  • Przetestuj odczyt plików PDF w odniesieniu do wszystkich wersji PDF używanych w produkcyjnych procesach dokumentacyjnych
  • Zweryfikuj, że wynik BarcodeWriter.CreateBarcode() jest skanowalny przez twoje docelowe skanery
  • Zweryfikuj, że wynik QRCodeWriter.CreateQrCode() jest skanowalny przez mobilne czytniki kodów QR
  • Przetestuj punkt końcowy .NET Core (jeśli dotyczy) przy użyciu przesyłania plików z klientów mobilnych
  • Potwierdź prawidłowe działanie w środowiskach wdrożeniowych Docker, Azure lub Lambda
  • Przeprowadź testy end-to-end obejmujące pełny cykl odczytu-przetwarzania-generowania, tam gdzie to możliwe

Kluczowe korzyści wynikające z migracji do IronBarcode

Platforma obejmująca .NET bez kamery:IronBarcode instaluje się z NuGet i działa w dowolnym projekcie .NET — ASP.NET Core, Azure Functions, Lambda, Docker, konsola, pracownik, WPF, WinForms, Avalonia, Blazor, MAUI. Plugin.Maui.Barkoder Barkoder obejmuje tylko interfejs użytkownika kamery wewnątrz głowy aplikacji mobilnej MAUI;IronBarcode obejmuje wszystko inne.

Odczyt odporny na uszkodzenia bez kamery: Zdolności, które uczyniły Barkoder atrakcyjnym — DeBlur, MatrixSight, odzyskiwanie uszkodzeń — są obecne w IronBarcode przez ReadingSpeed.ExtremeDetail i oparte na ML wstępne przetwarzanie obrazu.IronBarcode zapewnia taką samą poprawę dokładności, jaką Barkoder osiąga w przypadku obrazu z kamery na żywo, w odniesieniu do plików, zeskanowanych dokumentów i przesłanych obrazów.

Kompletny proces odczytu i generowania: Barkoder jest tylko do odczytu.IronBarcode obsługuje zarówno odczyt, jak i generowanie kodów kreskowych w ponad 50 formatach w ramach jednego pakietu. Zespoły, które muszą generować etykiety wysyłkowe, tworzyć kody QR na opakowania lub osadzać BarCodes w dokumentach, nie potrzebują drugiej biblioteki.

Wbudowana obsługa plików PDF: Odczytywanie kodów kreskowych z dokumentów PDF — faktur, listów przewozowych, dokumentacji medycznej, dokumentów zgodności — to jedna z najważniejszych funkcji IronBarcode. Bez pośredniego wyodrębniania obrazów, bez wywołań API dla każdej strony i bez dodatkowych zależności. Wielostronicowy plik PDF jest przetwarzany w pojedynczym wywołaniu BarcodeReader.Read().

Pełne wdrożenie po stronie serwera:IronBarcode działa w środowisku ASP.NET Core, Azure Functions, AWS Lambda, kontenerach Docker oraz w każdym innym środowisku hostingowym .NET. Przetwarza BARCODES lokalnie, bez połączeń sieciowych, bez konieczności zarządzania kluczami API i bez opóźnień spowodowanych przez usługę zdalną. Przetworzenie jednego BARCODE'a lub miliona kosztuje tyle samo — nie ma opłat za żądanie.

Przewidywalna cena licencji wieczystej:IronBarcode jest dostępny w ramach jednorazowej licencji wieczystej w cenie od 749 USD dla pojedynczego programisty, bez opłat za żądania, bez limitów ilościowych i bez konieczności odnawiania subskrypcji. Dla zespołów tworzących aplikacje produkcyjne przetwarzające BarCodes na dużą skalę model kosztowy jest prosty i przewidywalny.

Często Zadawane Pytania

Dlaczego warto przejść z Barkoder SDK na IronBarcode?

Typowe powody to uproszczenie licencjonowania (eliminacja złożoności związanej z SDK i kluczem uruchomieniowym), zniesienie limitów przepustowości, uzyskanie natywnej obsługi plików PDF, usprawnienie wdrażania w środowisku Docker/CI/CD oraz ograniczenie powtarzalnego kodu API w kodzie produkcyjnym.

Jak zastąpić wywołania API Barkoder za pomocą IronBarcode?

Zastąp standardowe fragmenty kodu dotyczące tworzenia instancji i licencjonowania wyrażeniem IronBarCode.License.LicenseKey = "key". Zastąp wywołania czytnika wyrażeniem BarcodeReader.Read(path), a wywołania zapisu wyrażeniem BarcodeWriter.CreateBarcode(data, encoding). Metody statyczne nie wymagają zarządzania instancjami.

Jak bardzo zmienia się kod podczas migracji z Barkoder SDK do IronBarcode?

Większość migracji skutkuje zmniejszeniem liczby linii kodu. Usuwane są standardowe fragmenty dotyczące licencji, konstruktory instancji oraz jawna konfiguracja formatów. Podstawowe operacje odczytu/zapisu są mapowane na krótsze odpowiedniki w IronBarcode z bardziej przejrzystymi obiektami wynikowymi.

Czy podczas migracji muszę mieć zainstalowane zarówno Barkoder SDK, jak i IronBarcode?

Nie. Większość migracji polega na bezpośredniej wymianie, a nie na równoległym działaniu. Należy migrować po jednej klasie usługowej na raz, zastąpić odwołanie do NuGet oraz zaktualizować wzorce instancjonowania i wywoływania API przed przejściem do kolejnej klasy.

Jaka jest nazwa pakietu NuGet dla IronBarcode?

Pakiet nosi nazwę „IronBarcode” (z wielkimi literami B i C). Zainstaluj go za pomocą polecenia „Install-Package IronBarcode” lub „dotnet add package IronBarcode”. Dyrektywa using w kodzie to „using IronBarcode;”.

W jaki sposób IronBarcode upraszcza wdrażanie Docker w porównaniu z Barkoder SDK?

IronBarcode to pakiet NuGet bez zewnętrznych plików SDK ani konfiguracji licencji. W Dockerze należy ustawić zmienną środowiskową IRONBARCODE_LICENSE_KEY, a pakiet zajmie się weryfikacją licencji podczas uruchamiania.

Czy IronBarcode automatycznie wykrywa wszystkie formaty kodów kreskowych po migracji z Barkoder?

Tak. IronBarcode automatycznie wykrywa symbole we wszystkich obsługiwanych formatach. Wyraźne wyliczenie typów kodów kreskowych nie jest wymagane. Jeśli format jest już znany, a wydajność ma znaczenie, BarcodeReaderOptions pozwala ograniczyć obszar wyszukiwania w celu optymalizacji.

Czy IronBarcode może odczytywać BarCodes z plików PDF bez oddzielnej biblioteki?

Tak. BarCodeReader.Read("document.pdf") przetwarza pliki PDF natywnie. Wyniki obejmują PageNumber, Format, Value i Confidence dla każdego znalezionego kodu kreskowego. Nie jest wymagany żaden zewnętrzny etap renderowania pliku PDF.

W jaki sposób IronBarcode obsługuje równoległe przetwarzanie kodów kreskowych?

Metody statyczne IronBarcode są bezstanowe i bezpieczne dla wątków. Użyj Parallel.ForEach bezpośrednio na listach plików bez zarządzania instancjami dla poszczególnych wątków. BarcodeReaderOptions.MaxParallelThreads kontroluje wewnętrzny limit wątków.

Jakie właściwości wyników ulegają zmianie podczas migracji z Barkoder SDK do IronBarcode?

Typowe zmiany nazw: BarcodeValue staje się Value, BarcodeType staje się Format. Wyniki IronBarcode zawierają również Confidence i PageNumber. Funkcja wyszukiwania i zamiany w całym rozwiązaniu obsługuje zmiany nazw w istniejącym kodzie przetwarzania wyników.

Jak skonfigurować licencjonowanie IronBarcode w potoku CI/CD?

Zapisz IronBarcode_LICENSE_KEY jako sekret potoku i przypisz IronBarCode.License.LicenseKey w kodzie uruchamiającym aplikację. Jeden sekret obejmuje wszystkie środowiska, w tym środowisko programistyczne, testowe, przejściowe i produkcyjne.

Czy IronBarcode obsługuje generowanie kodów QR z niestandardowym stylem?

Tak. Funkcja QRCodeWriter.CreateQrCode() obsługuje niestandardowe kolory za pomocą ChangeBarCodeColor(), osadzanie logo za pomocą AddBrandLogo(), konfigurowalne poziomy korekcji błędów oraz wiele formatów wyjściowych, w tym PNG, JPG, PDF i strumień.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej

Zespół wsparcia Iron

Jesteśmy online 24 godziny, 5 dni w tygodniu.
Czat
E-mail
Zadzwoń do mnie