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

Syncfusion Barcode vs IronBarcode: Porównanie bibliotek kodów kreskowych C#

ZXing.Net vs IronBarcode: Wybór biblioteki kodów kreskowych .NET w 2026 roku

ZXing.Net's BarcodeReader nie jest bezpieczny w wielowątkowości. Każda równoległa ścieżka odczytu w Twojej aplikacji — każdy równoległy ForEach, każda asynchroniczna akcja kontrolera obsługująca jednoczesne żądania — wymaga własnej instancji czytnika. To oznacza konfigurację formatu dla każdej instancji, Bitmap ładowanie i usuwanie przy każdym wywołaniu oraz alokację czytnika przy każdym żądaniu. Statyczna metoda IronBarcode obsługuje tę samą pracę bez alokacji dla każdego żądania. Bezpieczeństwo wątków to tylko jedna z pozycji na liście: brak natywnej obsługi plików PDF, fragmentacja pakietów wiążących w systemach Windows i Linux oraz wymóg określenia każdego formatu BARCODE, który zamierzasz skanować — to cechy, które powodują, że projekty ZXing.Net z czasem gromadzą obejścia.

Zrozumienie ZXing.Net

ZXing.Net to otwarta wersja biblioteki Java ZXing ("Zebra Crossing") firmy Google, udostępniona na licencjiApache 2.0i utrzymywana przez Michaela Jahna na GitHubie. Jest to najczęściej pobierana biblioteka open source do obsługi kodów kreskowych dla platformy .NET, z wieloletnim doświadczeniem sięgającym ponad dziesięciu lat. Biblioteka obsługuje zarówno odczyt, jak i zapis szerokiego zestawu formatów BarCode, a jej bezpłatna licencja sprawia, że jest dostępna dla projektów każdej wielkości, w tym produktów open source wymagających zależności zgodnych z Apache.

Architektura ZXing.Net odzwierciedla jego pochodzenie jako portu z języka Java. Klasa BarcodeReader to obiekt ze stanem: wywołanie Decode zapisuje stan wewnętrzny, co czyni instancje niebezpiecznymi do dzielenia między wątkami. Prawidłowe użycie równoczesne wymaga nowego czytnika na wątek lub puli ThreadLocal<BarcodeReader> — obie opcje przekładają odpowiedzialność za bezpieczeństwo wątków na wywołującego. Ładowanie obrazów również nie jest zawarte w pakiecie podstawowym; Zamiast tego ZXing.Net udostępnia pakiety powiązań specyficzne dla platformy, z których każdy udostępnia inną powierzchnię API.

Kluczowe cechy architektury obejmują:

  • Licencja Apache 2.0: Bezpłatna do użytku komercyjnego i open source, bez żadnych kosztów i wymogu kontaktu ze sprzedawcą.
  • Czytnik kodów kreskowych ze stanem: Instancja BarcodeReader nie jest bezpieczna w wielowątkowości; Należy utworzyć nową instancję dla każdego wątku lub każdej operacji równoległej.
  • Ręczne określenie formatu: Wywołujący muszą ustawić reader.Options.PossibleFormats przed każdym dekodowaniem; Formaty, które nie zostały wymienione, są pomijane bez wyświetlania błędu ani ostrzeżenia.
  • Brak natywnej obsługi plików PDF: biblioteka odczytuje wyłącznie obrazy; Wprowadzanie plików PDF wymaga oddzielnej biblioteki do renderowania plików PDF, takiej jak PdfiumViewer, w celu konwersji stron na mapy bitowe przed dekodowaniem.
  • Fragmentacja powiązań platformy: Pakiet podstawowy nie zapewnia ładowania obrazów; oddzielne pakiety powiązań (ZXing.Net.Bindings.Windows.Compatibility używając System.Drawing,ZXing.Net.Bindings.ImageSharp / .V2 / .V3używając SixLabors.ImageSharp, plus ZXing.Net.Bindings.SkiaSharp i ZXing.Net.Bindings.Magick) udostępniają różne API dla różnych celów wdrożeniowych.
  • Aktywna społeczność: na GitHubie prowadzone są zgłoszenia, pull requesty i dyskusje, zapewniając bezpłatne wsparcie na poziomie społeczności.
  • Obsługa szerokiej gamy formatów: Obsługuje kody QR, Code 128, Code 39, EAN-13, EAN-8, UPC-A, Data Matrix, PDF 417, Aztec i inne powszechnie stosowane symbole.

Architektura Stateful Reader

ZXing.Net's BarcodeReader wymaga nowej instancji dla każdego wątku lub operacji równoległej. Poniższy wzorzec przedstawia minimalną poprawną konfigurację przetwarzania współbieżnego:

// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing

Parallel.ForEach(imagePaths, Sub(path)
    Dim reader = New BarcodeReader()
    reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    }

    Using bitmap As New Bitmap(path)
        Dim result = reader.Decode(bitmap)

        If result IsNot Nothing Then
            results(path) = result.Text
        End If
    End Using
End Sub)
$vbLabelText   $csharpLabel

Wzorzec ThreadLocal<BarcodeReader> redukuje alokację dla każdego wywołania poprzez ponowne użycie jednej instancji na wątek, ale dodaje złożoność związaną z usuwaniem. W każdym przypadku, odpowiedzialność za bezpieczeństwo wątkowe spoczywa na wywołującym w ZXing.Net.

Zrozumienie IronBarcode

IronBarcode to komercyjna biblioteka IronBarcode opracowana przez firmę Iron Software. Zapewnia odczytywanie i generowanie kodów kreskowych przez bezstanowe statyczne API: BarcodeReader.Read i BarcodeWriter.CreateBarcode to główne punkty wejścia, i żadna z nich nie wymaga tworzenia instancji czy konfiguracji przed użyciem. Biblioteka jest dostarczana jako pojedynczy pakiet NuGet, który działa identycznie w systemach Windows, Linux,macOSoraz w kontenerach Docker bez pakietów powiązanych specyficznych dla danej platformy.

Silnik odczytu IronBarcode automatycznie wykrywa format w ponad 50 symbolikach kodów kreskowych. Dzwoniący nie określają, jakich formatów należy szukać; silnik porównuje każdy obraz ze wszystkimi obsługiwanymi formatami i zwraca każdy znaleziony BARCODE. Dla aplikacji, które muszą balansować między prędkością skanowania a dokładnością, element wyliczenia ReadingSpeed (Faster, Balanced, Detailed, ExtremeDetail) zapewnia kontrolę bez potrzeby wyliczania formatu. Biblioteka zawiera również natywną obsługę plików PDF, umożliwiającą odczytywanie BarCode'ów bezpośrednio z dokumentów PDF na wszystkich stronach bez konieczności stosowania oddzielnej biblioteki do renderowania plików PDF.

Kluczowe cechy obejmują:

  • Licencja komercyjna: Wymaga płatnego klucza licencyjnego; Dostępny jest tryb próbny do oceny.
  • Bezstanowe statyczne API: BarcodeReader.Read i BarcodeWriter.CreateBarcode to bezpieczne wątkowo statyczne metody; Nie jest wymagane zarządzanie instancjami.
  • Automatyczne wykrywanie formatu: Wszystkie ponad 50 obsługiwanych formatów BARCODE jest wykrywanych bez listy formatów; użytkownicy dostosowują prędkość, a nie zakres formatów.
  • Natywna obsługa PDF: BarcodeReader.Read przyjmuje bezpośrednio ścieżki do plików PDF, przetwarzając wszystkie strony bez zewnętrznej biblioteki PDF.
  • Pojedynczy pakiet wielopłatformowy: jeden pakiet NuGet działa na systemach Windows, Linux,macOSi Docker z tym samym interfejsem API.
  • Płynna generacja API: BarcodeWriter.CreateBarcode zwraca obiekt GeneratedBarcode z wbudowanymi metodami wyjścia, w tym SaveAsPng, SaveAsPdf, ToPngBinaryData i ToStream.
  • Wsparcie komercyjne: Licencje płatne obejmują dostęp do zespołu wsparcia Iron Software z gwarancjami poziomu usług.

Porównanie funkcji

Poniższa tabela przedstawia podstawowe różnice między ZXing.Net a IronBarcode:

Funkcja ZXing.Net IronBarcode
Licencja Apache 2.0(bezpłatna) Komercjalne
Bezpieczeństwo wątków Nie jest bezpieczne dla wątków — wymagana nowa instancja na wątek Bezpieczne dla wątków statyczne API
Wykrywanie formatu Ręczne — lista PossibleFormats wymagana Automatyczne — ponad 50 formatów
Odczytywanie plików PDF Nie — wymaga PdfiumViewer lub podobnego oprogramowania Natywny — pojedyncze wywołanie metody
Obsługa platform Oddzielne pakiety wiązania dla każdej platformy Pojedynczy pakiet, wszystkie platformy
Generowanie kodów kreskowych Zwraca Bitmap, wymaga ręcznego zapisu Fluent API z wbudowanym wyjściem
Ceny Bezpłatne Od 749 USD (Lite) / $1,499 (Plus)

Szczegółowe porównanie funkcji

Funkcja ZXing.Net IronBarcode
Czytanie
Odczyt bezpieczny dla wątków Nie — wymagane są instancje na wątek Tak — statyczne bezstanowe API
Automatyczne wykrywanie formatu Nie — wymagane PossibleFormats Tak — wszystkie formaty auto-wykrywane
Wiele kodów kreskowych na obraz Tak — DecodeMultiple Tak — domyślne zachowanie
Odczytywanie BarCodes z plików PDF Nie — wymagana biblioteka zewnętrzna Tak — native
Odzyskiwanie uszkodzonych kodów kreskowych flaga TryHarder Korekcja obrazu wspierana przez ML
Strojenie szybkości / dokładności Redukcja listy formatów enum ReadingSpeed
Generacja
Kod 128 / Kod 39 Tak Tak
Kod QR Tak Tak
QR Code z logo Nie Tak
Dostosowanie koloru QR Code Nie Tak
Wyjście do PNG/JPEG/PDF Ręcznie przez System.Drawing Wbudowane metody wyjściowe
Łańcuch generacji Fluent Nie Tak
Platforma i wdrożenie
Windows (System.Drawing) Tak — ZXing.Net.Bindings.Windows.Compatibility Tak
Linux / Docker Tak —ZXing.Net.Bindings.ImageSharp / .V2 / .V3(inne API) Tak — takie samo API
macOS Tak — ZXing.Net.Bindings.ImageSharp / .V2 / .V3 Tak
Dodatkowe zależności dla Docker Może wymagać libgdiplus None
Pojedynczy pakiet NuGet Nie — rdzeń + powiązanie + opcjonalny ImageSharp Tak
Licencjonowanie i wsparcie
Rodzaj licencji Apache 2.0 Komercjalne
Koszt Bezpłatne Od 749 USD
Wsparcie społeczności Problemy na GitHubie, aktywna społeczność Tak
Komercyjne wsparcie SLA Nie Tak
Przyjazny open-source Tak Nie

Bezpieczeństwo wątkowe i przetwarzanie współbieżne

Bezpieczeństwo wątkowe jest najważniejszą operacyjną różnicą między obiema bibliotekami i ma wpływ na więcej projektów, niż sugerują ostrzeżenia w dokumentacji.

ZXing.Net Podejście

ZXing.Net's BarcodeReader to obiekt ze stanem. Po wywołaniu Decode zostaje zapisany stan wewnętrzny. Jeśli dwa wątki dzielą tę samą instancję, te zapisy rywalizują. Rezultaty są niedeterministyczne: można otrzymać wynik z innego obrazu, null tam, gdzie istnieje kod kreskowy, lub wyjątek. Prawidłowe podejście to stworzenie jednego czytnika na wątek — co oznacza, że każda równoległa lub asynchroniczna ścieżka przydziela czytnik, konfiguruje go, używa raz i wyrzuca:

// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing

Parallel.ForEach(imagePaths, Sub(path)
    Dim reader As New BarcodeReader()
    reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    }

    Using bitmap As New Bitmap(path)
        Dim result = reader.Decode(bitmap)

        If result IsNot Nothing Then
            results(path) = result.Text
        End If
    End Using
End Sub)
$vbLabelText   $csharpLabel

Wzorzec ThreadLocal<BarcodeReader> redukuje alokację dla każdego wywołania poprzez ponowne użycie jednego czytnika na wątek, ale dodaje złożoność związaną z usuwaniem i nadal wymaga konfiguracji formatu dla każdej instancji.

Podejście IronBarcode

BarcodeReader.ReadIronBarcode to bezstanowa statyczna metoda. Nie ma instancji do dzielenia, nie ma instancji do izolowania i nie ma stanu konfiguracji do ochrony. To samo wywołanie działa bezpiecznie z dowolnej liczby współbieżnych wątków:

// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

Parallel.ForEach(imagePaths, path =>
{
    var result = BarcodeReader.Read(path, options).FirstOrDefault();
    if (result != null)
        results[path] = result.Value;
});
// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

Parallel.ForEach(imagePaths, path =>
{
    var result = BarcodeReader.Read(path, options).FirstOrDefault();
    if (result != null)
        results[path] = result.Value;
});
Imports IronBarcode

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

Parallel.ForEach(imagePaths, Sub(path)
    Dim result = BarcodeReader.Read(path, options).FirstOrDefault()
    If result IsNot Nothing Then
        results(path) = result.Value
    End If
End Sub)
$vbLabelText   $csharpLabel

Dokumentacja IronBarcode'a asynchroniczne i wielowątkowe czytanie kodów kreskowych wyjaśnia wewnętrzny model puli wątków. Właściwość MaxParallelThreads kontroluje stopień równoległości bez potrzeby zewnętrznej koordynacji.

Detekcja formatu

Polityka wykrywania formatu to druga znacząca różnica operacyjna między obiema bibliotekami.

ZXing.Net Podejście

ZXing.Net wymaga, aby reader.Options.PossibleFormats było wypełniane przed każdym dekodowaniem. Jeśli format kodu kreskowego nie jest wymieniony, nie zostanie wykryty — bez błędu, ostrzeżenia i częściowego wyniku:

// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.UPC_A,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;

using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.UPC_A,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;

using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
Imports ZXing
Imports ZXing.Common

' ZXing.Net: PossibleFormats list controls which symbologies are decoded
Dim reader As New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.UPC_A,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF_417
}
reader.Options.TryHarder = True

Using bitmap As New Bitmap(imagePath)
    Dim results = reader.DecodeMultiple(bitmap)
End Using
$vbLabelText   $csharpLabel

Jeśli wszystkie formaty są wymienione, aby uniknąć pominięć, wydajność ulega pogorszeniu. Jeśli umieszczone są tylko oczekiwane formaty, ciche pominięcia stają się ryzykiem, gdy obrazy pochodzą z zewnętrznych źródeł. Nie ma mechanizmu, aby ZXing.Net zgłaszał, że znalazł kod kreskowy w nieznanym formacie.

Podejście IronBarcode

IronBarcode automatycznie wykrywa wszystkie 50+ obsługiwanych formatów. Nie jest wymagana lub akceptowana lista formatów:

// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
    Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
    Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
Imports IronBarcode

' IronBarcode: automatic detection across all supported formats
Dim results = BarcodeReader.Read(imagePath)
For Each barcode In results
    Console.WriteLine($"{barcode.Value} ({barcode.Format})")
Next
$vbLabelText   $csharpLabel

Dla aplikacji, które dostosowują prędkość odczytu do dokładności wykrywania,IronBarcode udostępnia enum ReadingSpeedFaster, Balanced, Detailed, ExtremeDetail — bez potrzeby wyliczania formatu. Strojenie szybkości wpływa na to, jak agresywnie silnik przetwarza każdy obraz, a nie które formaty rozważa.

Wsparcie dla dokumentów PDF

Czytanie PDF to twarda granica w ZXing.Net: biblioteka nie ma żadnego wsparcia dla PDF.

ZXing.Net Podejście

Gdy kod kreskowy przychodzi osadzony w PDF, ZXing.Net wymaga zewnętrznej biblioteki renderującej PDF. Najczęstsze obejście używa PdfiumViewer, który dodaje około 20 MB natywnych binariów i pętlę renderowania stron, którą wywołujący musi zaimplementować i utrzymywać:

// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);

var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.PDF_417
};

for (int i = 0; i < pdfDocument.PageCount; i++)
{
    string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
    try
    {
        using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
        pageImage.Save(tempPath, ImageFormat.Png);

        using var bitmap = new Bitmap(tempPath);
        var decoded = reader.DecodeMultiple(bitmap);
        if (decoded != null)
            results.AddRange(decoded.Select(d => d.Text));
    }
    finally
    {
        File.Delete(tempPath);
    }
}
// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);

var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.PDF_417
};

for (int i = 0; i < pdfDocument.PageCount; i++)
{
    string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
    try
    {
        using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
        pageImage.Save(tempPath, ImageFormat.Png);

        using var bitmap = new Bitmap(tempPath);
        var decoded = reader.DecodeMultiple(bitmap);
        if (decoded != null)
            results.AddRange(decoded.Select(d => d.Text));
    }
    finally
    {
        File.Delete(tempPath);
    }
}
Imports System.IO
Imports System.Drawing
Imports PdfiumViewer
Imports ZXing
Imports ZXing.Common

' ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
Using pdfDocument As PdfDocument = PdfDocument.Load(pdfPath)

    Dim reader As New BarcodeReader()
    reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.PDF_417
    }

    For i As Integer = 0 To pdfDocument.PageCount - 1
        Dim tempPath As String = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png")
        Try
            Using pageImage As Image = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi)
                pageImage.Save(tempPath, Imaging.ImageFormat.Png)

                Using bitmap As New Bitmap(tempPath)
                    Dim decoded = reader.DecodeMultiple(bitmap)
                    If decoded IsNot Nothing Then
                        results.AddRange(decoded.Select(Function(d) d.Text))
                    End If
                End Using
            End Using
        Finally
            File.Delete(tempPath)
        End Try
    Next
End Using
$vbLabelText   $csharpLabel

Ten wzorzec ma rzeczywiste tryby awarii: błędna konfiguracja DPI powoduje ciche pominięcia, uprawnienia do plików tymczasowych zawodzą w izolowanych środowiskach, natywne biblioteki PdfiumViewer wymagają odrębnego zarządzania wdrożeniem, a konfiguracja nie działa na Linuxie bez dodatkowej konfiguracji.

Podejście IronBarcode

IronBarcode czyta kody kreskowe z PDF-ów natywnie — wszystkie strony, wszystkie formaty, bez zewnętrznych zależności. To samo wywołanie BarcodeReader.Read przyjmuje bezpośrednio ścieżki PDF:

// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
Imports IronBarcode

' IronBarcode: one call processes every page of the PDF
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}")
Next
$vbLabelText   $csharpLabel

Brak enumeracji stron, brak konfiguracji DPI, brak plików tymczasowych, brak oddzielnej biblioteki do wdrożenia razem z aplikacją.

Wiązania Platformowe i Wdrożenie

Obsługa obrazu w ZXing.Net jest rozproszona wśród specyficznych dla platform pakietów wiążących, z których każdy ma inną powierzchnię API.

ZXing.Net Podejście

Podstawowy pakiet ZXing.Net zapewnia logikę dekodowania, ale nie ładowanie obrazów. Wywołujący musi wybrać wiązanie w oparciu o swój docelowy cel wdrożenia:

Środowisko Pakiet Uwagi
Pulpit Windows / WPF ZXing.Net.Bindings.Windows.Compatibility Używa System.Drawing — przyjazne dla Windows; wymaga libgdiplus na Linux
Linux / Docker / międzyplatformowy ZXing.Net.Bindings.ImageSharp / .V2 / .V3 Inna powierzchnia API; dodaje zależność SixLabors.ImageSharp (V2/V3 śledzą główne wersje ImageSharp)
macOS ZXing.Net.Bindings.ImageSharp / .V2 / .V3 Taki sam ścieżkę jak Linux

Praktyczną konsekwencją jest to, że kod Windows używający System.Drawing.Bitmap nie kompiluje się ani nie działa na Linux. Konteneryzacja wymaga zmiany pakietów wiążących i przepisania kodu ładowania obrazów:

// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;

var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;

var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
Imports ZXing.Windows.Compatibility
Imports System.Drawing

Dim reader As New BarcodeReader()
Using bitmap As New Bitmap(imagePath)
    Dim result = reader.Decode(bitmap)
End Using
$vbLabelText   $csharpLabel
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
Imports ZXing.ImageSharp
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats

Dim reader As New BarcodeReader(Of Rgba32)()
Using image As Image(Of Rgba32) = Image.Load(Of Rgba32)(imagePath)
    Dim result = reader.Decode(image)
End Using
$vbLabelText   $csharpLabel

Użycie powiązań Windows na hoście Linux również wymaga libgdiplus w obrazie Docker, co dodaje około 50 MB do kontenera.

Podejście IronBarcode

IronBarcode dostarcza jeden pakiet dla wszystkich platform. To samo wywołanie BarcodeReader.Read(path) kompiluje i działa identycznie na Windows, Linux,macOSi wewnątrz kontenerów Docker. Nie są wymagane pakiety wiążące, warunki dla platform i dodatkowe zależności systemowe. Dla zespołów konteneryzujących aplikacje .NET, przewodnik setup IronBarcode dla Docker i Linux obejmuje wzorzec wdrożenia pakietu pojedynczego w szczegółach.

Generowanie API

Obie biblioteki generują kody kreskowe, ale API odzwierciedla różne podejścia projektowe.

ZXing.Net Podejście

Klasa BarcodeWriter ZXing.Net tworzy obiekt pisarza, przyjmuje opcje kodowania, wywołuje Write, i zwraca Bitmap, który wywołujący muszą zapisać ręcznie używając System.Drawing.Imaging:

// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;

var writer = new BarcodeWriter
{
    Format = BarcodeFormat.CODE_128,
    Options = new EncodingOptions
    {
        Width = 300,
        Height = 100,
        Margin = 10
    }
};

using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;

var writer = new BarcodeWriter
{
    Format = BarcodeFormat.CODE_128,
    Options = new EncodingOptions
    {
        Width = 300,
        Height = 100,
        Margin = 10
    }
};

using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
Imports ZXing
Imports ZXing.Common
Imports ZXing.Windows.Compatibility
Imports System.Drawing.Imaging

Dim writer As New BarcodeWriter With {
    .Format = BarcodeFormat.CODE_128,
    .Options = New EncodingOptions With {
        .Width = 300,
        .Height = 100,
        .Margin = 10
    }
}

Using bitmap = writer.Write("PRODUCT-001")
    bitmap.Save("output.png", ImageFormat.Png)
End Using
$vbLabelText   $csharpLabel

Zapis do formatów innych niż PNG lub JPEG, zapis do PDF lub tworzenie wyjścia binarnego dla odpowiedzi HTTP wymaga dodatkowych System.Drawing, które implementuje wywołujący.

Podejście IronBarcode

BarcodeWriter.CreateBarcodeIronBarcode zwraca obiekt GeneratedBarcode, który zapewnia wbudowane metody wyjścia przez łańcuch płynny:

// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng("output.png");
// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng("output.png");
Imports IronBarCode

' IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng("output.png")
$vbLabelText   $csharpLabel

Obiekt GeneratedBarcode również udostępnia .ToPngBinaryData(), .ToJpegBinaryData(), .ToStream() i .SaveAsPdf() — cele wyjścia, które ZXing.Net wymaga, aby wywołujący samodzielnie zaimplementowali przy użyciu System.Drawing.

Przewodnik po mapowaniu API

ZXing.Net IronBarcode Uwagi
new BarcodeReader() Statyczne — brak instancji BarcodeReader.Read(...) to wywołanie statyczne
reader.Options.PossibleFormats = new List<BarcodeFormat> { ... } Nie jest potrzebne Automatyczne wykrywanie obejmuje wszystkie formaty
reader.Options.TryHarder = true Speed = ReadingSpeed.Balanced Dostrajanie dokładności przez BarcodeReaderOptions
reader.Decode(bitmap) BarcodeReader.Read(imagePath) Przekaż ścieżkę bezpośrednio — nie potrzebne Bitmap
reader.DecodeMultiple(bitmap) BarcodeReader.Read(imagePath) Zawsze zwraca kolekcję
result.Text result.Value Zmieniono nazwę właściwości
result.BarcodeFormat result.Format Zmieniono nazwę właściwości
BarcodeFormat.QR_CODE BarcodeEncoding.QRCode Zmiana konwencji nazewnictwa enumów
BarcodeFormat.CODE_128 BarcodeEncoding.Code128 Zmiana konwencji nazewnictwa enumów
BarcodeFormat.EAN_13 BarcodeEncoding.EAN13 Zmiana konwencji nazewnictwa enumów
new BarcodeWriter { Format = BarcodeFormat.CODE_128, Options = new EncodingOptions { ... } } BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) Statyczna metoda fabryczna
writer.Write(data) zwraca Bitmap .SaveAsPng(path) / .ToPngBinaryData() Wbudowane metody wyjścia na GeneratedBarcode
Brak obsługi plików PDF — wymagany jest PdfiumViewer BarcodeReader.Read("doc.pdf") Natywna obsługa plików PDF
Nie jest bezpieczne dla wątków Bezpieczne dla wątków statyczne API Nie jest wymagane zarządzanie instancjami

Kiedy zespoły rozważają przejście z ZXing.Net na IronBarcode

Istnieje kilka scenariuszy, w których zespoły programistów rozważająIronBarcode jako alternatywę dla ZXing.Net.

Przetwarzanie równoległe i o wysokiej przepustowości

Integracja ZXing.Net, która działa poprawnie w jednowątkowej aplikacji konsolowej, może wykazywać zachowanie niedeterministyczne, gdy ten sam kod zostanie przeniesiony do kontrolera ASP.NET Core obsługującego równoczesne żądania lub do zadania w tle, które przetwarza partie danych równolegle. Wymagany przez ZXing.Net wzorzec instancji na wątek oznacza, że każde żądanie lub zadanie równoległe przydziela pełny obiekt czytnika z skonfigurowanym zestawem dekoderów, używa go raz, a następnie odrzuca. Wraz ze wzrostem liczby zgłoszeń presja związana z alokacją zasobów staje się wymierna. Zespoły, które osiągają ten etap — zwłaszcza te korzystające z wysokowydajnych potoków skanowania w logistyce, magazynowaniu lub przetwarzaniu dokumentów — często poszukują biblioteki, której model wątków nie nakłada tego obciążenia na każdego wywołującego.

Skanowanie dokumentów o mieszanym formacie

Aplikacje, które akceptują dokumenty od stron trzecich, często napotykają formaty BARCODE, których nie przewidziano podczas konfiguracji listy formatów. Integracja wysyłkowa stworzona dla Code 128 odbiera przesyłkę od partnera za pomocą kodów QR. System dokumentacji medycznej skonfigurowany dla formatu PDF 417 napotyka symbole Data Matrix od nowego dostawcy sprzętu. W ZXing.Net każdy z tych przypadków powoduje cichą wartość null zamiast błędu dekodowania, co oznacza, że pominięcie może nie ujawnić się, dopóki nie zawiedzie dalsze przetwarzanie. Zespoły, które poniosły straty z powodu niezauważonych błędów formatowania — szczególnie w sytuacjach, gdzie brak BarCODE'a ma konsekwencje biznesowe — zaczynają rozważać koszty utrzymania listy formatów w porównaniu z biblioteką, która automatycznie wykrywa formaty.

Ekstrakcja BarCodes z plików PDF

Wiele dokumentów biznesowych przychodzi w formacie PDF: faktury, listy przewozowe, dokumentacja pacjentów, certyfikaty zgodności. ZXing.Net nie może odczytać tych plików bezpośrednio. Zespoły, które muszą wyodrębniać kody kreskowe z plików PDF, w końcu budują i utrzymują potok renderowania oparty na ZXing.Net — wybierając bibliotekę PDF, zarządzając jej natywnymi zależnościami, wdrażając pętlę renderowania stron, obsługując konfigurację DPI i pisząc logikę czyszczenia plików tymczasowych. Ten kod infrastruktury nie jest logiką BarCode; istnieje wyłącznie po to, aby wypełnić lukę między tym, co akceptuje ZXing.Net (mapy bitowe), a tym, czym faktycznie są dokumenty biznesowe (pliki PDF). Zespoły, które muszą utrzymywać ten pomost — zwłaszcza gdy sama biblioteka PDF ma własne wymagania dotyczące licencji, wdrażania i platformy — często preferują jedną bibliotekę, która obsługuje cały zakres danych wejściowych.

Zmniejszenie złożoności powiązań

Projekty, które rozpoczynają się w systemie Windows, a następnie są wdrażane w systemie Linux lub Docker, bezpośrednio napotykają problem fragmentacji powiązań ZXing.Net: pakiet powiązań dla systemu Windows wykorzystuje inne API niż wielopłatformowe powiązanie ImageSharp, a przełączanie się między nimi wymaga zmiany zarówno odwołań NuGet, jak i kodu ładującego obrazy. Zespoły, które rutynowo konteneryzują swoje aplikacje .NET lub które uruchamiają ten sam kod na komputerach programistów (Windows lub macOS) i serwerach produkcyjnych (Linux), zauważają, że utrzymywanie dwóch ścieżek kodu do ładowania obrazów utrudnia każdą przyszłą zmianę w warstwie skanującej.

Typowe kwestie związane z migracją

Zespoły przechodzące z ZXing.Net na IronBarcode powinny zaplanować te konkretne zmiany techniczne.

Usunięcie instancji BarcodeReader

Każde wywołanie new BarcodeReader() w kodzie jest usuwane podczas migracji. Wzorzec instancjonowania — utworzenie czytnika, konfiguracja formatu, ładowanie obrazu, wywołanie dekodowania — sprowadza się do jednego wywołania metody statycznej. Pliki, które importują przestrzenie nazw ZXing, ZXing.Common, ZXing.Windows.Compatibility, ZXing.ImageSharp i SixLabors.ImageSharp, mają te importy usunięte i zastąpione jednym using IronBarCode;.

Usunięcie konfiguracji PossibleFormats

Blok przypisania reader.Options.PossibleFormats jest usuwany w każdym miejscu wywołania.IronBarcode wykonuje automatyczne wykrywanie formatu i nie akceptuje listy ograniczeń formatu. Flaga TryHarder jest zastępowana właściwością ReadingSpeed na BarcodeReaderOptions, która kontroluje wysiłek wykrywania bez zawężania zakresu formatu.

Porządkowanie pakietów wiązanych

Migracja usuwa ZXing.Net, ZXing.Net.Bindings.Windows.Compatibility, dowolny wariant ZXing.Net.Bindings.ImageSharp (.V2 / .V3), oraz dowolne pakiety PdfiumViewer, które zostały dodane do wsparcia odczytu PDF. Jeśli libgdiplus zostało dodane do pliku Dockerfile, aby wspierać System.Drawing poprzez powiązanie Windows na Linux, ta linia jest również usuwana.IronBarcode nie wymaga żadnych zależności specyficznych dla platformy w obrazie Docker.

Dodatkowe możliwości IronBarcode

Oprócz funkcji omówionych w powyższych sekcjach porównawczych,IronBarcode oferuje:

  • Kod QR z osadzonym logo: Generuj kody QR z niestandardowym obrazem logo umieszczonym w centrum, z automatyczną korekcją błędów, aby zapewnić możliwość skanowania.
  • Dostosowanie kolorów kodów QR: Ustawianie kolorów pierwszego planu i tła na generowanych kodach QR w celu uzyskania wyników zgodnych z wizerunkiem marki.
  • Umieszczanie BarCode'ów w plikach PDF: Umieszczaj BarCode'y bezpośrednio na istniejących stronach PDF w określonych współrzędnych bez konieczności korzystania z oddzielnej biblioteki PDF.
  • Obsługa BarCode'ów GS1: Odczyt i generowanie BarCode'ów w formacie GS1, w tym GS1-128 i GS1 DataBar, stosowanych w łańcuchach dostaw w handlu detalicznym i służbie zdrowia.
  • Równoległe async czytanie: Wbudowane metody asynchroniczne do integracji czytania kodów kreskowych w rurociągach await bez blokowania.
  • Korekcja obrazów oparta na ML: Automatyczne ulepszanie obrazu dla uszkodzonych, rozmazanych lub niskokontrastowych kodów kreskowych, których TryHarder nie może odzyskać.

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

IronBarcode jest zgodny ze standardem .NET 2.0 i nowszymi, zapewniając kompatybilność z .NET Framework 4.6.2+, .NET Core 3.1, .NET 5, .NET 6, .NET 7, .NET 8 i .NET 9. Biblioteka jest regularnie aktualizowana zgodnie z cyklem wydawniczym .NET Microsoftu, co zapewnia dostępność kompatybilności z .NET 10 w momencie lub blisko daty wydania. ZXing.Net zapewnia również szeroką kompatybilność z platformą .NET dzięki pakietom NuGet, a z tego punktu widzenia obie biblioteki nadają się do nowoczesnych projektów .NET.

Wnioski

ZXing.Net i IronBarcode reprezentują różne filozofie projektowania bibliotek kodów kreskowych. ZXing.Net to biblioteka stanowa, oparta na instancjach, która całkowicie przekazuje odpowiedzialność za wątki, specyfikację formatu i mostkowanie PDF na stronę wywołującego. Biblioteka IronBarcode to bezstanowa biblioteka ze statycznym interfejsem API, która internalizuje wielowątkowość, automatycznie wykrywa formaty i natywnie obsługuje dane wejściowe w formacie PDF. Praktyczną konsekwencją tej różnicy jest to, że kod ZXing.Net w kontekstach współbieżnych lub przetwarzania dokumentów ma tendencję do gromadzenia infrastruktury — wzorców instancji na wątek, list formatów, potoków renderowania PDF oraz gałęzi powiązań specyficznych dla platformy — podczas gdy kod IronBarcode dla tych samych scenariuszy nie wymaga żadnej z tych struktur otaczających.

ZXing.Net to naprawdę dobry wybór dla projektów, w których wymagany jest zerowy koszt. LicencjaApache 2.0sprawia, że jest on kompatybilny z projektami open source oraz z produktami komercyjnymi, które preferują darmowe zależności. W kontrolowanych środowiskach — znanych formatach BARCODE, czystych obrazach, przetwarzaniu jednowątkowym lub lekko współbieżnym — działa niezawodnie. Aktywna społeczność GitHub zapewnia szybkie odpowiedzi na zgłoszenia, a zakres obsługiwanych formatów jest porównywalny z komercyjnymi alternatywami. W zastosowaniach, w których spełnione są te warunki, przewaga kosztowa ZXing.Net jest realna, a jego ograniczenia techniczne są możliwe do opanowania.

IronBarcode rozwiązuje problemy, w których ograniczenia projektowe ZXing.Net przekładają się na koszty operacyjne: współbieżne interfejsy API, gdzie przydział instancji na żądanie jest mierzalny; potoki dokumentów, gdzie dane wejściowe w formacie PDF są normą, a nie wyjątkiem; skanowanie w różnych formatach, gdzie niezauważone pominięcia niosą ze sobą ryzyko biznesowe; oraz wdrożenia wielopłatformowe, gdzie dwa pakiety wiązania oznaczają dwie ścieżki kodu. W tych kontekstach komercyjna licencja biblioteki zapewnia model wątków, który nie narzuca zarządzania instancjami, wykrywanie formatów, które nie wymaga konserwacji, oraz obsługę plików PDF, która nie wymaga drugiej biblioteki.

Decyzja zależy od wymagań projektu. Prototyp w jednym formacie, skaner typu open source lub narzędzie o niewielkiej wydajności, w przypadku którego koszt stanowi wiążące ograniczenie — to sytuacje, w których ZXing.Net jest właściwym wyborem. Produkcyjne API internetowe przetwarzające dokumenty z zewnętrznych źródeł w wielu wątkach — to właśnie tam założenia projektowe IronBarcode pokrywają się z rzeczywistością operacyjną. Aby uzyskać szerszy obraz porównania bibliotek pod kątem wskaźników wykrywalności i rzeczywistych scenariuszy skanowania, dodatkową analizę zapewnia porównanie skanerów kodów kreskowych ZXing.Net i IronBarcode.

Często Zadawane Pytania

Czym jest ZXing.Net?

ZXing.Net to biblioteka .NET do generowania i odczytywania kodów kreskowych w aplikacjach C#. Jest jedną z kilku alternatyw, które programiści oceniają, wybierając rozwiązanie kodów kreskowych dla projektów .NET.

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

IronBarcode używa statycznego, bezstanowego API, które nie wymaga zarządzania instancjami, podczas gdy ZXing.Net zazwyczaj wymaga utworzenia instancji i konfiguracji przed użyciem. IronBarcode zapewnia również natywne wsparcie PDF, automatyczne wykrywanie formatu i pojedyncze licencjonowanie kluczy we wszystkich środowiskach.

Czy IronBarcode jest łatwiejszy do licencjonowania niż ZXing.Net?

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, które obsługuje ZXing.Net?

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.

Jak IronBarcode obsługuje przetwarzanie wsadowe w porównaniu z ZXing.Net?

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ę ocenić IronBarcode przed zakupem, w przeciwieństwie do ZXing.Net?

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 cenowa między ZXing.Net 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 łatwo jest migrować z ZXing.Net do IronBarcode?

Migracja z ZXing.Net do IronBarcode polega głównie na zastąpieniu wywołań API na bazie instancji metodami statycznymi IronBarcode, usunięciu szablonu licencjonowania i aktualizacji nazw właściwości wyników. Większość migracji polega na redukcji kodu, a nie na jego dodawaniu.

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