フッターコンテンツにスキップ
IRONBARCODEの使用

IronBarcode を使用して C# でバーコードスキャナー API を構築する方法

これまで、C# スキャナー API を .NET で構築するには、複雑なスキャナー SDK の統合や限られたソフトウェア ライブラリが必要でした。 IronBarcode を使用すると、開発者は数分で強力でプロダクション準備が整ったバーコード スキャナー API を作成できます。 これらは簡単に、画像、PDF、さらには損傷したスキャン入力からバーコード データを処理することができます。

このチュートリアルでは、Windows 上で ASP.NET Core を使用して RESTful スキャナー API を構築する方法を示し、エンタープライズレベルの精度を維持しながら、ハードウェア スキャナー デバイスに代わるスケーラブルな代替手段を提供します。 API は、複数のスキャナー タイプを処理し、バイナリ データを処理し、サポートされている任意のマトリックスまたはテーブル形式からバーコード値を抽出することができます。

IronBarcode のインストールとセットアップ方法

IronBarcode の使用を開始するには、単一の NuGet パッケージをインストールするだけで簡単です。 ASP.NET Core プロジェクトを開き、パッケージ マネージャー コンソールで次のコマンドを実行してください:

Install-Package BarCode

インストール後、コントローラーに IronBarcode 名前空間を追加し、このワンラインの例を使用してライブラリをテストします:

using IronBarCode;
// Simple test to verify installation
var result = BarcodeReader.Read("test-barcode.png");
Console.WriteLine($"Scanned: {result.First().Value}");
using IronBarCode;
// Simple test to verify installation
var result = BarcodeReader.Read("test-barcode.png");
Console.WriteLine($"Scanned: {result.First().Value}");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

このコードはバーコード画像を読み取り、その値を出力します。 BarcodeReader.Read() メソッドはバーコード形式を自動的に検出し、結果のコレクションを返します。これにより、JPEG、BMP、PNG、TIFF などのサポートされている画像や、配列またはバイナリ データ形式からバーコード データを抽出することが非常に簡単になります。

完全なスキャナー API コントローラーを構築する方法

ASP.NET Core を使用してスキャナー API を作成するには、さまざまな入力ソースを受け入れるパラメータを持つコントローラーをセットアップする必要があります。 以下は完全な実装です:

using Microsoft.AspNetCore.Mvc;
using IronBarCode;
using System.Drawing;
namespace BarcodeScannerAPI.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class ScannerController : ControllerBase
    {
        // Model for API responses
        public class ScanResult
        {
            public bool Success { get; set; }
            public List<string> BarcodeValues { get; set; } = new List<string>();
            public string BarcodeFormat { get; set; }
            public string ErrorMessage { get; set; }
        }
        [HttpPost("scan-file")]
        public async Task<ActionResult<ScanResult>> ScanFile(IFormFile file)
        {
            if (file == null || file.Length == 0)
                return BadRequest(new ScanResult
                {
                    Success = false,
                    ErrorMessage = "No file uploaded"
                });
            try
            {
                using var stream = new MemoryStream();
                await file.CopyToAsync(stream);
                // Configure scanner options for better accuracy
                var options = new BarcodeReaderOptions
                {
                    Speed = ReadingSpeed.Balanced,
                    ExpectMultipleBarcodes = true,
                    ExpectBarcodeTypes = BarcodeEncoding.All
                };
                // Read barcodes from the uploaded file
                var results = BarcodeReader.Read(stream.ToArray(), options);
                if (results.Any())
                {
                    return Ok(new ScanResult
                    {
                        Success = true,
                        BarcodeValues = results.Select(r => r.Value).ToList(),
                        BarcodeFormat = results.First().BarcodeType.ToString()
                    });
                }
                return Ok(new ScanResult
                {
                    Success = false,
                    ErrorMessage = "No barcodes found"
                });
            }
            catch (Exception ex)
            {
                return StatusCode(500, new ScanResult
                {
                    Success = false,
                    ErrorMessage = $"Processing error: {ex.Message}"
                });
            }
        }
        [HttpPost("scan-base64")]
        public ActionResult<ScanResult> ScanBase64([FromBody] string base64Image)
        {
            try
            {
                // Convert Base64 string to byte array
                byte[] imageBytes = Convert.FromBase64String(base64Image);
                // Process with IronBarcode
                var results = BarcodeReader.Read(imageBytes);
                return ProcessResults(results);
            }
            catch (Exception ex)
            {
                return BadRequest(new ScanResult
                {
                    Success = false,
                    ErrorMessage = $"Invalid Base64 data: {ex.Message}"
                });
            }
        }
        private ScanResult ProcessResults(BarcodeResults results)
        {
            if (results.Any())
            {
                return new ScanResult
                {
                    Success = true,
                    BarcodeValues = results.Select(r => r.Value).ToList(),
                    BarcodeFormat = results.First().BarcodeType.ToString()
                };
            }
            return new ScanResult
            {
                Success = false,
                ErrorMessage = "No barcodes detected"
            };
        }
    }
}
using Microsoft.AspNetCore.Mvc;
using IronBarCode;
using System.Drawing;
namespace BarcodeScannerAPI.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class ScannerController : ControllerBase
    {
        // Model for API responses
        public class ScanResult
        {
            public bool Success { get; set; }
            public List<string> BarcodeValues { get; set; } = new List<string>();
            public string BarcodeFormat { get; set; }
            public string ErrorMessage { get; set; }
        }
        [HttpPost("scan-file")]
        public async Task<ActionResult<ScanResult>> ScanFile(IFormFile file)
        {
            if (file == null || file.Length == 0)
                return BadRequest(new ScanResult
                {
                    Success = false,
                    ErrorMessage = "No file uploaded"
                });
            try
            {
                using var stream = new MemoryStream();
                await file.CopyToAsync(stream);
                // Configure scanner options for better accuracy
                var options = new BarcodeReaderOptions
                {
                    Speed = ReadingSpeed.Balanced,
                    ExpectMultipleBarcodes = true,
                    ExpectBarcodeTypes = BarcodeEncoding.All
                };
                // Read barcodes from the uploaded file
                var results = BarcodeReader.Read(stream.ToArray(), options);
                if (results.Any())
                {
                    return Ok(new ScanResult
                    {
                        Success = true,
                        BarcodeValues = results.Select(r => r.Value).ToList(),
                        BarcodeFormat = results.First().BarcodeType.ToString()
                    });
                }
                return Ok(new ScanResult
                {
                    Success = false,
                    ErrorMessage = "No barcodes found"
                });
            }
            catch (Exception ex)
            {
                return StatusCode(500, new ScanResult
                {
                    Success = false,
                    ErrorMessage = $"Processing error: {ex.Message}"
                });
            }
        }
        [HttpPost("scan-base64")]
        public ActionResult<ScanResult> ScanBase64([FromBody] string base64Image)
        {
            try
            {
                // Convert Base64 string to byte array
                byte[] imageBytes = Convert.FromBase64String(base64Image);
                // Process with IronBarcode
                var results = BarcodeReader.Read(imageBytes);
                return ProcessResults(results);
            }
            catch (Exception ex)
            {
                return BadRequest(new ScanResult
                {
                    Success = false,
                    ErrorMessage = $"Invalid Base64 data: {ex.Message}"
                });
            }
        }
        private ScanResult ProcessResults(BarcodeResults results)
        {
            if (results.Any())
            {
                return new ScanResult
                {
                    Success = true,
                    BarcodeValues = results.Select(r => r.Value).ToList(),
                    BarcodeFormat = results.First().BarcodeType.ToString()
                };
            }
            return new ScanResult
            {
                Success = false,
                ErrorMessage = "No barcodes detected"
            };
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

このコントローラーは、ファイル アップロード用と Base64 エンコードされた画像用の 2 つのエンドポイントを提供します。 ScanFile エンドポイントはマルチパート フォーム データを受け入れ、ユーザーが画像を直接アップロードする Web アプリケーションに最適です。 ストリーム処理は効率的なメモリ使用を保証し、BarcodeReaderOptions の設定は速度と精度のバランスを取ります。

ScanBase64 エンドポイントは、モバイルアプリケーションや API 間通信で一般的な Base64 文字列として画像を送信するシナリオを処理します。 アップロードされた画像またはストリームから 1D および 2D (マトリックス) バーコードの両方を読み取ることができます。

出力

まず、Swagger を使用してエンドポイントをテストします。 こちらでスキャナー API のエンドポイントを確認できます:

IronBarcode を使用して C# でバーコード スキャナー API を構築する方法: 図 1 - Swagger UI と API エンドポイント

テストし、出力を確認しましょう。 この例では、単純な文字列値「Hello World」でエンコードされたサンプルバーコード画像を使用します。 ご覧のとおり、プログラムはバーコードを正しくスキャンし、そのデータを取得しました。

IronBarcode を使用して C# でバーコード スキャナー API を構築する方法: 図 2 - 単純なバーコードスキャンの出力

スキャナーはどのような入力ソースを処理できますか?

IronBarcode の柔軟性は、さまざまな入力形式を処理する際に際立ちます。 標準画像に加えて、スキャナー API は PDF、アップロードストリーム、および複数のグラフィック形式を処理します:

// Scanning PDFs with multiple pages
[HttpPost("scan-pdf")]
public async Task<ActionResult<ScanResult>> ScanPdf(IFormFile pdfFile
{
    using var stream = new MemoryStream();
    await pdfFile.CopyToAsync(stream);
    // ReadPdf method handles multi-page documents
    var results = BarcodeReader.ReadPdf(stream.ToArray());
    return ProcessResults(results);
}
// Processing from URL
[HttpPost("scan-url")]
public async Task<ActionResult<ScanResult>> ScanFromUrl([FromBody] string imageUrl)
{
    using var client = new HttpClient();
    var imageBytes = await client.GetByteArrayAsync(imageUrl);
    var results = BarcodeReader.Read(imageBytes);
    return ProcessResults(results);
}
// Scanning PDFs with multiple pages
[HttpPost("scan-pdf")]
public async Task<ActionResult<ScanResult>> ScanPdf(IFormFile pdfFile
{
    using var stream = new MemoryStream();
    await pdfFile.CopyToAsync(stream);
    // ReadPdf method handles multi-page documents
    var results = BarcodeReader.ReadPdf(stream.ToArray());
    return ProcessResults(results);
}
// Processing from URL
[HttpPost("scan-url")]
public async Task<ActionResult<ScanResult>> ScanFromUrl([FromBody] string imageUrl)
{
    using var client = new HttpClient();
    var imageBytes = await client.GetByteArrayAsync(imageUrl);
    var results = BarcodeReader.Read(imageBytes);
    return ProcessResults(results);
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

ReadPdf メソッドは、PDF ドキュメント内のすべてのページを自動的にスキャンし、出荷ラベル、請求書、または複数ページのレポートからバーコードを抽出します。 URL ベースのスキャンの場合、API はリモート画像を取得し、ローカル保存を必要とせずに処理します。これは、クラウド ストレージ サービスとの統合や外部システムからの画像処理に最適です。

新しいエンドポイントを持つ最新の Swagger UI を確認できます:

IronBarcode を使用して C# でバーコード スキャナー API を構築する方法: 図 3 - 新しいエンドポイントを持つ更新された Swagger UI

新しいメソッドをテストするために、2 つのサンプルバーコードを含む例の PDF を使用しました。

IronBarcode を使用して C# でバーコード スキャナー API を構築する方法: 図 4 - サンプル PDF

最初のバーコードは URL を含む基本的なバーコードであり、2 番目は前回の例の基本的な文字列エンコードのバーコードです。 エンドポイントを通じて PDF を実行した際の出力はこちらです:

IronBarcode を使用して C# でバーコード スキャナー API を構築する方法: 図 5 - バーコード出力とともにスキャンされた PDF

ご覧のとおり、両方のバーコードを正しく検出し、スキャンされたバーコードからデータを抽出しました。

パフォーマンスと精度のためのバーコード スキャナーの最適化

特定のユースケースに合わせたスキャナーの微調整が速度と精度を大幅に向上させます:

var optimizedOptions = new BarcodeReaderOptions
{
    // Speed settings: Faster, Balanced, Detailed, ExtremeDetail
    Speed = ReadingSpeed.Detailed,
    // Specify expected barcode types to reduce processing time
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
    // Enable parallel processing for batch operations
    Multithreaded = true,
    MaxParallelThreads = 4,
    // Define scanning area to focus on specific regions
    CropArea = new Rectangle(100, 100, 400, 200), // Optional: define specific scanning area
    // Apply image corrections for damaged barcodes
    ImageFilters = new ImageFilterCollection() { 
        new SharpenFilter(),
        new ContrastFilter() 
    }
};
var optimizedOptions = new BarcodeReaderOptions
{
    // Speed settings: Faster, Balanced, Detailed, ExtremeDetail
    Speed = ReadingSpeed.Detailed,
    // Specify expected barcode types to reduce processing time
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
    // Enable parallel processing for batch operations
    Multithreaded = true,
    MaxParallelThreads = 4,
    // Define scanning area to focus on specific regions
    CropArea = new Rectangle(100, 100, 400, 200), // Optional: define specific scanning area
    // Apply image corrections for damaged barcodes
    ImageFilters = new ImageFilterCollection() { 
        new SharpenFilter(),
        new ContrastFilter() 
    }
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

注: CropArea プロパティを使用すると、スキャナーは画像内の特定のマトリックスまたはテーブル領域に焦点を合わせることができます。 ただし、いくつかのオブジェクトやバーコードの位置が定義された領域の外にある場合、スキャナーが失敗する可能性があります。 このような場合は、CropArea プロパティを削除またはコメントアウトしてください。 IronBarcode は、デフォルトのフル画像ですべてのバーコード データを識別してデコードし、スキャナーが任意の Windows または Microsoft ランタイム シナリオを処理できることを保証します。

既知のスキャナータイプに最適化されたオプションを使用すると、処理時間が短縮されます。埋め込み画像フィルターを使用すると、低品質の入力に対するスキャンされたバーコードの可読性が向上します。 開発者はスキャナー SDK を設定し、利用可能なスキャナーを列挙し、UI コンポーネントまたはビデオキャプチャデバイスを統合できます。

まとめ

IronBarcode を使用した C# スキャナー API の構築により、複雑なバーコード処理が簡単な REST エンドポイントに変換されます。 このライブラリは、完璧なデジタルバーコードから挑戦的な実際のキャプチャまで、すべてを処理し、ファームウェア依存のない企業レベルの精度を提供します。

複数の入力形式のサポート、高度な画像補正、最適化されたパフォーマンス設定を備え、開発者は数分でプロダクション準備が整ったスキャン ソリューションを展開できます。 Get started with a free trial to implement your scanner API today, or explore the complete バーコード スキャナー API の実装を始めるために、無料トライアルをお試しください。または、バッチ処理や機械学習による検出などの高度な機能を探るために、完全なドキュメントをご覧ください。

よくある質問

C#でスキャナーAPIを構築するためにIronBarcodeを使用する主な利点は何ですか?

IronBarcodeは、開発者が強力で実用的なバーコードスキャナーAPIを迅速に作成できるようにし、複雑さを最小限に抑えます。複雑なスキャナーSDKの統合を排除することで、プロセスを簡素化します。

IronBarcodeは損傷したバーコード入力を処理できますか?

はい、IronBarcodeは、実際のアプリケーションで高信頼性を確保するために、損傷したスキャン入力からのバーコードデータでも処理するように設計されています。

C#スキャナーAPIでIronBarcodeが処理できる入力タイプは何ですか?

IronBarcode は、画像や PDF などのさまざまな入力からバーコードデータを処理でき、異なるスキャンニーズに対応する柔軟なソリューションを提供します。

IronBarcodeを使用してバーコードスキャナーAPIを構築するためのチュートリアルはありますか?

はい、このウェブページには、IronBarcodeを使用してRESTfulバーコードスキャンエンドポイントを構築するためのコード例を含む包括的なチュートリアルが提供されています。

IronBarcodeを使用してバーコードスキャナーAPIをどのくらい早く設定できますか?

IronBarcodeを使用することで、開発者は数分でバーコードスキャナーAPIを設定でき、開発時間と労力を合理化できます。

IronBarcodeは複雑なSDK統合を必要としますか?

いいえ、IronBarcodeは、複雑なスキャナーSDKの統合を排除し、開発者がバーコードスキャン機能を実装しやすくします。

IronBarcodeを使用してスキャナーAPIを構築する言語は何ですか?

IronBarcodeは、.NETフレームワークを活用して堅牢なパフォーマンスを実現するために、C#で使用されます。

Jordi Bardia
ソフトウェアエンジニア
Jordiは、最も得意な言語がPython、C#、C++であり、Iron Softwareでそのスキルを発揮していない時は、ゲームプログラミングをしています。製品テスト、製品開発、研究の責任を分担し、Jordiは継続的な製品改善において多大な価値を追加しています。この多様な経験は彼を挑戦させ続け、興味を持たせており、Iron Softwareで働くことの好きな側面の一つだと言います。Jordiはフロリダ州マイアミで育ち、フロリダ大学でコンピュータサイエンスと統計学を学びました。