ZXing.Net vs IronBarcode: 2026'da .NET Barkod Kütüphanesi Seçimi
ZXing.Net'in BarcodeReader iş parçacığına güvenli değildir. Uygulamanızdaki her eşzamanlı okuma yolu — her paralel ForEach, eşzamanlı istekleri işleyen her asenkron denetleyici eylem — kendi okuyucu örneğini gerektirir. Bu, her örnek için biçim yapılandırmasının tekrarlanması, her çağrı için Bitmap yükleme ve imha ve her istek için okuyucu tahsisi anlamına gelir. IronBarcode'un statik metodu, aynı işi istek başına tahsis yapmadan yürütür. İş parçacığı güvenliği, listedeki sadece bir öğedir: yerel PDF desteği yok, Windows ve Linux üzerindeki bağlayıcı paket fragmantasyonu ve her taramak istediğiniz barkod formatını belirtme gereksinimi — bu, ZXing.Net projelerinin zamanla araı çözümü biriktirmeye neden olan özelliklerdir.
ZXing.Net Anlamak
ZXing.Net, Google'ın Java ZXing ("Zebra Crossing") kütüphanesinin açık kaynaklı bir portudur,Apache 2.0lisansı altında yayımlanmıştır ve GitHub üzerinde Michael Jahn tarafından sürdürülmektedir. .NET için en çok indirilen açık kaynaklı barkod kütüphanesidir, on yıldan fazla bir döneme yayılmış uzun bir sicili vardır. Kütüphane, sıfır maliyetli lisansı sayesinde, geniş bir barkod formatları setinde okuma ve yazmayı kapsar ve Apache uyumlu bağımlılıklar içeren açık kaynaklı ürünler dahil, tüm boyuttaki projeler için erişilebilir kılar.
ZXing.Net'in mimarisi, bir Java portu kökenlerini yansıtır. BarcodeReader sınıfı, durumsal bir nesnedir: Decode çağrılınca iç durum yazılır, bu da örneklerin iş parçacıkları arasında paylaşılması güvenli olmadığını gösterir. Doğru eşzamanlı kullanım, her iş parçacığı için yeni bir okuyucu veya bir ThreadLocal<BarcodeReader> havuzu gerektirir - her ikisi de iş parçacığı güvenliği sorumluluğunu çağırana yükler. Görüntü yükleme, çekirdek paket dahilinde değildir; Bunun yerine, ZXing.Net her biri farklı bir API yüzeyini açığa çıkaran platforma özgü bağlama paketleri sağlar.
Ana mimari özellikler şunları içerir:
- Apache 2.0 Lisansı: Ticari ve açık kaynaklı kullanım için ücretsiz, maliyetsiz ve satış takımına gerek duymaksızın.
- Durumsal BarcodeReader:
BarcodeReaderörneği iş parçacığına güvenli değildir; iş parçacığı başına veya paralel işlemi başına yeni bir örnek oluşturulmalıdır. - Manuel Biçim Belirtme: Her çözümlemeden önce arayanların
reader.Options.PossibleFormatsayarlaması gerekir; listelenmeyen formatlar sessizce atlanır, hata veya uyarı verilmez. - Yerel PDF Desteği Yok: Kütüphane yalnızca görüntüleri okur; PDF girişi, sayfaları bitmap'e dönüştürmek için PdfiumViewer gibi ayrı bir PDF oluşturma kütüphanesi gerektirir.
- Platform Bağlama Fragmantasyonu: Çekirdek paket görüntü yüklemesi sağlamaz; ayrı bağlama paketleri (
ZXing.Net.Bindings.Windows.CompatibilitySystem.Drawingkullanarak, SixLabors.ImageSharp kullanarakZXing.Net.Bindings.ImageSharp/.V2/.V3artıZXing.Net.Bindings.SkiaSharpveZXing.Net.Bindings.Magick) farklı dağıtım hedefleri için farklı API'lar sunar. - Aktif Topluluk: GitHub'da sorunlar, pull request'ler ve tartışmalar aktiftir, topluluk düzeyinde destek ücretsiz olarak sağlanır.
- Geniş Format Desteği: QR Kod, Code 128, Code 39, EAN-13, EAN-8, UPC-A, Data Matrix, PDF 417, Aztek ve diğer yaygın kullanılan simbolojileri destekler.
Durumlu Okuyucu Mimarisi
ZXing.Net'in BarcodeReader her iş parçacığı veya paralel işlem için yeni bir örnek gerektirir. Aşağıdaki desen, eş zamanlı işleme için minimum doğru kurulum gösterir:
// 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)ThreadLocal<BarcodeReader> deseni, her çağrı için tahsisi azaltır ve her iş parçacığı için bir örneği yeniden kullanır, ancak imha karmaşıklığı ekler. Her iki durumda da, ZXing.Net'te iş parçacığı güvenliği arayan kişinin sorumluluğundadır.
IronBarcode Anlama
IronBarcode, Iron Software tarafından geliştirilen ticari bir .NET barkod kütüphanesidir. Bu, durumsuz statik API üzerinden barkod okuma ve oluşturma sağlar: BarcodeReader.Read ve BarcodeWriter.CreateBarcode ana giriş noktalarıdır ve kullanmadan önce herhangi bir örnek oluşturma veya yapılandırma gerektirmez. Kütüphane, platforma özgü bağlama paketlerine ihtiyaç duymadan, Windows, Linux,macOSve Docker konteynerlerinde aynı şekilde çalışan tek bir NuGet paketi olarak gönderilir.
IronBarcode'un okuma motoru, 50'den fazla barkod sembolojisi üzerinde otomatik format algılama gerçekleştirir. Arayanlar hangi formatları arayacaklarını belirtmez; motor, her bir görüntüyü desteklenen tüm formatlara karşı değerlendirir ve bulunan tüm barkodları döndürür. Tarama hızını titizlikle dengelemek zorunda olan uygulamalar için, bir ReadingSpeed enumu (Faster, Balanced, Detailed, ExtremeDetail) kontrol sağlar, ancak biçim sayımı gerektirmez. Kütüphane aynı zamanda tüm sayfalarda PDF dökümanlarındaki barkodları doğrudan okuyarak, ayrı bir PDF işleme kütüphanesine ihtiyaç duymadan yerel PDF desteğini de içerir.
Anahtar özellikler şunları içerir:
- Ticari Lisans: Ücretli bir lisans anahtarı gerektirir; değerlendirme için deneme modu mevcuttur.
- Durumsuz Statik API:
BarcodeReader.ReadveBarcodeWriter.CreateBarcodeiş parçacığına güvenli statik yöntemlerdir; örnek yönetimi gerektirmez. - Otomatik Format Algılama: Desteklenen tüm 50+ barkod formatı, format listesi olmadan algılanır; arayanlar hızı format kapsamına göre ayarlar.
- Yerel PDF Desteği:
BarcodeReader.ReadPDF dosya yollarını doğrudan kabul eder ve herhangi bir harici PDF kütüphanesi olmadan tüm sayfaları işler. - Tek Platformlar Arası Paket: Tek bir NuGet paketi, Windows, Linux,macOSve Docker'da aynı API yüzeyiyle çalışır.
- Akıcı Üretim API'si:
BarcodeWriter.CreateBarcode,GeneratedBarcodenesnesiyle birlikte yerleşik çıktı yöntemleri döndürür, bu yöntemler arasındaSaveAsPng,SaveAsPdf,ToPngBinaryDataveToStreambulunur. - Ticari Destek: Ücretli lisanslar, Iron Software'ın destek ekibine hizmet seviyesinde taahhütlerle erişim sağlar.
Özellik Karşılaştırması
Aşağıdaki tablo, ZXing.Net ve IronBarcode arasındaki temel farkları vurgular:
| Özellik | ZXing.Net | IronBarcode |
|---|---|---|
| Lisans | Apache 2.0 (ücretsiz) | Ticari |
| İş Parçacığı Güvenliği | İş parçacığı güvenli değil — her iş parçacığı için yeni örnek gerekiyor | İş parçacığı güvenli statik API |
| Format Algılama | Manuel — gerekli PossibleFormats listesi | Otomatik — 50+ format |
| PDF Okuma | Hayır — PdfiumViewer veya benzeri gerekiyor | Yerel — tek bir yöntem çağrısı |
| Platform Desteği | Her platform için ayrı bağlama paketleri | Tek paket, tüm platformlar |
| Barkod Üretimi | Bitmap döndürür, manuel kaydetme gerektirir | Yerleşik çıkışa sahip akıcı API |
| Fiyatlandırma | Ücretsiz | $999'dan (Lite) / $1.499'dan (Plus) |
Ayrıntılı Özellik Karşılaştırması
| Özellik | ZXing.Net | IronBarcode |
|---|---|---|
| Okuma | ||
| İş Parçacığı güvenli okuma | Hayır — iş parçacığı başına örnekler gerekli | Evet — stateless statik API |
| Otomatik format algılama | Hayır — PossibleFormats gereklidir | Evet — tüm formatlar otomatik algılanır |
| Her görüntüde birden fazla barkod | Evet — DecodeMultiple | Evet — varsayılan davranış |
| PDF barkod okuma | Hayır — harici kütüphane gerekli | Evet — yerel |
| Hasarlı barkod kurtarma | TryHarder bayrağı | ML destekli görüntü düzeltme |
| Hız/doğruluk ayarlaması | Format listesi azaltılması | ReadingSpeed enumu |
| Üretim | ||
| Code 128 / Code 39 | Evet | Evet |
| QR Kodu | Evet | Evet |
| Logo ile QR Kod | Hayır | Evet |
| QR Kod renk özelleştirmesi | Hayır | Evet |
| PNG/JPEG/PDF'ye çıkış | Manuel olarak System.Drawing ile | Yerleşik çıkış yöntemleri |
| Akıcı oluşturma zinciri | Hayır | Evet |
| Platform ve Uygulama | ||
| Windows (System.Drawing) | Evet — ZXing.Net.Bindings.Windows.Compatibility | Evet |
| Linux / Docker | Evet —ZXing.Net.Bindings.ImageSharp / .V2 / .V3(farklı API) | Evet — aynı API |
| macOS | Evet — ZXing.Net.Bindings.ImageSharp / .V2 / .V3 | Evet |
| Docker ekstra bağımlılıkları | libgdiplus gerekebilir | None |
| Tek bir NuGet paketi | Hayır — çekirdek + bağlama + isteğe bağlı ImageSharp | Evet |
| Lisanslama ve Destek | ||
| Lisans türü | Apache 2.0 | Ticari |
| Maliyet | Ücretsiz | $999'dan itibaren |
| Topluluk desteği | GitHub sorunları, aktif topluluk | Evet |
| Ticari SLA desteği | Hayır | Evet |
| Açık kaynak dostu | Evet | Hayır |
İş Parçacığı Güvenliği ve Eşzamanlı İşleme
İş parçacığı güvenliği, iki kütüphane arasındaki en önemli operasyonel farktır ve dokümantasyon uyarılarının düşündürdüğünden daha fazla projeyi etkiler.
ZXing.Net Yaklaşımı
ZXing.Net'in BarcodeReader durumsal bir nesnedir. Decode çağrıldığında, iç durum yazılır. İki iş parçacığı aynı örneği paylaşırsa, bu yazılar yarışır. Sonuçlar kesindir: farklı bir görüntüden bir sonuç alabilirsiniz, bir barkodun olduğu yerde null, veya bir istisna. Doğru yaklaşım, her iş parçacığı için bir okuyucu oluşturmak — yani her paralel veya eşzamanlı yol bir okuyucu ayırır, yapılandırır, bir kez kullanır ve atar:
// 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)ThreadLocal<BarcodeReader> deseni, her çağrı için tahsisi azaltır ve her iş parçacığı için bir okuyucu yeniden kullanır, ancak imha karmaşıklığını ekler ve yine de her örnek için biçim yapılandırması gerektirir.
IronBarcode Yaklaşımı
IronBarcode'un BarcodeReader.Read durumsuz bir statik yöntemdir. Paylaşılacak bir örnek yok, izole edilecek bir örnek yok ve korunacak bir yapılandırma durumu yoktur. Aynı çağrı, herhangi bir sayıda eşzamanlı iş parçacığından güvenli bir şekilde çalışır:
// 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)IronBarcode'un senkron ve eşzamanlı barkod okuma belgeleri, dahili iş parçacığı havuzlama modelini açıklar. MaxParallelThreads özelliği, harici koordinasyon gerektirmeden eşzamanlılık derecesini kontrol eder.
Format Algılama
Format algılama politikası, iki kütüphane arasındaki ikinci önemli operasyonel farktır.
ZXing.Net Yaklaşımı
ZXing.Net, her çözümleme öncesinde reader.Options.PossibleFormats doldurulmasını gerektirir. Bir barkod formatı listelenmemişse, algılanmaz — hata yok, uyarı yok, kısmi sonuç yok:
// 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 UsingHer formatı eksikliği önlemek için listelemek, performansı düşürür. Yalnızca beklenen formatlar listelenmişse, eksik algılama dış kaynaklardan gelen görüntülerle bir risk haline gelir. ZXing.Net'in listelenmemiş bir formatta bir barkod bulduğu bildirimi için bir mekanizma yoktur.
IronBarcode Yaklaşımı
IronBarcode, desteklenen tüm 50+ formatı otomatik olarak algılar. Format listesi gerekmez veya kabul edilmez:
// 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})")
NextTarama hızı algılama titizliğine karşı ayarlayan uygulamalar için,IronBarcode bir ReadingSpeed enumu sunar — Faster, Balanced, Detailed, ExtremeDetail — biçim sayımı gerektirmeden. Hız ayarlaması, motorun her görüntüyü ne kadar agresif işlediğini etkiler, hangi formatları dikkate alacağını değil.
PDF Döküman Desteği
PDF okuma, ZXing.Net'te zor bir sınırdır: kütüphanenin herhangi bir türde PDF desteği yoktur.
ZXing.Net Yaklaşımı
Bir barkod PDF içinde yerleşik geldiğinde, ZXing.Net harici bir PDF işleme kütüphanesi gerektirir. En yaygın çözüm PdfiumViewer kullanmaktır ki bu, yaklaşık 20 MB yerel ikili dosyaların eklenmesini ve arayanların uygulayıp sürdürmesi gereken bir sayfa işleme döngüsünü ekler.
// 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 UsingBu modelin gerçek hata modları vardır: DPI yanlış yapılandırılması sessiz eksikliklere neden olur, sıkılaştırılmış ortamlarda geçici dosya izinleri başarısız olur, PdfiumViewer yerel kütüphaneleri ayrı bir dağıtım yönetimi gerektirir ve kurulum ek yapılandırma olmadan Linux'ta çalışmaz.
IronBarcode Yaklaşımı
IronBarcode barkodları PDF'lerden yerel olarak okur — tüm sayfalar, tüm formatlar, herhangi bir harici bağımlılık yok. Aynı BarcodeReader.Read çağrısı PDF yollarını doğrudan kabul eder:
// 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}")
NextSayfa numaralandırma yok, DPI yapılandırması yok, geçici dosyalar yok ve uygulamayla birlikte dağıtılacak ayrı bir kütüphane yok.
Platform Bağlantıları ve Dağıtım
ZXing.Net'in görüntü işleme, her biri farklı bir API yüzeyine sahip platforma özgü bağlama paketleri arasında dağıtılmıştır.
ZXing.Net Yaklaşımı
Temel ZXing.Net paketi, kod çözme mantığı sağlar ancak görüntü yükleme içermez. Arayanlar, dağıtım hedeflerine göre bir bağlamayı seçmelidir:
| Ortam | Paket | Notlar |
|---|---|---|
| Windows masaüstü / WPF | ZXing.Net.Bindings.Windows.Compatibility | System.Drawing kullanır — Windows dostu; Linux'ta libgdiplus gerektirir |
| Linux / Docker / platformlar arası | ZXing.Net.Bindings.ImageSharp / .V2 / .V3 | Farklı API yüzeyi; SixLabors.ImageSharp bağımlılığı (V2/V3 sürümler ImageSharp ana versiyonlarını takip eder) ekler |
| macOS | ZXing.Net.Bindings.ImageSharp / .V2 / .V3 | Linux ile aynı yol |
Pratik sonrasında, System.Drawing.Bitmap kullanan Windows kodu Linux'ta çalışmaz veya derlenemez. Konteynerleştirme, bağlama paketlerinin değiştirilmesini ve görüntü yükleme kodunun yeniden yazılmasını gerektirir:
// 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// 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 UsingBir Linux ana bilgisayarında Windows bağlamasını kullanmak, aynı zamanda Docker görüntüsüne libgdiplus eklemeyi gerektirir ve bu, kaba tahminlerle konteynere yaklaşık 50 MB ekler.
IronBarcode Yaklaşımı
IronBarcode tüm platformlar için tek bir paket gönderir. Aynı BarcodeReader.Read(path) çağrısı, Windows, Linux,macOSve Docker konteynerlerinde aynı şekilde derlenir ve çalışır. Bağlama paketleri yok, platform koşulları yok ve ek sistem bağımlılıkları yok. .NET uygulamalarını konteynerleştiren ekipler için, IronBarcode Docker ve Linux kurulum rehberi tek paket dağıtım modelini ayrıntılı olarak açıklar.
Oluşturma API'si
Her iki kütüphane de barkod üretir, ancak API'ler farklı tasarım yaklaşımlarını yansıtır.
ZXing.Net Yaklaşımı
ZXing.Net'in BarcodeWriter sınıfı bir yazar nesnesi oluşturur, kodlama seçeneklerini kabul eder, Write çağırır ve arayanların System.Drawing.Imaging kullanarak manuel olarak kaydetmeleri gereken bir Bitmap döndürür:
// 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 UsingPNG veya JPEG dışında formatlara kaydetmek, bir PDF'ye kaydetmek veya bir HTTP yanıtı için ikili çıktı oluşturmak, arayanın uyguladığı ek System.Drawing tesisatı gerektirir.
IronBarcode Yaklaşımı
IronBarcode'un BarcodeWriter.CreateBarcode, yerleşik çıktı yöntemleri sağlayan akıcı bir zincirle GeneratedBarcode nesnesi döndürür:
// 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")GeneratedBarcode nesnesi, ZXing.Net'in arayanların System.Drawing kullanarak kendilerinin uygulamasını gerektirdiği .ToPngBinaryData(), .ToJpegBinaryData(), .ToStream() ve .SaveAsPdf() gibi çıkış hedeflerini de açığa çıkarır.
API Eşleme Başvurusu
| ZXing.Net | IronBarcode | Notlar |
|---|---|---|
new BarcodeReader() | Statik — örnek yok | BarcodeReader.Read(...) statik bir çağrıdır |
reader.Options.PossibleFormats = new List<BarcodeFormat> { ... } | Gerekli değil | Otomatik algılama tüm formatları kapsar |
reader.Options.TryHarder = true | Speed = ReadingSpeed.Balanced | BarcodeReaderOptions ile hassasiyet ayarı |
reader.Decode(bitmap) | BarcodeReader.Read(imagePath) | Yolu doğrudan geçin — Bitmap gerekmez |
reader.DecodeMultiple(bitmap) | BarcodeReader.Read(imagePath) | Her zaman bir koleksiyon döndürür |
result.Text | result.Value | Özellik yeniden adlandırıldı |
result.BarcodeFormat | result.Format | Özellik yeniden adlandırıldı |
BarcodeFormat.QR_CODE | BarcodeEncoding.QRCode | Enum adlandırma kuralı değişikliği |
BarcodeFormat.CODE_128 | BarcodeEncoding.Code128 | Enum adlandırma kuralı değişikliği |
BarcodeFormat.EAN_13 | BarcodeEncoding.EAN13 | Enum adlandırma kuralı değişikliği |
new BarcodeWriter { Format = BarcodeFormat.CODE_128, Options = new EncodingOptions { ... } } | BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) | Statik fabrika yöntemi |
writer.Write(data), Bitmap döndürür | .SaveAsPng(path) / .ToPngBinaryData() | GeneratedBarcode üzerinde yerleşik çıktı yöntemleri |
| PDF desteği yok — PdfiumViewer gerekli | BarcodeReader.Read("doc.pdf") | Yerel PDF desteği |
| İş parçacığı güvenli değil | İş parçacığı güvenli statik API | Örnek yönetimi gerekmez |
Ekipler ZXing.Net'ten IronBarcode'a Geçmeyi Düşündüğünde
Belirli senaryolar, geliştirme ekiplerini ZXing.Net'e alternatif olarak IronBarcode'u değerlendirmeye yönlendiriyor.
Eşzamanlı ve Yüksek Hızda İşlem
Tek iş parçacıklı bir konsol uygulamasında doğru çalışan bir ZXing.Net entegrasyonu, aynı kod birden çok eşzamanlı isteği işleyen bir ASP.NET Core denetleyicisine taşındığında veya paralel işlemleri işleyen bir arka plan işine taşındığında belirlenemeyen davranış sergileyebilir. ZXing.Net'in gerektirdiği iş parçacığı başına örnek modeli, her isteğin veya paralel görevin kendisi için yapılandırılmış bir kod çözücü seti olan bir tüm okuyucu nesnesi ayırmasını, bir kez kullanmasını ve atmasını gerektirir. İstek hacmi arttıkça, bu ayırma baskısı ölçülebilir hale gelir. Bu noktaya ulaşan ekipler — özellikle lojistik, ambarlama veya belge işleme gibi yüksek hızda tarama hatları çalıştıranlar — genellikle iş parçacığı modelinin her arayana bu yükü getirmeyen bir kütüphaneyi ararlar.
Karışık Format Belge Tarama
Üçüncü taraflardan belgeleri alan uygulamalar, format listesi yapılandırıldığında öngörülemeyen barkod formatları sık sık karşılaşır. Code 128 için oluşturulmuş bir nakliye entegrasyonu, QR kodları kullanan bir ortakdan bir sevkiyat alır. PDF 417 için yapılandırılmış bir sahiplik sistemi, yeni bir ekipman satıcısından Data Matrix sembolojileriyle karşılaşır. ZXing.Net'te her biri, bir kod çözme hatası yerine sessiz bir null üretir, bu, kaçırmanın aşağı yönde işleme düştüğü ana kadar yüzeye çıkmayabileceği anlamına gelir. Sessiz format eksikliklerinden dolayı sorun yaşamış ekipler — özellikle bir yanlış barkodun iş sonuçlarına neden olduğu bağlamlarda — format listesinin bakım maliyetini otomatik olarak formatları algılayan bir kütüphaneye karşı tartmaya başlarlar.
PDF Barkod Çıkışı
Birçok iş belgesi PDF olarak gelir: faturalar, sevk notları, hasta kayıtları, uyumluluk sertifikaları. ZXing.Net bunları doğrudan okuyamaz. PDF'lerden barkod çıkarması gereken ekipler, ZXing.Net üstüne bir işleme hattı oluşturup sürdürürler — bir PDF kütüphanesi seçmek, yerel bağımlılıklarını yönetmek, bir sayfa işleme döngüsü uygulamak, DPI yapılandırmasını ele almak ve geçici dosyaların temizleme mantığını yazmak. Bu altyapı kodu barkod mantığı değildir; ZXing.Net'in kabul ettiği şey (bitmapler) ile iş belgelerinin gerçekten ne olduğu (PDF'ler) arasındaki boşluğu kapatmak için var olur. Bu köprüyü koruyan ekipler — özellikle PDF kütüphanesinin kendisinin lisanslama, dağıtım ve platform hususları olduğunda — sıklıkla tam giriş yüzeyini ele alacak tek bir kütüphaneyi tercih ederler.
Bağlama Karmaşıklığını Azaltma
Windows'ta başlayan projeler ve daha sonra Linux veya docker'a yayılmak, ZXing.Net'in bağlama parçalanmasını doğrudan karşılar: Windows bağlama paketi, çapraz platform ImageSharp bağlamasından farklı bir API kullanır ve arasında geçiş yapmak, hem NuGet referanslarında hem de görüntü yükleme kodunda değişiklik yapmayı gerektirir. Uygulamalarını konteynerleşmekte olan veya aynı kod tabanını geliştirici makinelerinde (Windows veya macOS) ve üretim sunucularında (Linux) çalıştıran ekipler, görüntü yükleme için iki ayrı kod yolu sürdürmenin, tarama katında yapılacak her değişikliğe bir sürtünme eklediğini fark eder.
Genel Geçiş Dikkat Edilmesi Gereken Hususlar
ZXing.Net'ten IronBarcode'a geçiş yapan ekipler, bu spesifik teknik değişikliklere planlanmalıdır.
Barkod Okuyucu Oluşturma Kaldırma
Kod tabanındaki her new BarcodeReader() çağrısı, geçiş sırasında kaldırılır. Oluşturma kalıbı — okuyucu oluşturma, format yapılandırma, görüntü yükleme, kod çözme çağrısı — tek bir statik yöntem çağrısına dönüşür. ZXing, ZXing.Common, ZXing.Windows.Compatibility, ZXing.ImageSharp ve SixLabors.ImageSharp isim alanlarını içe aktaran dosyalardan bu importlar kaldırılır ve tek bir using IronBarCode; ile değiştirilir.
Olası Formatlar Yapılandırması Kaldırma
reader.Options.PossibleFormats atama bloğu her çağrı noktasında silinir.IronBarcode otomatik biçim algılama yapar ve bir biçim kısıtlama listesi kabul etmez. TryHarder bayrağı, BarcodeReaderOptions üzerinde algılama çabasını daraltmadan kontrol eden ReadingSpeed özelliği ile değiştirilir.
Bağlama Paketi Temizliği
Geçiş, ZXing.Net, ZXing.Net.Bindings.Windows.Compatibility, herhangi bir ZXing.Net.Bindings.ImageSharp varyantının (.V2 / .V3) ve PDF okuma desteği eklemek için eklenen herhangi bir PdfiumViewer paketini kaldırır. Eğer libgdiplus, Linux'ta Windows bağlaması aracılığıyla System.Drawing desteklemek için bir Docker dosyasına eklenmişse, o satır da kaldırılır. IronBarcode, Docker görüntüsünde platforma özgü bağımlılık gerektirmez.
Ek IronBarcode Yetenekleri
Yukarıdaki karşılaştırma bölümlerinde ele alınan yetenekler dışında,IronBarcode sağlar:
- Logo Gömülü QR Kodu: Ortasında özel logo resmi yerleştirilmiş QR kodları oluşturun, otomatik hata düzeltme ile taranabilirliği sağlamak.
- QR Kod Renk Özelleştirmesi: Marka uyumlu çıktı için oluşturulan QR kodlarında ön plan ve arka plan renklerini ayarlayın.
- Barkod Mühürleme PDF'ye: Ayrı bir PDF kütüphanesi olmadan, belirli koordinatlarda var olan PDF sayfalarına doğrudan barkod yazdırma.
- GS1 Barkod Desteği: GS1-128 ve GS1 Veri Çubuğu dahil olmak üzere, perakende ve sağlık tedarik zincirlerinde kullanılan GS1 biçimli barkodları okuyun ve oluşturun.
- Çok İş Parçacıklı Asenkron Okuma: Barkod okuma işlevini
awaithatlarına tıkanma olmadan entegre eden yerleşik asenkron yöntemler. - ML Destekli Görüntü Düzeltme:
TryHarder'nin kurtaramadığı hasarlı, bulanık veya düşük kontrastlı barkodlar için otomatik görüntü iyileştirme.
.NET Uyumluluğu ve Geleceğe Hazırlık
IronBarcode, .NET Standard 2.0 ve üzerini hedefler, .NET Framework 4.6.2+, .NET Core 3.1, .NET 5, .NET 6, .NET 7, .NET 8 ve .NET 9 ile uyumluluk sunar. Kütüphane, Microsoft'un .NET sürüm döngüsü ile uyumlu düzenli güncellemeler alır ve .NET 10 ile uyumluluk, sürüme yakın bir tarihte veya sürümde mevcut olacaktır. ZXing.Net de geniş bir .NET uyumluluğu sürdürmek için NuGet paketi hedeflerini korur ve her iki kütüphane de bu yönden modern .NET projeleri için uygundur.
Sonuç
ZXing.Net ve IronBarcode, barkod kütüphane tasarımında farklı felsefeleri temsil eder. ZXing.Net, iş parçacığı sorumluluğunu, format spesifikasyonunu ve PDF bağlantısını tamamen arayana devreden durum bilgili, örnek tabanlı bir kütüphanedir. IronBarcode, iş parçacığını içselleştiren, formatları otomatik olarak algılayan ve PDF girişini yerel olarak işleyen durumsuz, statik-API kütüphanesidir. Bu farkın pratik sonucu, ZXing.Net kodunun eşzamanlı veya belge işleme bağlamlarında altyapı toplama eğilimindedir — iş parçacığı başına örnek modelleri, format listeleri, PDF işleme hatları ve platforma özgü bağlama dalları —IronBarcode kodu ise aynı senaryolar için bu çevresel yapıları gerektirmemektedir.
ZXing.Net, sıfır maliyetli gereksinimleri olan projeler için gerçekten güçlü bir seçimdir.Apache 2.0lisansı, açık kaynak projeleri ve ücretsiz bağımlılıkları tercih eden ticari ürünlerle uyumlu hale getirir. Kontrollü ortamlarda — tanınan barkod formatları, temiz görüntüler, tek iş parçacıklı veya hafif eşzamanlı işlem — güvenilir bir şekilde performans gösterir. Aktif GitHub topluluğu, sorunlara zamanında cevap verir ve format kapsamının genişliği ticari alternatiflerle karşılaştırılabilir. Bu koşulların geçerli olduğu uygulamalar için, ZXing.Net'in maliyet avantajı gerçektir ve teknik sınırlamaları yönetilebilir durumdadır.
IronBarcode, ZXing.Net'in tasarım kısıtlamalarının işletme maliyetlerine dönüştüğü senaryoları ele alır: istek başına örnek tahsisi ölçülebilen eşzamanlı web API'leri, PDF girdi normu olan belge işleme hatları, sessiz başarısızlıkların işletme riski taşıdığı karma biçimli taramalar ve iki bağlayıcı paket iki kod yolu anlamına geldiği çapraz platform dağıtımları. Bu bağlamlar için, kütüphanenin ticari lisansı örnek yönetimi dayatmayan bir iş parçacığı modeli, bakım gerektirmeyen format algılama ve ikinci kütüphane gerektirmeyen PDF desteği sağlar.
Karar, projenin gereksinimlerine bağlıdır. Tek biçimli bir prototip, açık kaynaklı bir tarayıcı veya maliyetin bağlayıcı bir sınırlama olduğu düşük hacimli bir araç — bunlar ZXing.Net'in uygun bir seçim olduğu durumlar. Harici kaynaklardan gelen belgeleri işleyen bir üretim web API'si — bu, IronBarcode'un tasarım varsayımlarının operasyonel gerçeklikle uyumlu olduğu yerdir. Kütüphanelerin algılama oranları ve gerçek dünya tarama senaryoları arasında nasıl karşılaştırıldığına dair daha geniş bir bakış için, ZXing.Net vs IronBarcode barkod tarayıcı karşılaştırması ek analiz sunar.

Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.