Przejdź do treści stopki
PORóWNAJ Z INNYMI KOMPONENTAMI

Barcode4.NET vs IronBarcode: Porównanie bibliotek kodów kreskowych C#

BarcodeScanning.Native.Maui vs IronBarcode: Kontrola kamery vs pełne SDK kodów kreskowych

BarcodeScanning.Native.Maui to wtyczka do kamery dedykowana aplikacjom MAUI. Jeśli twoja aplikacja przetwarza przesłane pliki lub odczytuje kody kreskowe z PDF-ów, nie jest przeznaczona do tego przypadku użycia. Pakiet okresla sie jako 'biblioteka skanowania kodow kreskowych dla .NET MAUI', a w praktyce jest to CameraView kontrolka, ktora uruchamia zdarzenie, gdy kod kreskowy wchodzi w kadr aktywnej kamery. To jest pełny zestaw funkcji. Porównanie to bada różnice architektoniczne między biblioteką kontroli kamery a pełnoprawnym SDK kodów kreskowych, pomagając zespołom zrozumieć, gdzie każde narzędzie pasuje.

Zrozumienie BarcodeScanning.MAUI

BarcodeScanning.Native.Maui owija natywne API wykrywania kodow kreskowych kamer na iOS/macOS (framework Vision firmy Apple), Androidzie (Google ML Kit) oraz Windowsie (ZXingCpp, dodany w wersji 3.0.1) w kontrolce CameraView MAUI. Programista umieszcza kontrolkę na stronie XAML, podłącza procedurę obsługi zdarzenia, a biblioteka wyzwala to zdarzenie za każdym razem, gdy w podglądzie na żywo z kamery wykryty zostanie BARCODE. Cały model interakcji opiera się na zasadzie "camera-in, event-out" — nie ma innej ścieżki.

Biblioteka jest oprogramowaniem typu open source i jest bezpłatna na licencji MIT. Jego celem projektowym jest wąski i jawny: zapewnić wykrywanie kodów kreskowych z transmisji wideo kamery na żywo dla aplikacji MAUI przy jak najmniejszej możliwej powierzchni API. Osiąga to poprzez delegację do silników natywnych dla każdej platformy, zamiast implementowania własnego silnika dekodującego.

Kluczowe cechy architektury BarcodeScanning.Native.Maui:

  • Wprowadzanie wyłącznie z kamery: Biblioteka akceptuje wyłącznie klatki z kamery na żywo. Nie ma ReadFromFile(), ReadFromBytes(), ReadFromStream() ani ReadFromPdf() metody w zadnym miejscu publicznego API.
  • Tylko cele MAUI: Biblioteka wspiera cele MAUI — iOS, Android, Windows (od wersji 3.0.1, przez ZXingCpp) i macOS Catalyst. Nie może być używana poza projektami MAUI (brak ASP.NET, konsoli, WPF czy WinForms).
  • Trzy różne silniki: Apple Vision na iOS/macOS, Google ML Kit na Androidzie i ZXingCpp na Windows. Pokrycie symboliki i zachowanie dekodowania różni się między tymi trzema silnikami.
  • Brak możliwości generowania: BarcodeScanning.Native.Maui odczytuje kody kreskowe z klatek z kamery. Nie może generować BARCODE-ów w żadnym formacie.
  • Quirk UPC-A na iOS: Frame Vision Apple może zwrócić 13 cyfr dla kodów kreskowych UPC-A (dodając wiodące zero, aby dopasować kodowanie EAN-13). Biblioteka przekazuje tę surową wartość i aplikacje normalizują ją w razie potrzeby.
  • Niezawodność PDF417 na iOS/Android: Tracker issue biblioteki na GitHub opisuje skanowanie PDF417 jako "bardzo problematyczne — większość skanów nigdy nie występuje" na ścieżkach kodu Vision/ML Kit, co jest istotne dla etykiet wysyłkowych, praw jazdy i kart pokładowych.
  • Minimalna powierczhnia publiczna: Publiczne API sklada sie z CameraView, OnDetectionFinished, OnDetectionFinishedEventArg oraz BarcodeResult z DisplayValue i BarcodeFormat. To wszystko, z czym współdziała kod aplikacji.
  • Licencja MIT, bezpłatna: Korzystanie z biblioteki jest bezpłatne i nie wiąże się z żadnymi opłatami licencyjnymi.

Wzór skanowania na żywo z kamery

Cały wzorzec API BarcodeScanning.Native.Maui to kontrolka XAML połączona z procedurą obsługi zdarzeń w języku C#:


<scanner:CameraView x:Name="CameraView"
                    OnDetectionFinished="OnBarcodeDetected"
                    CameraEnabled="True"
                    BarcodeFormats="All" />

<scanner:CameraView x:Name="CameraView"
                    OnDetectionFinished="OnBarcodeDetected"
                    CameraEnabled="True"
                    BarcodeFormats="All" />
XML
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
    Dim barcode = e.BarcodeResults.FirstOrDefault()
    If barcode IsNot Nothing Then
        ResultLabel.Text = barcode.DisplayValue
    End If
End Sub
$vbLabelText   $csharpLabel

Ten element sterujący zapewnia użytkownikom podgląd w czasie rzeczywistym osadzony na stronie MAUI. Wykrywanie kodów kreskowych odbywa się ciągle, gdy strumień kamery jest aktywny. UX jest dobrze dostosowany do aplikacji konsumenckich, gdzie "celuj i skanuj" jest główną interakcją. Ograniczenie to, że jest to jedyna interakcja, którą biblioteka obsługuje — wymagania, które wykraczają poza wykrywanie kodów kreskowych z transmisji na żywo w kontekście MAUI, wykraczają poza jej zakres.

Zrozumienie IronBarcode

IronBarcode to komercyjna biblioteka do odczytu i generowania kodów kreskowych dla platformy .NET, która działa na danych wejściowych, a nie na strumieniach z kamery. Odczytuje kody kreskowe z plików graficznych, tablic bajtów, strumieni i dokumentów PDF. Na MAUI, integruje sie z systemowa kamera przez MediaPicker — to samo standardowe API MAUI, ktore aplikacje uzywaja do wyboru zdjecia — rejestrujac zdjecie, a nastepnie przetwarzajac wynikowy obraz jako statyczne wejscie.

IronBarcode implementuje wlasny zarzadzany silnik dekodowania kodow kreskowych, zamiast delegowac do specyficznych dla platformy natywnych API. Oznacza to, ze to samo wywolanie BarcodeReader.Read() zachowuje sie konsekwentnie w calym wspieranym celu .NET — Windows, Linux, macOS, ASP.NET oraz procesy serwerowe w tle — a takze w mobilnych celach MAUI, kiedy obraz jest przechwycony i przekazany do czytnika. Biblioteka oferuje rowniez pelne API generowania kodow kreskowych przez BarcodeWriter i QRCodeWriter.

Kluczowe cechy IronBarcode:

  • Statyczne API oparte na plikach: BarcodeReader.Read() akceptuje sciezke do pliku, tablice bajtow, strumien lub PDF — dowolne statyczne zrodlo danych.
  • Szerokie pokrycie platformy: Windows, Linux i macOS (w tym ARM) są obsługiwane wraz z .NET Framework 4.6.2+, .NET Core 3.1+, i .NET 5/6/7/8. Ta sama ścieżka kodu zarządzania działa na wszystkich obsługiwanych celach bez rozgałęziania specyficznego dla platformy.
  • Generowanie kodow kreskowych: BarcodeWriter.CreateBarcode() i QRCodeWriter.CreateQrCode() generuja Code128, QR, DataMatrix i inne formaty jako pliki obrazow lub tablice bajtow.
  • Obsługa plików PDF: BarCodes osadzone w dokumentach PDF są odczytywane bezpośrednio, bez pośredniego etapu wyodrębniania obrazu.
  • Spójne dekodowanie UPC-A: Zwraca standardową 12-cyfrową wartość UPC-A przez swój zarządzany silnik.
  • Licencje komercyjne: Lite 749 USD, Plus 1499 USD, Professional License 2999 USD, Unlimited License 5999 USD — licencje wieczyste z rocznym wsparciem technicznym.
  • Wdrożenie po stronie serwera: Działa w środowisku ASP.NET, Azure Functions, kontenerach Docker oraz AWS Lambda bez zależności platformy od fizycznej kamery.

Porównanie funkcji

Poniższa tabela przedstawia podstawowe różnice między BarcodeScanning.Native.Maui a IronBarcode:

Funkcja BarcodeScanning.MAUI IronBarcode
Główny cel Wykrywanie BarCode na żywo za pomocą kamery Odczytywanie i generowanie BarCode'ów z dowolnego źródła danych
Źródła danych wejściowych Tylko klatki z kamery na żywo Pliki, tablice bajtów, strumienie, pliki PDF
Obsługa platform Tylko MAUI — iOS, Android, Windows (za pośrednictwem ZXingCpp), macOS Catalyst Windows, Linux, macOS, ASP.NET, konsola, WPF, plus MAUI przez przechwycone obrazy
Silnik rozpoznawania Trzy silniki (Apple Vision / Google ML Kit / ZXingCpp) Pojedynczy zarządzany silnik na wszystkich celach
Generowanie kodów kreskowych Nie Tak — BarcodeWriter + QRCodeWriter
Model licencji MIT (bezpłatne, open source) Komercyjne — od wersji Lite za 749 USD do wersji Unlimited za 5999 USD
Po stronie serwera / ASP.NET Nie Tak

Szczegółowe porównanie funkcji

Funkcja BarcodeScanning.MAUI IronBarcode
Czytanie
Odczytywanie klatek z kamery na żywo Tak — kontrolka CameraView Nie (użyj MediaPicker do przechwycenia, a następnie odczytania)
Wizjer aparatu w aplikacji Tak — w czasie rzeczywistym, w sposób ciągły Nie — korzysta z interfejsu użytkownika aparatu systemowego za pośrednictwem MediaPicker
Odczyt z pliku graficznego Nie Tak — BarcodeReader.Read(path)
Odczyt z tablicy bajtów Nie Tak — BarcodeReader.Read(bytes)
Odczyt z strumienia Nie Tak — BarcodeReader.Read(stream)
Czytaj z pliku PDF Nie Tak — BarcodeReader.Read(pdf)
Wykrywanie wielu kodów BarCode Tak (wiele na klatke przez e.BarcodeResults) Tak (opcja ExpectMultipleBarcodes)
Kontrola prędkości czytania None ReadingSpeed.Faster / Balanced / Detailed / ExtremeDetail
UPC-A na iOS Może zwrócić 13 cyfr; applications normalize Zwraca standardową 12-cyfrową wartość UPC-A
Niezawodność PDF417 Udokumentowane problemy w silnikach iOS/Android Obsługiwane
Generacja
Generowanie BarCode'ów Nie Tak — BarcodeWriter.CreateBarcode()
Generowanie kodów QR Nie Tak — QRCodeWriter.CreateQrCode()
Wynik w formacie PNG / tablica bajtów Nie Tak
Platforma
iOS MAUI Tak (Apple Vision) Tak (przez przechwycony obraz)
Android MAUI Tak (Google ML Kit) Tak (przez przechwycony obraz)
Windows MAUI Tak (ZXingCpp, od wersji 3.0.1) Tak
macOS MAUI Tak (Mac Catalyst, Apple Vision) Tak
ASP.NET / strona serwera Nie Tak
Docker / Azure / AWS Lambda Nie Tak
Obsługa platformy .NET Framework Nie (tylko MAUI) Tak — .NET Framework 4.6.2+
Licencjonowanie
Rodzaj licencji MIT (open source) Komercjalna licencja wieczysta
Koszt Bezpłatne Lite 749 USD, Plus 1499 USD, Professional 2999 USD, Unlimited 5999 USD
Tryb oceny Nie dotyczy Dostępna bezpłatna wersja próbna

Architektura: Sterowanie kamerą a API przetwarzania plików

Najbardziej zasadniczą różnicą między tymi dwiema bibliotekami jest model wejściowy. BarcodeScanning.Native.Maui zostało zaprojektowane z myślą o ciągłym strumieniu obrazu z kamery;IronBarcode został zaprojektowany z myślą o dyskretnych danych wejściowych. Nie są to konkurencyjne implementacje tego samego pomysłu — są to różne wybory architektoniczne dla różnych przypadków użycia.

Podejście BarcodeScanning.MAUI

BarcodeScanning.Native.Maui wykorzystuje natywny proces wykrywania aparatu na każdej platformie. Na Androidzie ML Kit przetwarza klatki; na iOS i macOS, ramy Apple'a Vision przetwarzają klatki; na Windows ZXingCpp przetwarza klatki. Biblioteka udostepnia to jako kontrole MAUI CameraView ze zdarzeniem OnDetectionFinished. Kod aplikacji nigdy nie obsługuje bezpośrednio bajtów obrazu — obsługuje jedynie wykryte wartości BARCODE, które pojawiają się w zdarzeniu.

private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode != null)
        ResultLabel.Text = barcode.DisplayValue;
}
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
    Dim barcode = e.BarcodeResults.FirstOrDefault()
    If barcode IsNot Nothing Then
        ResultLabel.Text = barcode.DisplayValue
    End If
End Sub
$vbLabelText   $csharpLabel

Konsekwencją tego projektu jest brak innego punktu wejścia. Kamera nie jest opcjonalna — jest to jedyne źródło danych, jakie biblioteka rozpoznaje. Serwer, plik, PDF lub jakikolwiek host bez MAUI nie ma ścieżki dostępu do biblioteki.

Podejście IronBarcode

IronBarcode otrzymuje dane obrazu przez swoja statyczna metode BarcodeReader.Read(). Użytkownik dostarcza dane — z dowolnego źródła — a biblioteka je dekoduje. Na MAUI, dane pochodza z MediaPicker; na serwerze, pochodzi z przesłania formularza; w aplikacji desktopowej pochodzi z okna dialogowego plików.

//IronBarcode in MAUI: capture a photo, then read barcodes from it
// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanBarcodeButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var result in results)
        ResultLabel.Text = result.Value;
}
//IronBarcode in MAUI: capture a photo, then read barcodes from it
// NuGet: dotnet add package IronBarcode
using IronBarCode;

private async void ScanBarcodeButton_Clicked(object sender, EventArgs e)
{
    var photo = await MediaPicker.CapturePhotoAsync();
    if (photo == null) return;

    using var stream = await photo.OpenReadAsync();
    using var ms = new MemoryStream();
    await stream.CopyToAsync(ms);

    var results = BarcodeReader.Read(ms.ToArray());
    foreach (var result in results)
        ResultLabel.Text = result.Value;
}
Imports IronBarCode
Imports System.IO
Imports Microsoft.Maui.Media

Private Async Sub ScanBarcodeButton_Clicked(sender As Object, e As EventArgs)
    Dim photo = Await MediaPicker.CapturePhotoAsync()
    If photo Is Nothing Then Return

    Using stream = Await photo.OpenReadAsync()
        Using ms As New MemoryStream()
            Await stream.CopyToAsync(ms)

            Dim results = BarcodeReader.Read(ms.ToArray())
            For Each result In results
                ResultLabel.Text = result.Value
            Next
        End Using
    End Using
End Sub
$vbLabelText   $csharpLabel

Ten kod działa identycznie we wszystkich celach MAUI, które mogą przechwycić obraz. Dla uzytku po stronie serwera ta sama metoda BarcodeReader.Read() akceptuje tablice bajtowa przeslanego pliku lub sciezke do PDF. Dokumentacja IronBarcode obejmuje wszystkie obsługiwane typy danych wejściowych.

Zakres platform i silniki rozpoznawania

Zakres platform ma znaczenie dla zespołów budujących aplikacje MAUI, które mogą również potrzebować dzielić się logiką kodów kreskowych z projektami bez MAUI.

Podejście BarcodeScanning.MAUI

BarcodeScanning.Native.Maui wspiera wszystkie cztery cele MAUI (iOS, Android, Windows od wersji 3.0.1 i macOS Catalyst), ale każdy cel używa innego silnika rozpoznawania: Apple Vision na iOS i macOS, Google ML Kit na Androidzie i ZXingCpp na Windows. Zakres symbologii i zachowanie dekodowania różnią się w zależności od trzech silników, co oznacza, że kod kreskowy, który niezawodnie dekoduje się na jednej platformie, może zachowywać się inaczej na innej. Poza MAUI - ASP.NET, konsola, WPF, WinForms, Blazor Server, Azure Functions - biblioteka nie ma implementacji. Zespoły, które potrzebują logiki kodów kreskowych zarówno w aplikacji MAUI, jak i usłudze backendu, muszą używać innej biblioteki dla kodu poza MAUI.

Podejście IronBarcode

Wywolanie BarcodeReader.Read() w IronBarcode wykorzystuje ten sam zarzadzany silnik na kazdym wspieranym celu, wiec zachowanie jest spójne w calym Windows, Linux, macOS, ASP.NET i dowolnym celu MAUI, ktory moze zarejestrowac obraz i przekazac go do czytnika. Nie ma blokow #if WINDOWS, ladowania warunkowego zaleznosci czy potrzebnych implementacji szkieletowych. W przypadku plików i dokumentów PDF wzór jest również spójny:

using IronBarCode;

// Read barcodes from a file the user selected
var file = await FilePicker.PickAsync();
if (file != null)
{
    var results = BarcodeReader.Read(file.FullPath);
    foreach (var result in results)
        Console.WriteLine($"{result.Format}: {result.Value}");
}

// Read barcodes directly from a PDF — no image extraction step needed
var pdfResults = BarcodeReader.Read("shipment-manifest.pdf");
using IronBarCode;

// Read barcodes from a file the user selected
var file = await FilePicker.PickAsync();
if (file != null)
{
    var results = BarcodeReader.Read(file.FullPath);
    foreach (var result in results)
        Console.WriteLine($"{result.Format}: {result.Value}");
}

// Read barcodes directly from a PDF — no image extraction step needed
var pdfResults = BarcodeReader.Read("shipment-manifest.pdf");
Imports IronBarCode

' Read barcodes from a file the user selected
Dim file = Await FilePicker.PickAsync()
If file IsNot Nothing Then
    Dim results = BarcodeReader.Read(file.FullPath)
    For Each result In results
        Console.WriteLine($"{result.Format}: {result.Value}")
    Next
End If

' Read barcodes directly from a PDF — no image extraction step needed
Dim pdfResults = BarcodeReader.Read("shipment-manifest.pdf")
$vbLabelText   $csharpLabel

Przewodnik integracji IronBarcode MAUI zawiera kompletne instrukcje konfiguracji dla wszystkich celów MAUI.IronBarcode obsługuje również wdrażanie po stronie serwera w środowiskach ASP.NET, Docker, Azure Functions i AWS Lambda, gdzie BarcodeScanning.Native.Maui nie ma żadnej ścieżki.

Dokładność odczytu BarCode: UPC-A i PDF417

Dwa specyficzne zachowania formatu w BarcodeScanning.Native.Maui są warte odnotowania dla aplikacji produkcyjnych.

Podejście BarcodeScanning.MAUI

Na iOS BarcodeScanning.Native.Maui opiera się na wykrywaniu (Apple Vision), które może zwrócić 13 cyfr dla kodów kreskowych UPC-A. UPC-A to format 12-cyfrowy; dodatkowa zerowa cyfra na początku odpowiada kodowaniu EAN-13. Biblioteka przekazuje tę surową wartość i aplikacje normalizują ją w razie potrzeby. Aplikacje, które przechowują wartości UPC-A w bazie danych bez normalizacji, mogą gromadzić rekordy z wiodącym zerem.

Opisana poprawka sprawdza format i przycina wartość:

// Normalize iOS UPC-A — strip the leading zero when present
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode == null) return;

    var value = barcode.DisplayValue;
    if (barcode.BarcodeFormat == BarcodeFormats.Upca && value.Length == 13)
        value = value.Substring(1);

    ProcessBarcode(value);
}
// Normalize iOS UPC-A — strip the leading zero when present
private void OnBarcodeDetected(object sender, OnDetectionFinishedEventArg e)
{
    var barcode = e.BarcodeResults.FirstOrDefault();
    if (barcode == null) return;

    var value = barcode.DisplayValue;
    if (barcode.BarcodeFormat == BarcodeFormats.Upca && value.Length == 13)
        value = value.Substring(1);

    ProcessBarcode(value);
}
' Normalize iOS UPC-A — strip the leading zero when present
Private Sub OnBarcodeDetected(sender As Object, e As OnDetectionFinishedEventArg)
    Dim barcode = e.BarcodeResults.FirstOrDefault()
    If barcode Is Nothing Then Return

    Dim value = barcode.DisplayValue
    If barcode.BarcodeFormat = BarcodeFormats.Upca AndAlso value.Length = 13 Then
        value = value.Substring(1)
    End If

    ProcessBarcode(value)
End Sub
$vbLabelText   $csharpLabel

Sprawdzenie formatu jest konieczne, aby wartości EAN-13 zaczynające się od 0 nie były obcinane przez pomyłkę. PDF417 jest oddzielnie opisany w problemach na GitHubie jako 'bardzo problematyczny — większość skanów nigdy nie występuje' w silnikach iOS/Android, co jest istotne dla etykiet wysyłkowych, praw jazdy i kart pokładowych.

Podejście IronBarcode

IronBarcode zwraca standardową 12-cyfrową wartość UPC-A przez swój zarządzany silnik. PDF417 jest obsługiwanym formatem. Funkcja generowania jest również dostępna za pośrednictwem API IronBarcode:

using IronBarCode;

// Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");

// Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");
using IronBarCode;

// Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");

// Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");
Imports IronBarCode

' Generate a QR code
QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .SaveAsPng("qr.png")

' Generate a Code128 barcode
BarcodeWriter.CreateBarcode("ITEM-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

Dla aplikacji, w których dokładność danych kodów kreskowych bezpośrednio wpływa na wyszukiwania w magazynie, transakcje w punktach sprzedaży lub integracje łańcucha dostaw, spójna obsługa formatu przez IronBarcode zmniejsza potrzebę platformowo-specyficznej normalizacji. Dokumentacja dotycząca odczytu kodów kreskowych IronBarcode szczegółowo opisuje zachowanie w zależności od formatu.

Przewodnik po mapowaniu API

BarcodeScanning.Native.Maui IronBarcode
CameraView XAML kontrolka Brak kontroli kamery — uzyj MediaPicker.CapturePhotoAsync() do przechwytywania
OnDetectionFinished zdarzenie BarcodeReader.Read(imageBytes)
e.BarcodeResults Wartosc zwracana BarcodeReader.Read() (IEnumerable)
e.BarcodeResults.FirstOrDefault() results.FirstOrDefault()
barcode.DisplayValue result.Value
barcode.BarcodeFormat result.Format
BarcodeFormats="All" Wykrywane automatycznie — nie wymaga konfiguracji dla wielu formatów
CameraEnabled="True" MediaPicker.CapturePhotoAsync() wywolanie
Tylko dla MAUI (iOS, Android, Windows, macOS) MAUI (poprzez przechwycony obraz) + ASP.NET, konsola, WPF, desktop, serwer
Tylko ramki aparatu Pliki, tablice bajtów, strumienie, pliki PDF
Brak pliku/API PDF BarcodeReader.Read(path) — akceptuje pliki obrazow i PDFy
Trzy silniki w ramach celów MAUI Pojedynczy zarządzany silnik na wszystkich celach
Brak API generowania BarcodeWriter.CreateBarcode() + QRCodeWriter.CreateQrCode()

Kiedy zespoły rozważają przejście z BarcodeScanning.MAUI na IronBarcode

Spójność silnika międzyplatformowego staje się wymogiem

Aplikacje MAUI, które celują w iOS, Android, Windows i macOS, korzystają z trzech różnych silników rozpoznawania, gdy używają BarcodeScanning.Native.Maui: Apple Vision (iOS/macOS), Google ML Kit (Android), i ZXingCpp (Windows). Każdy silnik ma własny zakres symbologii i zachowanie dekodowania, więc ten sam kod kreskowy może dekodować się inaczej na różnych platformach — a aplikacje na ogół dodają warstwy normalizacji, aby pokryć różnice. Kiedy nakład pracy nad utrzymaniem rośnie, lub kiedy QA zgłasza regresje międzyplatformowe związane z różnicami w silnikach, zespoły czasami migrują warstwę kodów kreskowych do pojedynczego zarządzanego silnika, który zachowuje się w ten sam sposób na wszystkich celach.

Dodano wymagania dotyczące przesyłania plików lub przetwarzania plików PDF

Aplikacje mobilne często zaczynają od skanowania na żywo za pomocą kamery jako jedynej metody wprowadzania danych, a później rozszerzają się, aby akceptować przesłane obrazy lub dokumenty. Gdy użytkownik potrzebuje zeskanować kod kreskowy z zdjęcia w swojej galerii, z obrazu otrzymanego przez email lub z pliku PDF zawierającego manifesty przesyłek lub bilety pokładowe, BarcodeScanning.Native.Maui nie ma ścieżki kodu dla tych wejść. Zespoły, które stają przed tą granicą wymogu, muszą dokonać wyboru: dodać drugą bibliotekę kodów kreskowych obok BarcodeScanning.Native.Maui dla plików i wejść PDF, lub przejść na jedną bibliotekę, która obsługuje wszystkie typy wejść. Zarządzanie dwoma pakietami kodów kreskowych z różnymi API i typami wyników dodaje długoterminową złożoność, której unika rozwiązanie z jednym pakietem.

Wprowadzenie przetwarzania BarCodes po stronie serwera

Aplikacje skanujące kody kreskowe na urządzeniach mobilnych często wykorzystują komponent po stronie serwera — punkt końcowy API ASP.NET, który weryfikuje kody kreskowe, zadanie w tle przetwarzające pliki PDF lub funkcję w chmurze, która wyodrębnia numery śledzenia z przesłanych dokumentów. BarcodeScanning.Native.Maui jest biblioteką kontrolki UI MAUI; nie ma implementacji po stronie serwera. Zespół, który potrzebuje tej samej logiki odczytu BarCode'ów zarówno na urządzeniach mobilnych, jak i na serwerze, musi użyć innej biblioteki po stronie serwera. Kiedy pojawia się wymóg po stronie serwera, zespoły często oceniają, czy konsolidacja do jednej biblioteki, która obejmuje zarówno urządzenia mobilne, jak i serwer, jest lepszym rozwiązaniem niż utrzymywanie dwóch oddzielnych implementacji.

Normalizacja danych UPC-A staje się problemem

Zachowanie 13-cyfrowego kodu UPC-A w systemie iOS nie zawsze jest wykrywane podczas tworzenia oprogramowania. Kody kreskowe UPC-A skanowane podczas tworzenia mogą wydawać się działać poprawnie, ale wiodące zero z ram Apple'a Vision może pojawić się w bazie danych, gdy normalizacja brakuje. Zespoły, które odkrywają 13-cyfrowe wartości UPC-A w rekordach inwentarza, systemach punktów sprzedaży lub integracjach łańcucha dostaw, mogą potrzebować zarówno poprawki kodu, jak i kroku korekty danych. Dodanie opisanej normalizacji obsługuje nowe skany; migracja do biblioteki z spójnym wyjściem UPC-A jest czasami preferowana jako długoterminowe rozwiązanie.

Wymagane skanowanie dokumentów PDF417

PDF417 to format BARCODE stosowany w etykietach wysyłkowych, prawach jazdy i kartach pokładowych w Ameryce Północnej. Są to typowe cele skanowania w aplikacjach logistycznych, do weryfikacji tożsamości i aplikacjach turystycznych. GitHub issue tracker BarcodeScanning.Native.Maui dokumentuje PDF417 jako 'bardzo problematyczny — większość skanów nigdy nie występuje' w silnikach iOS/Android. Dla aplikacji, w których niezawodność PDF417 stanowi wymóg funkcjonalny, zespoły często oceniają alternatywne biblioteki.

Typowe kwestie związane z migracją

Zdarzenie kamery do MediaPicker i odczyt statyczny

Podstawowa zmiana strukturalna w migracji polega na zastapieniu wzorca ciaglego zdarzenia kamery przez MediaPicker z przechwyceniem nastepowanym przez BarcodeReader.Read(). Obsluga zdarzen OnDetectionFinished, kontrolka XAML CameraView, oraz deklaracja przestrzeni nazw XML scanner: sa usuwane. Zamiast tego, przycisk wyzwala MediaPicker.CapturePhotoAsync(), a uzyskane bajty zdjecia sa przekazywane do BarcodeReader.Read(). Zmienia to wrażenia użytkownika z podglądu na żywo na ekran aparatu systemowego — odpowiedni dla większości zastosowań biznesowych.

Zmiany w marshalingu wątków

BarcodeScanning.Native.Maui uruchamia OnDetectionFinished na watku w tle, wiec wszystkie istniejace obslugi ktore aktualizuja elementy interfejsu, owijaja swoje aktualizacje w MainThread.BeginInvokeOnMainThread(). Za pomoca wzorca MediaPicker + async uzywanego przez IronBarcode, kontynuacja po await zwraca sie w kontekscie wywolujacym, ktory jest zazwyczaj glownym watkiem. W wiekszosci przypadków owiniecia MainThread.BeginInvokeOnMainThread() moga byc usuniete, upraszczajac kod obslugi zdarzen.

Usuwanie normalizacji UPC-A

Kazda baza kodowa ktora obslugiwala zachowanie 13-cyfrowego iOS UPC-A w BarcodeScanning.Native.Maui bedzie miala kod, ktory sprawdza BarcodeFormats.Upca i wywoluje Substring(1) aby usunac wiodace zero. Ten kod powinien zostać usunięty po migracji —IronBarcode zwraca standardową 12-cyfrową wartość, a pozostawienie normalizacji w miejscu nieprawidłowo usunąłoby pierwszą cyfrę z prawidłowych odczytów UPC-A.

Uprawnienia MAUI

BarcodeScanning.Native.Maui dodaje uprawnienia kamery do manifestow Androida i iOS automatycznie jako czesc ustawienia pakietu. Z IronBarcode uzywajac MediaPicker, wymagane sa standardowe uprawnienia kamery MAUI w AndroidManifest.xml i Info.plist — te same uprawnienia, ktore potrzebuje dowolna aplikacja MAUI dla MediaPicker.CapturePhotoAsync(). Uprawnienia te są zazwyczaj już obecne w projektach MAUI, które wykorzystują kamerę w dowolnym celu.

Dodatkowe możliwości IronBarcode

Oprócz możliwości omówionych w tym porównaniu,IronBarcode oferuje funkcje, których BarcodeScanning.Native.Maui nie obsługuje na żadnym poziomie:

  • Generowanie barcode'ów: Generuj kody Code128, QR, DataMatrix, PDF417 i inne formaty jako pliki PNG, SVG lub tablice bajtów — do wykorzystania w interfejsie użytkownika MAUI, odpowiedziach API lub drukowanych etykietach.
  • Generowanie kodów QR: Twórz stylizowane kody QR z osadzonym logo, dostosowaniem kolorów i kontrolą poziomu korekcji błędów.
  • Odczyt Wielokrotny Kodu Kreskowego: Opcja ExpectMultipleBarcodes odczytuje wszystkie kody kreskowe w obecne w jednym obrazie w jednym przejsciu.
  • Wyodrębnianie kodów kreskowych z plików PDF: Bezpośredni odczyt kodów kreskowych osadzonych w dokumentach PDF — bez konieczności pośredniej konwersji obrazów.
  • Wdrożenie po stronie serwera: Wdroż tę samą logikę odczytu i generowania BarCode'ów w ASP.NET, Azure Functions, Dockerze i AWS Lambda bez żadnej zależności od kamery.
  • Konfiguracja Predkosci Odczytu: Ustawienia ReadingSpeed.Faster, Balanced, Detailed, i ExtremeDetail pozwalaja dostosowac przepustowosc w stosunku do dokladnosci w zaleznosci od jakosci obrazu.
  • Ponowne użycie na serwerze i desktopie: Ta sama biblioteka działa w projektach ASP.NET, konsoli, WPF i WinForms, dzięki czemu logika kodu kreskowego może być dzielona między klienta MAUI a usługę backendową bez drugiego pakietu.

Zgodność z platformą .NET i gotowość na przyszłość

IronBarcode wspiera .NET 6, .NET 7 i .NET 8 oraz .NET Framework 4.6.2 i nowsze. Oznacza to, że działa na nowoczesnych celach .NET, a także w starszych środowiskach serwerowych, które jeszcze nie migrowały. BarcodeScanning.Native.Maui to biblioteka tylko dla MAUI, bez wsparcia dla .NET Framework i bez ścieżki wdrożenia po stronie serwera. Dla zespołów, których kod obejmuje zarówno MAUI, jak i istniejące aplikacje serwerowe .NET Framework lub .NET Core,IronBarcode zapewnia spójny interfejs API we wszystkich środowiskach, bez konieczności stosowania oddzielnego pakietu kodów kreskowych dla każdego kontekstu uruchomieniowego.

Wnioski

BarcodeScanning.Native.Maui i IronBarcode rozwiązują różne problemy. BarcodeScanning.Native.Maui to biblioteka kontrolki kamery, która udostępnia widok w czasie rzeczywistym z automatycznym wykrywaniem kodów kreskowych, delegując rozpoznawanie do trzech różnych silników platformowych.IronBarcode to biblioteka do odczytu i generowania kodów kreskowych, która przetwarza dane obrazu statycznego z dowolnego źródła za pomocą pojedynczego zarządzanego silnika na celach .NET. Różnica w architekturze — ciągły strumień z kamery w porównaniu z dyskretnym wprowadzaniem danych — decyduje o tym, która biblioteka jest odpowiednia dla danego zestawu wymagań.

BarcodeScanning.Native.Maui to właściwy wybór, gdy aplikacja jest aplikacją MAUI, gdzie podgląd w aplikacji z ciągłym wykrywaniem klatek jest wymaganym wzorcem UX, i gdy wymagania nie rozszerzają się, aby obejmować przesyłanie plików, przetwarzanie PDF lub pracę z kodami kreskowymi po stronie serwera. W ramach tego zakresu jest bezpłatna, minimalna i funkcjonalna.

IronBarcode to właściwy wybór, gdy dane wejściowe kodu kreskowego pochodzą z plików, PDF lub tablic bajtów, oprócz lub zamiast kamery na żywo, kiedy przetwarzanie kodów kreskowych po stronie serwera jest częścią architektury, lub gdy generowanie kodów kreskowych jest wymagane obok odczytu. Jest również odpowiednia, gdy spójność zachowania dekodowania na różnych platformach lub niezawodność PDF417 są wymaganiami produkcyjnymi. Koszt licencji komercyjnej stanowi kompromis za te możliwości.

Dla zespołów, których wymagania obecnie pasują do zakresu BarcodeScanning.Native.Maui, biblioteka jest rozsądna i opłacalna. Dla zespołów, których wymagania wzrosły lub prawdopodobnie wzrosną poza skanowanie kamery na żywo, spójne API IronBarcode dla różnych typów danych wejściowych, platform i celów wdrożenia jest praktyczną alternatywą.

Często Zadawane Pytania

Czym jest BarcodeScanning.MAUI?

BarcodeScanning.MAUI to biblioteka kodów kreskowych .NET służąca do generowania i odczytywania kodów kreskowych w aplikacjach C#. Jest to jedna z kilku alternatyw rozważanych przez programistów przy wyborze rozwiązania do obsługi kodów kreskowych w projektach .NET.

Jakie są główne różnice między BarcodeScanning.MAUI a IronBarcode?

IronBarcode wykorzystuje statyczne, bezstanowe API, które nie wymaga zarządzania instancjami, podczas gdy BarcodeScanning.MAUI zazwyczaj wymaga utworzenia i konfiguracji instancji przed użyciem. IronBarcode zapewnia również natywną obsługę plików PDF, automatyczne wykrywanie formatów oraz licencjonowanie za pomocą jednego klucza we wszystkich środowiskach.

Czy licencja na IronBarcode jest łatwiejsza do uzyskania niż na BarcodeScanning.MAUI?

IronBarcode wykorzystuje pojedynczy klucz licencyjny obejmujący zarówno wdrożenia deweloperskie, jak i produkcyjne. Upraszcza to procesy CI/CD oraz konfiguracje Docker w porównaniu z systemami licencyjnymi, które oddzielają klucze SDK od kluczy środowiska uruchomieniowego.

Czy IronBarcode obsługuje wszystkie formaty kodów kreskowych obsługiwane przez BarcodeScanning.MAUI?

IronBarcode obsługuje ponad 30 symboli kodów kreskowych, w tym QR Code, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 i wiele innych. Automatyczne wykrywanie formatu oznacza, że nie jest wymagane jawne wyliczanie formatów.

Czy IronBarcode obsługuje natywne odczytywanie kodów kreskowych z plików PDF?

Tak. IronBarcode odczytuje kody kreskowe bezpośrednio z plików PDF za pomocą BarcodeReader.Read("document.pdf") bez konieczności korzystania z oddzielnej biblioteki do renderowania plików PDF. Wyniki dla każdej strony obejmują numer strony, format kodu kreskowego, wartość oraz wskaźnik pewności.

W jaki sposób IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu z BarcodeScanning.MAUI?

Metody statyczne IronBarcode są bezstanowe i z natury bezpieczne dla wątków, co umożliwia bezpośrednie użycie Parallel.ForEach bez zarządzania instancjami dla poszczególnych wątków. Nie ma ograniczeń przepustowości w żadnym przedziale cenowym.

Jakie wersje .NET obsługuje IronBarcode?

IronBarcode obsługuje .NET Framework 4.6.2+, .NET Core 3.1 oraz .NET 5, 6, 7, 8 i 9 w jednym pakiecie NuGet. Obsługiwane platformy to Windows x64/x86, Linux x64 oraz macOS x64/ARM.

Jak zainstalować IronBarcode w projekcie .NET?

Zainstaluj IronBarcode za pomocą NuGet: uruchom polecenie „Install-Package IronBarCode” w konsoli menedżera pakietów lub „dotnet add package IronBarCode” w interfejsie CLI. Nie są wymagane żadne dodatkowe instalatory SDK ani pliki uruchomieniowe.

Czy mogę przetestować IronBarcode przed zakupem, w przeciwieństwie do BarcodeScanning.MAUI?

Tak. Tryb próbny IronBarcode zwraca pełne, zdekodowane wartości BarCode — tylko wygenerowane obrazy wyjściowe są opatrzone znakiem wodnym. Przed podjęciem decyzji o zakupie można sprawdzić dokładność odczytu na własnych dokumentach.

Jaka jest różnica w cenie między BarcodeScanning.MAUI a IronBarcode?

Cena IronBarcode zaczyna się od 749 USD za Licencję wieczystą dla jednego programisty, obejmującą etapy rozwoju i produkcji. Szczegóły dotyczące cen i opcji zakupu hurtowego są dostępne na stronie licencyjnej IronBarcode. Nie ma wymogu posiadania oddzielnej licencji na środowisko uruchomieniowe.

Czy migracja z BarcodeScanning.MAUI do IronBarcode jest prosta?

Migracja z BarcodeScanning.MAUI do IronBarcode polega głównie na zastąpieniu wywołań API opartych na instancjach statycznymi metodami IronBarcode, usunięciu standardowych fragmentów kodu dotyczących licencji oraz aktualizacji nazw właściwości wyników. Większość migracji wiąże się raczej z redukcją kodu niż z jego dodawaniem.

Czy IronBarcode generuje kody QR z logo?

Tak. Funkcja QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png") osadza obraz marki w kodzie QR w sposób natywny z konfigurowalną korekcją błędów. Kolorowe kody QR są również obsługiwane za pomocą funkcji ChangeBarCodeColor().

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