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

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

QRCoder ma jedną wyjątkową zaletę: generuje kody QR w czystym C# bez żadnych zewnętrznych zależności, z nieograniczoną licencją MIT i przemyślanym API, które obsługuje wszystko, od standardowego formatowania danych po różne renderery wyjściowe. Ponad 8 milionów pobrań z NuGet świadczy o jego renomie. Porównanie z IronBarcode nie jest oceną jakości — jest to kwestia zakresu. IronBarcode obsługuje ponad 50 formatów BARCODE, odczytuje je i zapisuje oraz integruje się z dokumentami PDF za pośrednictwem jednego spójnego interfejsu API. Dla zespołów, których wymagania wykraczają poza generowanie kodów QR, kluczowe znaczenie ma zrozumieniuiuiuiuie, gdzie celowo kończy się zakres funkcji QRCodera.

Zrozumienie QRCoder

QRCoder został stworzony przez Raffaela Herrmanna w 2013 roku, a obecnie jest utrzymywany przez Shane32. Biblioteka jest napisana w całości w języku C# i nie ma żadnych zewnętrznych zależności — nie ma konfliktów wersji SkiaSharp, nie ma problemów z licencjami komercyjnymi ImageSharp, nie ma też natywnych plików binarnych do wdrożenia. Działa na każdej platformie, na której działa .NET.

Licencja MIT jest rzeczywiście nieograniczona. W przeciwieństwie do niektórych popularnych bibliotek, w których przekroczenie progu przychodów powoduje konieczność uzyskania licencji komercyjnej, QRCoder nie zawiera żadnych ukrytych ograniczeń komercyjnych. To rozróżnienie ma znaczenie dla zespołów tworzących aplikacje komercyjne.

Klasa PayloadGenerator wnosi znaczną wartość praktyczną: obsługuje popularne formaty danych kodów QR — dane logowania do sieci Wi-Fi, wizytówki (vCard), wydarzenia kalendarza, wiadomości SMS i punkty geolokalizacyjne — dzięki czemu programiści nie muszą zapamiętywać formatu danych dla każdego standardu. Różnorodność rendererów jest również duża w wielu typach wyjściowych.

Kluczowe cechy architektury:

  • Zero zależności zewnętrznych: czysty C# bez wymagań dotyczących środowiska uruchomieniowego innych firm, co upraszcza wdrażanie w środowiskach kontenerowych lub o ograniczonym dostępie
  • Licencja MIT bez ograniczeń dotyczących przychodów: prawdziwie bezpłatna do użytku komercyjnego bez progów przychodów ani warunków komercyjnych
  • PayloadGenerator Helpers: wbudowane formatatory dla standardów WiFi, vCard, CalendarEvent, SMS, Geo i innych popularnych standardów danych QR
  • Różnorodność rendererów: bajty PNG, ciąg znaków SVG, grafika ASCII, Base64, BMP oraz kilka dodatkowych formatów wyjściowych
  • Pełna kontrola korekcji błędów: dostępne są wszystkie cztery poziomy ECC (L, M, Q, H)
  • Obsługa Micro QR: kompaktowa odmiana kodu QR przeznaczona do etykiet o ograniczonej przestrzeni, niedostępna we wszystkich bibliotekach BarCode
  • Projekt wyłącznie dla kodów QR: Interfejs API obejmuje wyłącznie generowanie kodów QR — bez formatów 1D, bez DataMatrix, bez odczytu kodów BarCode

Projekt wyłącznie z kodem QR

QRCoder oddziela etap tworzenia danych od etapu renderowania. QRCodeGenerator generuje obiekt pośredni QRCodeData, który jest następnie przekazywany do klasy renderującej. Ten wzorzec zapewnia precyzyjną kontrolę nad formatem wyjściowym kosztem dodatkowych obiektów:

using QRCoder;
using System.IO;

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(
    "https://example.com",
    QRCodeGenerator.ECCLevel.M
);

// PNG bytes via PngByteQRCode
var pngQR = new PngByteQRCode(qrCodeData);
byte[] pngBytes = pngQR.GetGraphic(20); // 20px per module
File.WriteAllBytes("qr.png", pngBytes);

// SVG string via SvgQRCode
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("qr.svg", svgContent);
using QRCoder;
using System.IO;

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(
    "https://example.com",
    QRCodeGenerator.ECCLevel.M
);

// PNG bytes via PngByteQRCode
var pngQR = new PngByteQRCode(qrCodeData);
byte[] pngBytes = pngQR.GetGraphic(20); // 20px per module
File.WriteAllBytes("qr.png", pngBytes);

// SVG string via SvgQRCode
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("qr.svg", svgContent);
Imports QRCoder
Imports System.IO

Dim qrGenerator As New QRCodeGenerator()
Dim qrCodeData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)

' PNG bytes via PngByteQRCode
Dim pngQR As New PngByteQRCode(qrCodeData)
Dim pngBytes As Byte() = pngQR.GetGraphic(20) ' 20px per module
File.WriteAllBytes("qr.png", pngBytes)

' SVG string via SvgQRCode
Dim svgContent As String = New SvgQRCode(qrCodeData).GetGraphic(10)
File.WriteAllText("qr.svg", svgContent)
$vbLabelText   $csharpLabel

Metoda QRCodeGenerator.CreateQrCode jest jedynym punktem wejścia do tworzenia kodu — nie ma CreateCode128, nie ma CreateDataMatrix, nie ma CreateEAN13. Biblioteka w pełni odpowiada zamierzonemu zakresowi.

Zrozumienie IronBarcode

IronBarcode to komercyjna biblioteka IronBarcode for .NET firmy Iron Software, która obsługuje generowanie i odczytywanie ponad 50 formatów kodów kreskowych za pośrednictwem jednego, spójnego interfejsu API. Zamiast utrzymywać oddzielne biblioteki dla różnych rodzin formatów, IronBarcode udostępnia wszystkie formaty poprzez parametry BarcodeEncoding w tych samych statycznych punktach wejścia BarcodeWriter i BarcodeReader.

Biblioteka wykorzystuje statyczny model API: BarcodeWriter.CreateBarcode nie wymaga konfiguracji instancji, a BarcodeReader.Read akceptuje ścieżki plików, strumienie, tablice bajtów oraz obiekty System.Drawing.Bitmap z automatycznym wykrywaniem wielu formatów. Obsługa dokumentów PDF — zarówno odczytywanie BARCODE-ów ze stron PDF, jak i osadzanie BARCODE-ów w plikach PDF — jest dostępna bez zewnętrznych zależności.

Kluczowe cechy:

  • Ponad 50 formatów BARCODE: QR Code, Code 128, EAN-13, UPC-A, DataMatrix, PDF417, Aztec, MaxiCode i wiele innych za pomocą jednego parametru BarcodeEncoding
  • Zintegrowany interfejs API do odczytu: BarcodeReader.Read obsługuje obrazy, pliki PDF i strumienie z automatycznym wykrywaniem formatu — nie jest wymagańa żadna dodatkowa biblioteka
  • Dostosowywanie kodów QR: osadzanie logo, zmiany kolorów i kontrola strefy ciszy za pomocą metod QRCodeWriter
  • Integracja z PDF: odczytuj BarCodes ze stron PDF i umieszczaj je w istniejących dokumentach PDF
  • Model statycznego API: Nie jest wymagańa instancja generatora — BarcodeWriter jest klasą statyczną
  • Licencja komercyjna: od 749 USD za licencję dla jednego programisty bez ograniczeń dotyczących formatów

Porównanie funkcji

Poniższa tabela podsumowuje podstawowe różnice między QRCoder a IronBarcode:

Funkcja QRCoder IronBarcode
Generowanie kodów QR Tak — doskonałe Tak
Generowanie kodów kreskowych 1D Nie Tak (ponad 30 formatów)
Inne formaty 2D Nie Tak (DataMatrix, PDF417, Aztec itp.)
Odczytywanie BarCode Nie Tak — automatyczne wykrywanie
Obsługa plików PDF Nie Tak — przeczytaj i zatwierdź
Licencja MIT — prawdziwie darmowe Wersja komercyjna (749 USD dla jednego programisty)

Szczegółowe porównanie funkcji

Funkcja QRCoder IronBarcode
Generacja
Kod QR Tak Tak
Micro QR Tak Nie
Kod 128 Nie Tak
EAN-13 / UPC-A Nie Tak
DataMatrix Nie Tak
PDF417 Nie Tak
Aztec Nie Tak
Łączna liczba formatów 1 50+
Funkcje kodów QR
Korekta błędów (L/M/Q/H) Tak Tak
Osadzanie logo Tak Tak
Dostosowanie kolorów Tak Tak
Wynik w formacie SVG Tak Tak
Wynik w postaci grafiki ASCII Tak Nie
Wynik w formacie Base64 Tak Nie
Pomocniki PayloadGenerator Tak Nie — ręczne tworzenie ciągów znaków
Czytanie
Odkoduj z obrazu Nie Tak
Dekoduj z pliku PDF Nie Tak
Automatyczne wykrywanie formatowania Nie Tak
Integracja
Stemplowanie BarCode w plikach PDF Nie Tak
Brak zewnętrznych zależności Tak Samodzielny
Licencjonowanie
Rodzaj licencji MIT Komercjalne
Ograniczenia dotyczące przychodów None None
Ceny według formatu None None

Generowanie kodów QR

Obie biblioteki generują kody QR, ale ich interfejsy API odzwierciedlają różne filozofie projektowania w zakresie wzajemnych powiązań między etapem generowania a etapem renderowania.

Podejście QRCoder

QRCoder wykorzystuje schemat dwufazowy: QRCodeGenerator.CreateQrCode generuje obiekt pośredni QRCodeData, który koduje dane i poziom korekcji błędów, a oddzielna klasa renderująca konwertuje ten obiekt pośredni na pożądany format wyjściowy. Poziom ECC jest parametrem wymagańym, który nie ma wartości domyślnej — programiści muszą dokonać wyraźnego wyboru:

using QRCoder;
using System.IO;

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(
    "https://example.com",
    QRCodeGenerator.ECCLevel.M
);

var qrCode = new PngByteQRCode(qrCodeData);
byte[] pngBytes = qrCode.GetGraphic(20); // pixels per module
File.WriteAllBytes("qr.png", pngBytes);
using QRCoder;
using System.IO;

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(
    "https://example.com",
    QRCodeGenerator.ECCLevel.M
);

var qrCode = new PngByteQRCode(qrCodeData);
byte[] pngBytes = qrCode.GetGraphic(20); // pixels per module
File.WriteAllBytes("qr.png", pngBytes);
Imports QRCoder
Imports System.IO

Dim qrGenerator As New QRCodeGenerator()
Dim qrCodeData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)

Dim qrCode As New PngByteQRCode(qrCodeData)
Dim pngBytes As Byte() = qrCode.GetGraphic(20) ' pixels per module
File.WriteAllBytes("qr.png", pngBytes)
$vbLabelText   $csharpLabel

Zaletą tego wzorca jest możliwość ponownego wykorzystania obiektu qrCodeData dla wielu formatów wyjściowych bez konieczności ponownego generowania danych kodu. Klasy rendererów obejmują między innymi PngByteQRCode, SvgQRCode, AsciiQRCode, Base64QRCode oraz BitmapByteQRCode.

Podejście IronBarcode

IronBarcode łączy generowanie i renderowanie w płynny łańcuch w statycznej klasie BarcodeWriter. Parametr BarcodeEncoding.QRCode wybiera format, a metody końcowe, takie jak SaveAsPng lub ToPngBinaryData, określają wynik:

using IronBarCode;

// Single fluent call — no intermediate objects
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .SaveAsPng("qr.png");
using IronBarCode;

// Single fluent call — no intermediate objects
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .SaveAsPng("qr.png");
Imports IronBarCode

' Single fluent call — no intermediate objects
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .ResizeTo(400, 400) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

W przypadkach wymagających wyraźnej kontroli korekty błędów klasa QRCodeWriter zapewnia opcje specyficzne dla danego formatu:

using IronBarCode;

var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Medium
);
qr.SaveAsPng("qr.png");
using IronBarCode;

var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Medium
);
qr.SaveAsPng("qr.png");
Imports IronBarCode

Dim qr = QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Medium)
qr.SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

Przewodnik po tworzeniu kodów kreskowych 2D IronBarcode obejmuje wszystkie obsługiwane formaty 2D, w tym QR Code, DataMatrix, PDF417 i Aztec, poprzez ten sam punkt wejścia BarcodeWriter.

Dostosowanie kodu QR

Obie biblioteki obsługują osadzanie logo i zmiany kolorów w kodach QR, ale różnią się podejściem do wymagańych typów systemów.

Podejście QRCoder

Osadzanie logo QRCoder odbywa się poprzez klasę renderującą QRCode (odrębną od PngByteQRCode), która udostępnia przeciążenie GetGraphic akceptujące System.Drawing.Bitmap. Oznacza to, że kod wywołujący musi współpracować bezpośrednio z System.Drawing w celu załadowania pliku z logo:

using QRCoder;
using System.Drawing;

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(
    "https://example.com",
    QRCodeGenerator.ECCLevel.H // High ECC required when logo occludes part of the code
);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", System.Drawing.Imaging.ImageFormat.Png);
using QRCoder;
using System.Drawing;

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(
    "https://example.com",
    QRCodeGenerator.ECCLevel.H // High ECC required when logo occludes part of the code
);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", System.Drawing.Imaging.ImageFormat.Png);
Imports QRCoder
Imports System.Drawing

Dim qrGenerator As New QRCodeGenerator()
Dim qrCodeData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H) ' High ECC required when logo occludes part of the code

Dim qrCode As New QRCode(qrCodeData)
Dim logoBitmap As New Bitmap("logo.png")
Dim qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap)
qrBitmap.Save("qr-logo.png", System.Drawing.Imaging.ImageFormat.Png)
$vbLabelText   $csharpLabel

Dostosowanie kolorów przebiega według podobnego schematu poprzez parametry darkColor i lightColor przeciążenia GetGraphic.

Podejście IronBarcode

IronBarcode udostępnia osadzanie logo i zmiany kolorów jako nazwane metody w obiekcie wynikowym QRCodeWriter. Metoda AddBrandLogo przyjmuje ścieżkę do pliku, a ChangeBarCodeColor przyjmuje wartość Color:

using IronBarCode;
using System.Drawing;

// Logo embedding
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.AddBrandLogo("logo.png");
qr.SaveAsPng("qr-logo.png");

// Colour customisation
var coloredQr = QRCodeWriter.CreateQrCode("https://example.com", 500);
coloredQr.ChangeBarCodeColor(Color.DarkBlue);
coloredQr.SaveAsPng("colored-qr.png");
using IronBarCode;
using System.Drawing;

// Logo embedding
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.AddBrandLogo("logo.png");
qr.SaveAsPng("qr-logo.png");

// Colour customisation
var coloredQr = QRCodeWriter.CreateQrCode("https://example.com", 500);
coloredQr.ChangeBarCodeColor(Color.DarkBlue);
coloredQr.SaveAsPng("colored-qr.png");
Imports IronBarCode
Imports System.Drawing

' Logo embedding
Dim qr = QRCodeWriter.CreateQrCode("https://example.com", 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)
qr.AddBrandLogo("logo.png")
qr.SaveAsPng("qr-logo.png")

' Colour customisation
Dim coloredQr = QRCodeWriter.CreateQrCode("https://example.com", 500)
coloredQr.ChangeBarCodeColor(Color.DarkBlue)
coloredQr.SaveAsPng("colored-qr.png")
$vbLabelText   $csharpLabel

Przewodnik po dostosowywaniu stylu kodów QR szczegółowo omawia rozmiary logo, kombinacje kolorów oraz kontrolę strefy ciszy.

Odczytywanie BarCode

Odczytywanie BarCode stanowi największą różnicę w możliwościach obu bibliotek.

Podejście QRCoder

QRCoder nie posiada API do odczytu kodów kreskowych. Klasa QRCodeGenerator oraz wszystkie klasy rendererów służą wyłącznie do generowania. Nie ma metody dekodowania kodu QR z obrazu, pliku lub strumienia. Aplikacje, które muszą zarówno generować, jak i odczytywać kody QR, muszą dodać oddzielną bibliotekę — zazwyczaj ZXing.Net — z własnym API, własną przestrzenią nazw i własnym cyklem konserwacji:

// QRCoder has no reading API.
// These methods do not exist:
//   qrGenerator.Decode("image.png");
//   QRCodeReader.Read("image.png");
//
// A separate library (e.g., ZXing.Net) is required for decoding.
// QRCoder has no reading API.
// These methods do not exist:
//   qrGenerator.Decode("image.png");
//   QRCodeReader.Read("image.png");
//
// A separate library (e.g., ZXing.Net) is required for decoding.
' QRCoder has no reading API.
' These methods do not exist:
'   qrGenerator.Decode("image.png")
'   QRCodeReader.Read("image.png")
'
' A separate library (e.g., ZXing.Net) is required for decoding.
$vbLabelText   $csharpLabel

Jest to decyzja projektowa, a nie przeoczenie — QRCoder jest wyraźnie biblioteką generującą.

Podejście IronBarcode

IronBarcode zawiera interfejs API do odczytu w tym samym pakiecie. BarcodeReader.Read akceptuje pliki graficzne, pliki PDF, strumienie oraz obiekty System.Drawing.Bitmap. Automatycznie wykrywa formaty BARCODE bez konieczności określania przez użytkownika, jakiego formatu szuka, i zwraca wszystkie BARCODE znalezione na obrazie:

using IronBarCode;

// Reading a QR code — no separate library required
var results = BarcodeReader.Read("qr.png");
foreach (var result in results)
{
    Console.WriteLine(result.Text);        // decoded value
    Console.WriteLine(result.BarcodeType); // QRCode, Code128, EAN13, etc.
}
using IronBarCode;

// Reading a QR code — no separate library required
var results = BarcodeReader.Read("qr.png");
foreach (var result in results)
{
    Console.WriteLine(result.Text);        // decoded value
    Console.WriteLine(result.BarcodeType); // QRCode, Code128, EAN13, etc.
}
Imports IronBarCode

' Reading a QR code — no separate library required
Dim results = BarcodeReader.Read("qr.png")
For Each result In results
    Console.WriteLine(result.Text)        ' decoded value
    Console.WriteLine(result.BarcodeType) ' QRCode, Code128, EAN13, etc.
Next
$vbLabelText   $csharpLabel

Przewodnik dotyczący odczytu BARCODE-ów z obrazów obejmuje odczyt z plików PDF, dokumentów wielostronicowych, strumieni oraz obrazów o niskiej rozdzielczości lub zawierających zakłócenia za pośrednictwem tego samego punktu wejścia.

Zakres formatowania poza QR

Podejście QRCoder

QRCoder generuje wyłącznie kody QR — tak zostało zaprojektowane. Metoda QRCodeGenerator.CreateQrCode jest jedynym punktem wejścia generowania udostępnianym przez bibliotekę. Projekty, które rozpoczynają się od kodów QR, a później wymagają etykiet wysyłkowych w formacie Code 128, kodów produktów EAN-13 lub kodów zgodności farmaceutycznej DataMatrix, muszą wprowadzić drugą bibliotekę, aby obsłużyć każdy dodatkowy format:

using QRCoder;

// QRCoder is limited to QR — other formats require separate packages
var qrGenerator = new QRCodeGenerator();
var qr = qrGenerator.CreateQrCode("scan-to-track", QRCodeGenerator.ECCLevel.M);

// Kod 128 requires a different library (e.g., NetBarcode)
// DataMatrix requires yet another library
// Reading any format requires yet another library
using QRCoder;

// QRCoder is limited to QR — other formats require separate packages
var qrGenerator = new QRCodeGenerator();
var qr = qrGenerator.CreateQrCode("scan-to-track", QRCodeGenerator.ECCLevel.M);

// Kod 128 requires a different library (e.g., NetBarcode)
// DataMatrix requires yet another library
// Reading any format requires yet another library
Imports QRCoder

' QRCoder is limited to QR — other formats require separate packages
Dim qrGenerator As New QRCodeGenerator()
Dim qr = qrGenerator.CreateQrCode("scan-to-track", QRCodeGenerator.ECCLevel.M)

' Kod 128 requires a different library (e.g., NetBarcode)
' DataMatrix requires yet another library
' Reading any format requires yet another library
$vbLabelText   $csharpLabel

Podejście IronBarcode

IronBarcode obsługuje wszystkie rodziny formatów poprzez ten sam punkt wejścia BarcodeWriter.CreateBarcode. Przejście z kodu QR na Kod 128 i DataMatrix wymaga jedynie zmiany parametru BarcodeEncoding — bez dodatkowych pakietów, nowych przestrzeni nazw i oddzielnych interfejsów API:

using IronBarCode;

// All formats — one API, one package
BarcodeWriter.CreateBarcode("scan-to-track", BarcodeEncoding.QRCode)
    .SaveAsPng("campaign-qr.png");

BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-code.png");

BarcodeWriter.CreateBarcode("LOT-ABC-123", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-code.png");
using IronBarCode;

// All formats — one API, one package
BarcodeWriter.CreateBarcode("scan-to-track", BarcodeEncoding.QRCode)
    .SaveAsPng("campaign-qr.png");

BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-code.png");

BarcodeWriter.CreateBarcode("LOT-ABC-123", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-code.png");
Imports IronBarCode

' All formats — one API, one package
BarcodeWriter.CreateBarcode("scan-to-track", BarcodeEncoding.QRCode) _
    .SaveAsPng("campaign-qr.png")

BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping-label.png")

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .SaveAsPng("product-code.png")

BarcodeWriter.CreateBarcode("LOT-ABC-123", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("pharma-code.png")
$vbLabelText   $csharpLabel

Przewodnik po mapowaniu API

QRCoder IronBarcode
new QRCodeGenerator() Klasa statyczna — nie wymaga instancji
qrGenerator.CreateQrCode(data, ECCLevel.M) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
new PngByteQRCode(qrCodeData) Nie jest to konieczne — renderowanie jest częścią łańcucha
qrCode.GetGraphic(20) .ToPngBinaryData() z .ResizeTo(w, h)
new SvgQRCode(qrCodeData).GetGraphic(10) .SaveAsSvg(path)
new QRCode(qrCodeData).GetGraphic(...) QRCodeWriter.CreateQrCode(data, size, level)
QRCodeGenerator.ECCLevel.L QRCodeWriter.QrErrorCorrectionLevel.Low
QRCodeGenerator.ECCLevel.M QRCodeWriter.QrErrorCorrectionLevel.Medium
QRCodeGenerator.ECCLevel.Q QRCodeWriter.QrErrorCorrectionLevel.Quartile
QRCodeGenerator.ECCLevel.H QRCodeWriter.QrErrorCorrectionLevel.Highest
PayloadGenerator.WiFi(...).ToString() "WIFI:T:WPA;S:{ssid};P:{pass};;"
Brak API do odczytu BarcodeReader.Read(path)
Tylko format QR Ponad 50 formatów poprzez BarcodeEncoding.*

Kiedy zespoły rozważają przejście z QRCoder na IronBarcode

Dla zespołów, których projekty są wyłącznie oparte na kodach QR i tak pozostaną, QRCoder jest dobrze utrzymywaną biblioteką, która nadal dobrze spełnia swoje zadanie. Poniższe scenariusze opisują warunki, które powodują, że zespoły ponownie oceniają to podejście.

Wymagania dotyczące formatu wykraczają poza QR

Większość wymagań dotyczących kodów kreskowych zaczyna się od kodów QR, a QRCoder niezawodnie radzi sobie z tym początkowym zakresem. Napięcie pojawia się, gdy do rozmowy wkracza drugi format. Zespoły logistyczne, które potrzebują etykiet Kod 128 do wysyłki, operacje detaliczne wymagające kodów produktów EAN-13, procesy farmaceutyczne wymagające DataMatrix do serializacji — każdy nowy format zmusza zespół do dodania kolejnej zależności NuGet. Koszt integracji każdej dodatkowej biblioteki obejmuje naukę nowej przestrzeni nazw, monitorowanie nowego cyklu wydawniczego oraz nowy punkt potencjalnego konfliktu wersji podczas aktualizacji Wersji .NET.

Odczytywanie BarCode staje się konieczne

Aplikacja generująca kody QR wychodzące na potrzeby kampanii jest systemem służącym wyłącznie do generowania. Aplikacja, która przetwarza również przesyłki przychodzące, weryfikuje kody produktów w momencie ich dostarczenia lub sprawdza bilety podczas wydarzenia, jest systemem generowania i odczytu. QRCoder z założenia nie posiada funkcji odczytu — tę lukę musi wypełnić druga biblioteka. Wprowadzenie biblioteki odczytu znacznie zmienia ślad integracyjny podsystemu BarCode, zwłaszcza jeśli biblioteka odczytu nakłada własne wymagania dotyczące specyfikacji formatu lub ograniczenia dotyczące bezpieczeństwa wątków.

Obciążenie związane z utrzymaniem wielu bibliotek

Naturalny schemat tworzenia projektu opartego na QRCoderze przebiega w przewidywalny sposób: QRCoder do generowania kodów QR, biblioteka kodów kreskowych 1D do etykiet wysyłkowych, biblioteka odczytu do dekodowania. Każda biblioteka posiada własną dokumentację, własny cykl wydawania wersji oraz własną historię zmian wprowadzających niekompatybilność. Niewielka aktualizacja wersji .NET dla jednej biblioteki może zbiegać się w czasie z istotną zmianą w innej. Zespoły, które zarządzają tymi zasobami od lat, informują, że ukryty koszt nie wynika z początkowej integracji, ale z narastających kosztów utrzymania w wielu cyklach aktualizacji.

Obsługa dokumentów PDF

Generowanie barcode'ów do osadzenia w raportach PDF lub wyodrębnianie barcode'ów z przychodzących dokumentów PDF w procesie przetwarzania dokumentów nie jest możliwe w QRCoder. Obsługa plików PDF wymaga albo pełnej biblioteki PDF z funkcjami BarCode, albo dedykowanej kombinacji bibliotek. Zespoły tworzące procesy oparte na dokumentach — przetwarzanie faktur, raportowanie zgodności, generowanie etykiet na podstawie szablonów PDF — zauważają, że zakres działania QRCoder pokrywa się z wymaganiami dotyczącymi plików PDF już na wczesnym etapie cyklu życia projektu.

Typowe kwestie związane z migracją

Format ciągu znaków PayloadGenerator

Klasy pomocnicze QRCoder PayloadGenerator generują ciągi znaków zgodne z publicznymi standardami danych QR. Na przykład format WiFi generuje WIFI:T:WPA;S:NetworkName;P:Password;;. Ciągi te można tworzyć bezpośrednio w IronBarcode bez klasy pomocniczej, ponieważ format jest publicznym standardem udokumentówanym w specyfikacji kodu QR. Zespoły, które często używają PayloadGenerator, powinny rozważyć napisanie małych statycznych metod pomocniczych, które odtwarzają konstrukcję ciągu znaków.

Mapowanie enumów ECCLevel

QRCoder używa QRCodeGenerator.ECCLevel z wartościami L, M, Q, H. IronBarcode używa QRCodeWriter.QrErrorCorrectionLevel z wartościami Low, Medium, Quartile i Highest. Mapowanie jest bezpośrednie, ale odniesienia do enumów muszą zostać zaktualizowane we wszystkich miejscach wywołania. Podczas gdy QRCoder wymagał wyraźnego wyboru ECC przy każdym wywołaniu CreateQrCode, IronBarcode stosuje rozsądne ustawienie domyślne, gdy używana jest ścieżka BarcodeWriter.CreateBarcode.

Usunięcie klasy Renderer

Klasy renderujące QRCoder — PngByteQRCode, SvgQRCode, AsciiQRCode, Base64QRCode, QRCode — stają się zbędne po migracji. IronBarcode wbudowuje renderowanie w łańcuch fluent w GeneratedBarcode, więc wzorzec obiektu renderera pośredniego nie jest przenoszony. Kod, który instancjonuje te klasy rendererów, można zastąpić wywołaniami metod terminalowych w wyniku BarcodeWriter.

Dodatkowe możliwości IronBarcode

Poniższe funkcje IronBarcode nie zostały uwzględnione w powyższych sekcjach porównawczych:

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

IronBarcode jest aktywnie rozwijany i regularnie aktualizowany pod kątem obecnych i przyszłych wydań platformy .NET. Biblioteka obsługuje .NET 8, .NET 9, a aktualizacje zapewniające kompatybilność z .NET 10 (spodziewane pod koniec 2026 r.) są częścią bieżącego harmonogramu wydawniczego firmy Iron Software. QRCoder jest również aktywnie utrzymywany i działa na wszystkich aktualnych platformach .NET; Jego konstrukcja bez zależności sprawia, że kompatybilność z przyszłymi wersjami jest prosta. Obie biblioteki nadają się do długoterminowych projektów .NET. Dla zespołów wybierających model wsparcia komercyjnego IronBarcode zapewnia bezpośredni dostęp do pomocy technicznej oraz priorytetowe rozwiązywanie błędów.

Wnioski

QRCoder i IronBarcode spełniają ten sam podstawowy wymóg — generowanie kodów QR — ale z różnych punktów wyjścia architektonicznych. QRCoder to specjalnie zaprojektowana biblioteka obsługująca jeden format, której zakres działania celowo ogranicza się do kodów QR. IronBarcode to biblioteka obsługująca wiele formatów, która umożliwia generowanie, odczytywanie i integrację z plikami PDF w ponad 50 formatach kodów kreskowych. Nie chodzi tu o porównanie dobrej biblioteki z lepszą; jest to coś pomiędzy narzędziem specjalistycznym a narzędziem ogólnego przeznaczenia.

QRCoder to właściwy wybór dla projektów, w których generowanie kodów QR jest stałym, ograniczonym wymogiem. Brak zależności, nieograniczona licencja MIT oraz pomocniki PayloadGenerator sprawiają, że jest to doskonały wybór do procesu rejestracji 2FA, generatora kodów QR do kampanii marketingowych lub dowolnego kontekstu, w którym zakres kodów kreskowych jest ostatecznie ustalony. Biblioteka jest dobrze utrzymana, szeroko stosowana i niezawodnie spełnia swoją deklarowaną funkcję. Zespoły o takich cechach nic nie zyskają na zmianie.

IronBarcode staje się bardziej praktycznym wyborem, gdy wymagania projektu dotyczące kodów kreskowych wykraczają — lub prawdopodobnie wykraczać będą — poza generowanie kodów QR. Aplikacje, które muszą odczytywać kody z przychodzących przesyłek lub zeskanowanych dokumentów, generować etykiety Kod 128 wraz z kampaniami QR lub tworzyć BARCODES osadzone w raportach PDF, korzystają z jednego spójnego interfejsu API dla wszystkich tych zadań. Przewodnik po alternatywach dla QRCoder C# zawiera dodatkowe informacje na temat ograniczeń bibliotek obsługujących wyłącznie kody QR w środowiskach produkcyjnych. Ceny licencji zaczynają się od 749 USD i są w pełni opisane na stronie licencyjnej IronBarcode.

Szczera ocena jest taka, że wybór odpowiedniego narzędzia zależy całkowicie od zakresu projektu. W przypadku stałych wymagań dotyczących wyłącznie kodów QR, QRCoder zapewnia wszystko, co jest potrzebne, bez żadnych kosztów. W przypadku wymagań obejmujących wiele formatów, odczyt lub integrację z plikami PDF, IronBarcode eliminuje konieczność zarządzania wieloma bibliotekami o jednym przeznaczeniu w miarę rozwoju projektu.

Często Zadawane Pytania

Czym jest QRCoder.NET?

QRCoder.NET to biblioteka kodów kreskowych .NET służąca do generowania i odczytywania kodów kreskowych w aplikacjach napisanych w języku 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 QRCoder.NET a IronBarcode?

IronBarcode wykorzystuje statyczne, bezstanowe API, które nie wymaga zarządzania instancjami, podczas gdy QRCoder.NET 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 QRCoder.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 obsługiwane przez QRCoder.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.

W jaki sposób IronBarcode radzi sobie z przetwarzaniem wsadowym w porównaniu z QRCoder.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ę przetestować IronBarcode przed zakupem, w przeciwieństwie do QRCoder?

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 QRCoder.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 migracja z QRCoder.NET do IronBarcode jest prosta?

Migracja z QRCoder.NET do IronBarcode polega przede wszystkim 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().

Jordi Bardia
Inżynier oprogramowania
Jordi jest najbardziej biegły w Pythonie, C# i C++. Kiedy nie wykorzystuje swoich umiejętności w Iron Software, programuje gry. Dzieląc odpowiedzialność za testowanie produktów, rozwój produktów i badania, Jordi wnosi ogromną wartość do ciągłej poprawy produktów. Różnorodne doświadczenia ...
Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie