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)
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.Readobsł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 —
BarcodeWriterjest 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)
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")
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")
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)
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")
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.
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
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
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")
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:
- Wstawianie kodów kreskowych do plików PDF: Osadzanie kodów kreskowych bezpośrednio w istniejących dokumentach PDF w określonych współrzędnych stron
- Wykrywanie wielu BarCodes: odczyt wszystkich BarCodes obecnych na jednym obrazie w jednym wywołaniu, niezależnie od mieszanki formatów
- Wejście strumieniowe i tablica bajtów:
BarcodeReader.Readakceptuje dane wejścioweStream,byte[]iSystem.Drawing.Bitmapbez konieczności operacji wejścia/wyjścia plików - Adnotacje i marginesy BarCode'ów: Dodawaj czytelne dla człowieka adnotacje tekstowe i konfiguruj szerokość marginesów na generowanych BarCode'ach
- Różnorodność formatów obrazów: eksport do formatów PNG, JPEG, TIFF, BMP, GIF, HTML i SVG z tego samego łańcucha generowania
- Noisy Image Preprocessing: Automatyczne przetwarzanie wstępne obrazów w celu poprawy szybkości odczytu w przypadku rozmytych, przekrzywionych lub o niskim kontraście danych wejściowych
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().

