Syncfusion BarcodeとIronBarcodeの比較:C#バーコードライブラリの比較
ZXing.Net 対 IronBarcode: 2026年に .NET バーコードライブラリを選ぶ
ZXing.Net の BarcodeReader はスレッドセーフではありません。 アプリケーション内のすべての並行読み取りパス—すべての並列 ForEach、すべての非同期コントローラーアクションで同時リクエストを処理するには、それぞれ独自のリーダーインスタンスが必要です。 つまり、インスタンスごとのフォーマット設定の繰り返し、呼び出しごとのBitmap の読み込みと破棄、およびすべてのリクエストごとのリーダー割り当てを意味します。IronBarcode の静的メソッドは、リクエストごとの割り当てなしで同じ作業を行います。 スレッドセーフティはリストにある項目の1つにすぎません。ネイティブのPDFサポートがないこと、WindowsとLinux間でバインディングパッケージが断片化していること、スキャンするすべてのバーコード形式を指定する必要があることなど、これらの特性が、ZXing .NETプロジェクトで時間の経過とともに回避策が蓄積される原因となっています。
ZXing .NETを理解する
ZXing .NETは、Google の Java ZXing ("Zebra Crossing") ライブラリのオープンソース移植版で、Apache 2.0 ライセンスの下でリリースされ、 GitHub上で Michael Jahn によってメンテナンスされています。 これは.NET向けのオープンソースのバーコードライブラリの中で最もダウンロード数が多く、10年以上にわたる長い実績を誇ります。 このライブラリは、幅広いバーコード形式の読み書きに対応しており、無料ライセンスのため、Apache互換の依存関係を必要とするオープンソース製品を含む、あらゆる規模のプロジェクトで利用可能です。
ZXing.Netのアーキテクチャは、Javaからの移植版として始まったという出自を反映している。 BarcodeReader クラスは状態を持つオブジェクトです。Decode を呼び出すと内部状態が書き込まれるため、インスタンスをスレッド間で共有するのは安全ではありません。 適切な並行使用には、スレッドごとに新しいリーダーまたは ThreadLocal<BarcodeReader> プールが必要であり、どちらもスレッドセーフの責任を呼び出し側に置きます。 画像読み込み機能もコアパッケージには含まれていません。 その代わりに、ZXing .NETはプラットフォーム固有のバインディングパッケージを提供し、それぞれが異なるAPIサーフェスを公開します。
主な建築上の特徴は以下のとおりです。
- Apache 2.0 ライセンス:商用利用およびオープンソース利用ともに無料。費用は一切かからず、販売契約も不要です。
- 状態を持つ BarcodeReader:
BarcodeReaderインスタンスはスレッドセーフではありません; スレッドごと、または並列処理ごとに新しいインスタンスを作成する必要があります。 - 手動フォーマット指定: 呼び出し側は各デコード前に
reader.Options.PossibleFormatsを設定する必要があります; リストに記載されていないフォーマットは、エラーや警告なしに自動的にスキップされます。 -ネイティブPDFサポートなし:ライブラリは画像のみを読み取ります。 PDF入力には、デコード前にページをビットマップに変換するための、PdfiumViewerなどの別のPDFレンダリングライブラリが必要です。 -プラットフォームバインディングの断片化:コアパッケージには画像読み込み機能がありません。 別々のバインディングパッケージ(ZXing.Net.Bindings.Windows.Compatibilityを用いたSystem.Drawing、ZXing.Net.Bindings.ImageSharp/.V2/.V3SixLabors.ImageSharp を用いた、加えてZXing.Net.Bindings.SkiaSharpとZXing.Net.Bindings.Magick)が異なるデプロイメントターゲットに対して異なる API を公開します。 -活発なコミュニティ: GitHub上では、問題報告、プルリクエスト、議論が活発に行われており、コミュニティレベルのサポートを無料で提供しています。 -幅広いフォーマットに対応: QRコード、コード128、コード39、EAN-13、EAN-8、UPC-A、データマトリックス、PDF 417、アステカ、その他広く使用されているシンボル体系をサポートしています。
ステートフルリーダーアーキテクチャ
ZXing.Net の BarcodeReader は各スレッドまたは並列操作ごとに新しいインスタンスを必要とします。 以下のパターンは、並行処理に必要な最小限の正しい設定を示しています。
// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
};
using var bitmap = new Bitmap(path);
var result = reader.Decode(bitmap);
if (result != null)
results[path] = result.Text;
});
// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
};
using var bitmap = new Bitmap(path);
var result = reader.Decode(bitmap);
if (result != null)
results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing
Parallel.ForEach(imagePaths, Sub(path)
Dim reader = New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
}
Using bitmap As New Bitmap(path)
Dim result = reader.Decode(bitmap)
If result IsNot Nothing Then
results(path) = result.Text
End If
End Using
End Sub)
ThreadLocal<BarcodeReader> パターンは、スレッドごとに1つのインスタンスを再利用することで呼び出しごとの割り当てを削減しますが、破棄の複雑さを追加します。 どちらの方法でも、スレッドの安全性は ZXing.Net の呼び出し者の責任となります。
IronBarcodeを理解する
IronBarcodeは、 Iron Software社が開発した商用.NETバーコードライブラリです。 それは、状態を持たない静的な API を通じてバーコードの読み取りと生成を提供します: BarcodeReader.Read と BarcodeWriter.CreateBarcode が主なエントリーポイントであり、どちらも使用前にインスタンスの作成や設定を必要としません。 このライブラリは単一のNuGetパッケージとして提供され、プラットフォーム固有のバインディングパッケージを必要とせず、Windows、Linux、macOS、およびDockerコンテナ内で同じように動作します。
IronBarcodeの読み取りエンジンは、50種類以上のバーコードシンボル体系において、フォーマットの自動検出を実行します。 呼び出し側は、どのフォーマットを探すかを指定しません。 エンジンは各画像をサポートされているすべてのフォーマットに対して評価し、検出されたすべてのバーコードを返します。 スキャン速度と徹底さのバランスを取る必要があるアプリケーションには、ReadingSpeed 列挙型(ExtremeDetail)がフォーマットの列挙を必要とせずに制御を提供します。 このライブラリにはネイティブのPDFサポートも含まれており、別途PDFレンダリングライブラリを必要とせずに、PDF文書のすべてのページからバーコードを直接読み取ることができます。
主な特徴は以下のとおりです:
-商用ライセンス:有料ライセンスキーが必要です。 評価用のトライアルモードが利用可能です。
- 状態を持たない静的 API:
BarcodeReader.ReadとBarcodeWriter.CreateBarcodeはスレッドセーフな静的メソッドです; インスタンス管理は不要です。 -自動フォーマット検出:サポートされている50種類以上のバーコードフォーマットは、フォーマットリストなしで検出されます。呼び出し側はフォーマットの範囲ではなく、速度を調整できます。 - ネイティブ PDF サポート:
BarcodeReader.Readは PDF ファイルパスを直接受け入れ、外部 PDF ライブラリなしですべてのページを処理します。 -単一のクロスプラットフォームパッケージ: 1つのNuGetパッケージが、Windows、Linux、macOS、およびDocker上で同じAPIサーフェスを使用して動作します。 - 流暢な生成 API:
BarcodeWriter.CreateBarcodeはGeneratedBarcodeオブジェクトを返し、ToStreamを含む組み込みの出力メソッドを備えています。 -商用サポート:有料ライセンスには、サービスレベル保証付きのIron Softwareのサポートチームへのアクセスが含まれます。
機能比較
以下の表は、ZXing .NETとIronBarcodeの基本的な違いをまとめたものです。
| フィーチャー | ZXing.Net | IronBarcode |
|---|---|---|
| ライセンス | アパッチ2.0(無料) | 商用 |
| スレッドセーフティ | スレッドセーフではありません。スレッドごとに新しいインスタンスが必要です。 | スレッドセーフな静的API |
| フォーマット検出 | マニュアル — PossibleFormats リストが必要 |
自動 — 50種類以上のフォーマット |
| PDFリーディング | いいえ — PdfiumViewerまたは同様のツールが必要です | ネイティブ — 単一メソッド呼び出し |
| プラットフォームサポート | プラットフォームごとに個別のバインディングパッケージ | 単一パッケージ、全プラットフォーム対応 |
| バーコード生成 | Bitmap を返し、手動で保存が必要 |
組み込み出力機能を備えた流暢なAPI |
| 価格について | 無料 | $749 から (Lite) / $1,499 (Plus) |
詳細な機能比較
| フィーチャー | ZXing.Net | IronBarcode |
|---|---|---|
| 読む | ||
| スレッドセーフな読書 | いいえ、スレッドごとのインスタンスは不要です。 | はい — 静的ステートレスAPI |
| 自動フォーマット検出 | いいえ — PossibleFormats が必要 |
はい、すべてのフォーマットを自動検出します |
| 画像ごとに複数のバーコード | はい — DecodeMultiple |
はい — デフォルトの動作 |
| PDFバーコード読み取り | いいえ — 外部ライブラリが必要です | はい、ネイティブです |
| 破損したバーコードの復旧 | TryHarder フラグ |
機械学習を活用した画像補正 |
| 速度/精度調整 | フォーマットリストの削減 | ReadingSpeed 列挙型 |
| 世代 | ||
| コード128 / コード39 | はい | はい |
| QRコード | はい | はい |
| ロゴ入りQRコード | なし | はい |
| QRコードの色のカスタマイズ | なし | はい |
| PNG/JPEG/PDF形式で出力 | System.Drawing による手動 |
組み込み出力メソッド |
| 流暢な生成チェーン | なし | はい |
| プラットフォームと展開 | ||
| Windows (System.Drawing) | はい — ZXing.Net.Bindings.Windows.Compatibility |
はい |
| Linux / Docker | はい —ZXing.Net.Bindings.ImageSharp / .V2 / .V3(異なる API) |
はい、同じAPIです |
| macOS | はい — ZXing.Net.Bindings.ImageSharp / .V2 / .V3 |
はい |
| Dockerの追加依存関係 | libgdiplus が必要になる場合があります |
None |
| 単一のNuGetパッケージ | いいえ — コア + バインディング + オプションの ImageSharp | はい |
| ライセンスとサポート | ||
| ライセンスの種類 | アパッチ2.0 | 商用 |
| コスト | 無料 | 749ドルから |
| コミュニティのサポート | GitHubの課題、活発なコミュニティ | はい |
| 商用SLAサポート | なし | はい |
| オープンソースに友好的 | はい | なし |
ねじの安全性と同時処理
スレッドセーフティは、これら2つのライブラリ間の最も重要な運用上の違いであり、ドキュメントの警告が示唆するよりも多くのプロジェクトに影響を与えます。
ZXing .NETアプローチ
ZXing.Net の BarcodeReader は状態を持つオブジェクトです。 Decode が呼び出されると、内部状態が書き込まれます。 2つのスレッドが同じインスタンスを共有すると、書き込み処理が競合状態になります。 結果は非決定論的です。異なる画像からの結果、バーコードが存在するにもかかわらずnull値、または例外が発生する可能性があります。 正しいアプローチは、スレッドごとに1つのリーダーを作成することです。つまり、並列処理または非同期処理の各パスでリーダーを割り当て、構成し、一度使用してから破棄します。
// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
};
using var bitmap = new Bitmap(path);
var result = reader.Decode(bitmap);
if (result != null)
results[path] = result.Text;
});
// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
};
using var bitmap = new Bitmap(path);
var result = reader.Decode(bitmap);
if (result != null)
results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing
Parallel.ForEach(imagePaths, Sub(path)
Dim reader As New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.EAN_13
}
Using bitmap As New Bitmap(path)
Dim result = reader.Decode(bitmap)
If result IsNot Nothing Then
results(path) = result.Text
End If
End Using
End Sub)
ThreadLocal<BarcodeReader> パターンは、スレッドごとに一つのリーダーを再利用することで呼び出しごとの割り当てを削減しますが、破棄の複雑さを追加し、それでも各インスタンスでフォーマット設定が必要です。
IronBarcodeのアプローチ
IronBarcode の BarcodeReader.Read は状態を持たない静的メソッドです。 共有すべきインスタンスも、隔離すべきインスタンスも、保護すべき構成状態も存在しない。 同じ呼び出しは、任意の数の同時実行スレッドから安全に実行できます。
// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
Parallel.ForEach(imagePaths, path =>
{
var result = BarcodeReader.Read(path, options).FirstOrDefault();
if (result != null)
results[path] = result.Value;
});
// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
Parallel.ForEach(imagePaths, path =>
{
var result = BarcodeReader.Read(path, options).FirstOrDefault();
if (result != null)
results[path] = result.Value;
});
Imports IronBarcode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Parallel.ForEach(imagePaths, Sub(path)
Dim result = BarcodeReader.Read(path, options).FirstOrDefault()
If result IsNot Nothing Then
results(path) = result.Value
End If
End Sub)
IronBarcodeの非同期およびマルチスレッドによるバーコード読み取りに関するドキュメントでは、内部のスレッドプーリングモデルについて説明しています。 MaxParallelThreads プロパティは、外部調整を必要とせずに並列度を制御します。
フォーマット検出
フォーマット検出ポリシーは、両ライブラリ間の2つ目の重要な運用上の違いである。
ZXing .NETアプローチ
ZXing.Net は各デコード前に reader.Options.PossibleFormats を埋める必要があります。 バーコード形式がリストにない場合、エラーも警告も部分的な結果も表示されず、検出されません。
// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.CODE_39,
BarcodeFormat.EAN_13,
BarcodeFormat.EAN_8,
BarcodeFormat.UPC_A,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;
using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.CODE_39,
BarcodeFormat.EAN_13,
BarcodeFormat.EAN_8,
BarcodeFormat.UPC_A,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;
using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
Imports ZXing
Imports ZXing.Common
' ZXing.Net: PossibleFormats list controls which symbologies are decoded
Dim reader As New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.CODE_39,
BarcodeFormat.EAN_13,
BarcodeFormat.EAN_8,
BarcodeFormat.UPC_A,
BarcodeFormat.DATA_MATRIX,
BarcodeFormat.PDF_417
}
reader.Options.TryHarder = True
Using bitmap As New Bitmap(imagePath)
Dim results = reader.DecodeMultiple(bitmap)
End Using
漏れを防ぐためにすべてのフォーマットをリストアップすると、パフォーマンスが低下します。 想定されるフォーマットのみが記載されている場合、外部ソースから画像が届いた際に、サイレントミスが発生するリスクが生じる。 ZXing .NETには、未登録形式のバーコードが見つかったことを報告する仕組みがありません。
IronBarcodeのアプローチ
IronBarcodeは、サポートされている50種類以上のフォーマットをすべて自動的に検出します。 フォーマットリストは不要であり、受け付けられません。
// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
Imports IronBarcode
' IronBarcode: automatic detection across all supported formats
Dim results = BarcodeReader.Read(imagePath)
For Each barcode In results
Console.WriteLine($"{barcode.Value} ({barcode.Format})")
Next
読み取り速度と検出の徹底さ を調整するアプリケーションには、フォーマットの列挙を必要とせずに、IronBarcode が ReadingSpeed 列挙型 - ExtremeDetail - を公開します。 速度調整は、エンジンが各画像をどれだけ積極的に処理するかに影響するものであり、どのフォーマットを考慮するかには影響しません。
PDFドキュメントのサポート
ZXing .NETではPDFの閲覧は大きな制約となっている。このライブラリはPDFを一切サポートしていない。
ZXing .NETアプローチ
PDFファイルにバーコードが埋め込まれている場合、ZXing .NETでは外部のPDFレンダリングライブラリが必要になります。 最も一般的な回避策はPdfiumViewerを使用することですが、これは約20MBのネイティブバイナリと、呼び出し元が実装および維持する必要のあるページレンダリングループを追加します。
// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.PDF_417
};
for (int i = 0; i < pdfDocument.PageCount; i++)
{
string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
try
{
using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
pageImage.Save(tempPath, ImageFormat.Png);
using var bitmap = new Bitmap(tempPath);
var decoded = reader.DecodeMultiple(bitmap);
if (decoded != null)
results.AddRange(decoded.Select(d => d.Text));
}
finally
{
File.Delete(tempPath);
}
}
// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.PDF_417
};
for (int i = 0; i < pdfDocument.PageCount; i++)
{
string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
try
{
using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
pageImage.Save(tempPath, ImageFormat.Png);
using var bitmap = new Bitmap(tempPath);
var decoded = reader.DecodeMultiple(bitmap);
if (decoded != null)
results.AddRange(decoded.Select(d => d.Text));
}
finally
{
File.Delete(tempPath);
}
}
Imports System.IO
Imports System.Drawing
Imports PdfiumViewer
Imports ZXing
Imports ZXing.Common
' ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
Using pdfDocument As PdfDocument = PdfDocument.Load(pdfPath)
Dim reader As New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
BarcodeFormat.QR_CODE,
BarcodeFormat.CODE_128,
BarcodeFormat.PDF_417
}
For i As Integer = 0 To pdfDocument.PageCount - 1
Dim tempPath As String = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png")
Try
Using pageImage As Image = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi)
pageImage.Save(tempPath, Imaging.ImageFormat.Png)
Using bitmap As New Bitmap(tempPath)
Dim decoded = reader.DecodeMultiple(bitmap)
If decoded IsNot Nothing Then
results.AddRange(decoded.Select(Function(d) d.Text))
End If
End Using
End Using
Finally
File.Delete(tempPath)
End Try
Next
End Using
このパターンには、実際に発生する不具合がいくつかあります。DPIの設定ミスにより、認識されないままデータが失われる場合があり、ロックダウンされた環境では一時ファイルのアクセス許可が機能せず、PdfiumViewerのネイティブライブラリは別途デプロイメント管理が必要となり、追加の設定なしではLinux上でセットアップが動作しません。
IronBarcodeのアプローチ
IronBarcodeは、PDFファイルからバーコードをネイティブに読み取ります。すべてのページ、すべてのフォーマットに対応し、外部依存関係は一切ありません。 同じ BarcodeReader.Read 呼び出しが PDF パスを直接受け入れます:
// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
Imports IronBarcode
' IronBarcode: one call processes every page of the PDF
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}")
Next
ページ列挙も、DPI設定も、一時ファイルも、アプリケーションと並行してデプロイする別のライブラリも不要です。
プラットフォームバインディングとデプロイメント
ZXing.Netの画像処理機能は、プラットフォーム固有のバインディングパッケージに分散されており、それぞれ異なるAPIインターフェースを備えている。
ZXing .NETアプローチ
コア ZXing.Net パッケージはデコーディングロジックを提供しますが、画像読み込みは行いません。 呼び出し元は、デプロイメントターゲットに基づいてバインディングを選択する必要があります。
| 環境 | パッケージ | ノート |
|---|---|---|
| Windowsデスクトップ / WPF | ZXing.Net.Bindings.Windows.Compatibility |
System.Drawing を使用 — Windowsに優しい; Linux上で libgdiplus が必要です |
| Linux / Docker/ クロスプラットフォーム | ZXing.Net.Bindings.ImageSharp / .V2 / .V3 |
異なるAPIインターフェース。 SixLabors.ImageSharp依存性を追加(V2/V3トラックImageSharp主要バージョン) |
| macOS | ZXing.Net.Bindings.ImageSharp / .V2 / .V3 |
Linuxと同じパス |
実際の結果として、System.Drawing.Bitmap を使用する Windows コードは Linux 上ではコンパイルも実行もされません。 コンテナ化には、バインディングパッケージの切り替えとイメージ読み込みコードの書き換えが必要です。
// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;
var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;
var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
Imports ZXing.Windows.Compatibility
Imports System.Drawing
Dim reader As New BarcodeReader()
Using bitmap As New Bitmap(imagePath)
Dim result = reader.Decode(bitmap)
End Using
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
Imports ZXing.ImageSharp
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Dim reader As New BarcodeReader(Of Rgba32)()
Using image As Image(Of Rgba32) = Image.Load(Of Rgba32)(imagePath)
Dim result = reader.Decode(image)
End Using
Linux ホスト上で Windows バインディングを使用する場合、Docker イメージに libgdiplus も必要で、コンテナに約 50 メガバイトの追加が加わります。
IronBarcodeのアプローチ
IronBarcodeは、すべてのプラットフォームに対応した単一のパッケージを出荷しています。 同じ BarcodeReader.Read(path) 呼び出しは、Windows、Linux、macOS、および Docker コンテナ内で同一にコンパイルおよび実行されます。 バインディングパッケージ、プラットフォーム条件、および追加のシステム依存関係は一切必要ありません。 .NETアプリケーションをコンテナ化するチーム向けに、 IronBarcodeのDockerおよびLinuxセットアップガイドでは、シングルパッケージのデプロイパターンについて詳しく解説しています。
ジェネレーションAPI
どちらのライブラリもバーコードを生成するが、APIは異なる設計アプローチを反映している。
ZXing .NETアプローチ
ZXing.Net の BarcodeWriter クラスはライター オブジェクトを作成し、エンコード オプションを受け入れ、Write を呼び出し、Bitmap を返します。呼び出し側は System.Drawing.Imaging を使用して手動で保存する必要があります:
// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;
var writer = new BarcodeWriter
{
Format = BarcodeFormat.CODE_128,
Options = new EncodingOptions
{
Width = 300,
Height = 100,
Margin = 10
}
};
using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;
var writer = new BarcodeWriter
{
Format = BarcodeFormat.CODE_128,
Options = new EncodingOptions
{
Width = 300,
Height = 100,
Margin = 10
}
};
using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
Imports ZXing
Imports ZXing.Common
Imports ZXing.Windows.Compatibility
Imports System.Drawing.Imaging
Dim writer As New BarcodeWriter With {
.Format = BarcodeFormat.CODE_128,
.Options = New EncodingOptions With {
.Width = 300,
.Height = 100,
.Margin = 10
}
}
Using bitmap = writer.Write("PRODUCT-001")
bitmap.Save("output.png", ImageFormat.Png)
End Using
PNG または JPEG 以外の形式への保存、PDF への保存、HTTP 応答のためのバイナリ出力の生成には、呼び出し側が実装する追加の System.Drawing 配管がすべて必要です。
IronBarcodeのアプローチ
IronBarcode の BarcodeWriter.CreateBarcode は、GeneratedBarcode オブジェクトを返し、流暢な連鎖を通じて組み込みの出力メソッドを提供します:
// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng("output.png");
// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
.ResizeTo(300, 100)
.SaveAsPng("output.png");
Imports IronBarCode
' IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128) _
.ResizeTo(300, 100) _
.SaveAsPng("output.png")
GeneratedBarcode オブジェクトも .SaveAsPdf() を公開しています。これは、System.Drawing を使用して呼び出し側が自身で実装する必要がある出力ターゲットです。
APIマッピングリファレンス
| ZXing.Net | IronBarcode | ノート |
|---|---|---|
new BarcodeReader() |
静的 - インスタンスなし | BarcodeReader.Read(...) は静的呼び出しです |
reader.Options.PossibleFormats = new List<BarcodeFormat> { ... } |
不要 | 自動検出はすべてのフォーマットに対応しています |
reader.Options.TryHarder = true |
Speed = ReadingSpeed.Balanced |
BarcodeReaderOptions による精度調整 |
reader.Decode(bitmap) |
BarcodeReader.Read(imagePath) |
パスを直接渡す — Bitmap は不要 |
reader.DecodeMultiple(bitmap) |
BarcodeReader.Read(imagePath) |
常にコレクションを返します |
result.Text |
result.Value |
物件名が変更されました |
result.BarcodeFormat |
result.Format |
物件名が変更されました |
BarcodeFormat.QR_CODE |
BarcodeEncoding.QRCode |
列挙型の命名規則の変更 |
BarcodeFormat.CODE_128 |
BarcodeEncoding.Code128 |
列挙型の命名規則の変更 |
BarcodeFormat.EAN_13 |
BarcodeEncoding.EAN13 |
列挙型の命名規則の変更 |
new BarcodeWriter { Format = BarcodeFormat.CODE_128, Options = new EncodingOptions { ... }} |
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) |
静的ファクトリメソッド |
writer.Write(data) は Bitmap を返します |
.SaveAsPng(path) / .ToPngBinaryData() |
GeneratedBarcode の組み込み出力メソッド |
| PDFはサポートされていません。PdfiumViewerが必要です。 | BarcodeReader.Read("doc.pdf") |
ネイティブPDFサポート |
| スレッドセーフではありません | スレッドセーフな静的API | インスタンス管理は不要です |
チームがZXing .NETからIronBarcodeへの移行を検討する際
いくつかのシナリオにより、開発チームはZXing .NETの代替としてIronBarcodeを評価するようになりました。
並行処理と高スループット処理
シングルスレッドのコンソールアプリケーションでは正しく動作するZXing .NET統合コードでも、同じコードを同時リクエストを処理するASP.NET Coreコントローラーや、バッチを並列処理するバックグラウンドジョブに移動すると、非決定的な動作を示す場合があります。 ZXing .NETで必要とされるスレッドごとのインスタンスパターンとは、リクエストまたは並列タスクごとに、構成済みのデコーダーセットを備えた完全なリーダーオブジェクトが割り当てられ、一度使用されてから破棄されることを意味します。 リクエスト量が増加するにつれて、このリソース割り当てのプレッシャーは測定可能になる。 この段階に達したチーム、特に物流、倉庫管理、文書処理などで高スループットのスキャンパイプラインを運用しているチームは、スレッドモデルがすべての呼び出し元にこのようなオーバーヘッドを課さないライブラリを探すことが多い。
混合フォーマット文書のスキャン
第三者から文書を受け取るアプリケーションでは、フォーマットリストを設定した際に想定していなかったバーコードフォーマットに遭遇することが頻繁にあります。 Code 128向けに構築された配送連携機能は、QRコードを使用してパートナーから荷物を受け取ります。 PDF 417用に構成された医療記録システムが、新しい機器ベンダーのデータマトリックスシンボル体系に遭遇する。 ZXing .NETでは、これらのケースはいずれもデコードエラーではなくサイレントヌルを生成するため、下流の処理が失敗するまでミスが顕在化しない可能性があります。 フォーマットの見落としによって痛手を負ったチーム、特にバーコードの見落としがビジネス上の影響をもたらすような状況では、フォーマットリストのメンテナンスにかかるコストと、フォーマットを自動的に検出するライブラリの導入コストを比較検討し始める。
PDFバーコード抽出
多くのビジネス文書はPDF形式で届きます。例えば、請求書、出荷明細書、患者記録、コンプライアンス証明書などです。 ZXing .NETはこれらを直接読み込むことができません。 PDFからバーコードを抽出する必要のあるチームは、最終的にZXing .NET上にレンダリングパイプラインを構築・維持することになります。具体的には、PDFライブラリの選択、ネイティブ依存関係の管理、ページレンダリングループの実装、DPI構成の処理、一時ファイルのクリーンアップロジックの記述などを行います。 そのインフラストラクチャコードはバーコードロジックではない。 これは、ZXing .NETが受け入れる形式(ビットマップ)と、実際のビジネス文書(PDF)との間のギャップを埋めるためだけに存在します。 この橋渡しを維持管理するチーム、特にPDFライブラリ自体に独自のライセンス、展開、プラットフォームに関する考慮事項がある場合、多くの場合、入力サーフェス全体を処理できる単一のライブラリを好む。
結合の複雑さを軽減する
Windows上で開発を開始し、後にLinuxやDockerにデプロイするプロジェクトは、ZXing.Netのバインディングの断片化に直接直面します。Windowsバインディングパッケージは、クロスプラットフォームのImageSharpバインディングとは異なるAPIを使用しており、両者を切り替えるには、 NuGet参照と画像読み込みコードの両方を変更する必要があります。 .NETアプリケーションをコンテナ化することを慣例としているチーム、あるいは開発者マシン(WindowsまたはmacOS)と本番サーバー(Linux)で同じコードベースを実行しているチームは、画像読み込みのための2つのコードパスを維持することが、スキャンレイヤーにおける将来のあらゆる変更に摩擦を生じさせることに気づきます。
一般的な移行の考慮事項
ZXing .NETからIronBarcodeへの移行を検討しているチームは、これらの具体的な技術的変更点について計画を立てる必要があります。
バーコードリーダーのインスタンス化の削除
コードベースのすべての new BarcodeReader() 呼び出しは移行中に削除されます。 インスタンス化パターン(リーダーの作成、フォーマットの設定、画像の読み込み、デコード呼び出し)は、単一の静的メソッド呼び出しに集約されます。 ファイルが ZXing.ImageSharp、および SixLabors.ImageSharp 名前空間をインポートする場合、それらのインポートは削除され、単一の using IronBarCode; に置き換えられます。
PossibleFormats 設定の削除
reader.Options.PossibleFormats 割り当てブロックは、各呼び出しサイトで削除されます。IronBarcode は自動フォーマット検出を実行し、フォーマット制限リストを受け入れません。TryHarder フラグは ReadingSpeed プロパティに置き換えられ、フォーマットの範囲を絞ることなく検出努力を制御する BarcodeReaderOptions に置き換えられます。
バインディングパッケージのクリーンアップ
移行は ZXing.Net.Bindings.Windows.Compatibility、任意の ZXing.Net.Bindings.ImageSharp バリアント(.V2 / .V3)、および PDF 読み取りをサポートするために追加された任意の PdfiumViewer パッケージを削除します。 Linux 上の Windows バインディングを通じて System.Drawing をサポートするために Dockerfile に libgdiplus を追加した場合、その行も削除されます。 IronBarcodeは、Dockerイメージにおいてプラットフォーム固有の依存関係を必要としません。
IronBarcodeの追加機能
上記の比較セクションで説明した機能に加え、 IronBarcodeは以下の機能を提供します。
-ロゴ埋め込みQRコード:中央にカスタムロゴ画像を重ねたQRコードを生成し、スキャン可能性を確保するために自動エラー修正を行います。
- QRコードの色のカスタマイズ:生成されるQRコードの前景色と背景色を設定し、ブランドイメージに合わせた出力を実現します。
- PDFへのバーコード印字:別途PDFライブラリを用意することなく、既存のPDFページの指定された座標にバーコードを直接書き込みます。
- GS1バーコードのサポート:小売業や医療サプライチェーンで使用されるGS1-128やGS1 DataBarなどのGS1形式のバーコードを読み取り、生成します。
- マルチスレッド非同期読み取り:
awaitパイプラインにバーコード読み取りを統合するための組み込みの非同期メソッドでブロッキングを行いません。 - ML駆動の画像補正:
TryHarderでは回復できない損傷、ぼやけ、または低コントラストのバーコードに対する自動画像強化。
.NETの互換性と将来の準備
IronBarcodeは.NET Standard 2.0以上を対象にしており、.NET Framework 4.6.2以上、.NET Core 3.1, .NET 5, .NET 6, .NET 7, .NET 8、そして.NET 9との互換性を提供しています。同ライブラリはMicrosoft for .NETリリースサイクルに合わせた定期的な更新を受け取り、.NET 10との互換性はリリース時またはリリース近傍で利用可能になります。 ZXing .NETはNuGetパッケージターゲットを通じて幅広い.NET互換性を維持しており、この観点から見ると、両ライブラリは最新 for .NETプロジェクトに適しています。
結論
ZXing .NETとIronBarcodeは、バーコードライブラリの設計において異なる哲学に基づいている。 ZXing .NETは、スレッド処理、フォーマット指定、PDFブリッジングといったすべての責任を呼び出し元に委任する、ステートフルなインスタンスベースのライブラリです。 IronBarcodeは、スレッド処理を内部化し、フォーマットを自動的に検出し、PDF入力をネイティブに処理する、ステートレスで静的APIのライブラリです。 この違いの実際的な結果として、並行処理やドキュメント処理のコンテキストで.NETコードをZXingすると、スレッドごとのインスタンスパターン、フォーマットリスト、PDFレンダリングパイプライン、プラットフォーム固有のバインディングブランチといったインフラストラクチャが蓄積される傾向があるのに対し、同じシナリオのIronBarcodeコードでは、そのような周辺構造は一切必要ありません。
ZXing .NETは、コストゼロが求められるプロジェクトにとって、非常に有力な選択肢です。 Apache 2.0ライセンスを採用しているため、オープンソースプロジェクトや、無料の依存関係を好む商用製品との互換性があります。 既知のバーコード形式、鮮明な画像、シングルスレッドまたは軽度の並列処理といった、管理された環境においては、安定した性能を発揮します。 活発なGitHubコミュニティは問題に対して迅速な対応を提供し、対応フォーマットの幅広さは商用製品に匹敵する。 これらの条件が満たされるアプリケーションにおいては、ZXing.Netのコスト面での優位性は確かに存在し、技術的な制約も対処可能な範囲内である。
IronBarcodeは、ZXing.Netの設計上の制約が運用コストとなるシナリオに対応します。例えば、リクエストごとのインスタンス割り当てが測定可能な同時実行Web API、PDF入力が例外ではなく標準となるドキュメントパイプライン、サイレントミスがビジネスリスクとなる混合フォーマットスキャン、2つのバインディングパッケージが2つのコードパスを意味するクロスプラットフォーム展開などです。 そうした状況においては、ライブラリの商用ライセンスによって、インスタンス管理を必要としないスレッドモデル、メンテナンスを必要としないフォーマット検出機能、そして別のライブラリを必要としないPDFサポートが提供されます。
その決定はプロジェクトの要件によって異なります。 単一フォーマットのプロトタイプ、オープンソースのスキャナ、またはコストが制約となる少量生産ツールなど、ZXing .NETが適切な選択肢となるケースです。外部ソースから複数のスレッドでドキュメントを処理する本番環境の Web API においては、IronBarcode の設計上の前提が実際の運用状況と合致します。 ライブラリの検出率や実際のスキャンシナリオにおける比較をより包括的に検討するには、 ZXing .NETとIronBarcodeのバーコードスキャナーの比較記事が追加分析を提供しています。
よくある質問
ZXing.Netとは?
ZXing.Netは、C#アプリケーションでバーコードを生成して読み取るため for .NETバーコードライブラリです。これは、開発者が.NETプロジェクト用のバーコードソリューションを選択する際に評価するいくつかの選択肢の1つです。
ZXing.NETとIronBarcodeの主な違いは何ですか?
IronBarcodeはインスタンス管理を必要としない静的なステートレスAPIを使用します。一方、ZXing.NETは通常、使用前にインスタンスの作成と設定が必要です。IronBarcodeはまた、ネイティブPDFサポート、自動フォーマット検出、およびすべての環境でのシングルキーライセンスを提供します。
IronBarcodeはZXing.NETよりもライセンスが簡単ですか?
IronBarcodeは単一のライセンスキーで開発環境と本番環境の両方をカバーします。これは、SDKキーとランタイムキーを分離するライセンスシステムと比較して、CI/CDパイプラインとDocker構成を簡素化します。
IronBarcodeはZXing.NETがサポートしているすべてのバーコードフォーマットをサポートしていますか?
IronBarcodeはQRコード、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1など30以上のバーコードシンボロジーをサポートしています。フォーマットの自動検出は、明示的なフォーマットの列挙が不要であることを意味します。
IronBarcodeはネイティブPDFバーコード読み取りをサポートしていますか?
IronBarcodeは、別のPDFレンダリングライブラリを必要とせず、BarCodeReader.Read("document.pdf")を使用してPDFファイルから直接バーコードを読み取ります。ページごとの結果には、ページ番号、バーコードフォーマット、値、信頼度スコアが含まれます。
IronBarcodeはZXing.Netと比べてどのようにバッチ処理を処理しますか?
IronBarcodeの静的メソッドはステートレスで当然スレッドセーフであり、スレッドごとのインスタンス管理なしにParallel.ForEachを直接使用できます。どの価格帯でもスループットの上限はありません。
IronBarcode はど for .NETバージョンをサポートしていますか?
IronBarcodeは.NET Framework 4.6.2+、.NET Core 3.1、.NET 5、6、7、8、9を単一のNuGetパッケージでサポートしています。プラットフォーム・ターゲットには、Windows x64/x86、Linux x64、macOS x64/ARMが含まれます。
.NETプロジェクトにIronBarcodeをインストールするには?
NuGet経由でIronBarcodeをインストールする:パッケージマネージャーコンソールで'Install-Package IronBarCode'を実行するか、CLIで'dotnet add package IronBarCode'を実行する。追加のSDKインストーラーやランタイムファイルは必要ありません。
ZXing.NETとは異なり、購入前にIronBarcodeを評価することはできますか?
IronBarcodeのトライアルモードでは、完全なデコードされたバーコード値を返します。購入を決定する前に、ご自身のドキュメントで読み取り精度をベンチマークすることができます。
ZXing.NETとIronBarcodeの価格の違いは何ですか?
IronBarcodeは、開発および量産をカバーする永続的なシングルデベロッパーライセンスで749ドルからご利用いただけます。価格の詳細とボリュームオプションはIronBarcodeのライセンスページでご覧いただけます。別途ランタイムライセンスは必要ありません。
ZXing.NETからIronBarcodeへの移行は簡単ですか?
ZXing.NETからIronBarcodeへの移行は、主にインスタンスベースのAPIコールをIronBarcodeの静的メソッドに置き換え、ライセンスの定型文を削除し、結果のプロパティ名を更新します。ほとんどの移行はコードを追加するのではなく、コードを削減します。
IronBarcodeはロゴ入りQRコードを生成できますか?
はい。QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")は、設定可能なエラー修正機能付きで、ブランド画像をネイティブにQRコードに埋め込みます。カラーQRコードもChangeBarCodeColor()でサポートされています。

