跳過到頁腳內容
使用IRONBARCODE

如何使用IronBarcode在C#中構建條碼掃描器API

在 .NET 中構建 C# 掃描器 API 傳統上需要複雜的掃描器 SDK 集成或受限的軟件庫。 使用IronBarcode,開發人員可以在幾分鐘內創建一個強大且準備投產的條碼掃描器 API。 這些可以輕鬆地從圖像、PDF 甚至損壞的掃描輸入中處理條碼數據

本教程展示了如何使用 ASP.NET Core 在 Windows 上構建 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 編碼圖像。 ScanFile 端點接受多部分表單數據,非常適合用戶直接上傳圖像的 Web 應用程序。 流處理確保高效的內存使用,而 BarcodeReaderOptions 配置在速度和精度之間取得了平衡。

ScanBase64 端點處理將圖像作為 Base64 字符串傳輸的情況,這在移動應用程序和 API 到 API 通信中是標準的。 它可以從上傳的圖像或流中讀取 1D 和 2D(矩陣)條碼。

輸出

首先,我們使用 Swagger 測試我們的端點。 在這裡,您可以看到掃描器 API 端點:

如何使用 IronBarcode 構建 C# 條碼掃描器 API:圖 1 - 帶有我們的 API 端點的 Swagger UI

現在,我們來測試它們並查看輸出。 就本示例而言,我將使用一個簡單字符串值“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

為了測試我們的新方法,我使用了包含兩個示例條碼的示例 PDF 。

如何使用 IronBarcode 構建 C# 條碼掃描器 API : 圖 4 - 示例 PDF

第一個是帶有 URL 的基本條碼,第二個是我們上個示例中的基本字符串編碼條碼。 這是我們的 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 文檔中的進階功能如批次處理和機器學習驅動的檢測。

常見問題解答

使用IronBarcode來構建C#掃描器API的主要好處是什麼?

IronBarcode允許開發人員以最少的複雜性快速創建功能強大的、可投入生產的條碼掃描器API。它通過消除對複雜掃描器SDK整合的需求來簡化該過程。

IronBarcode能處理損壞的條碼輸入嗎?

可以,IronBarcode被設計為即使是損壞的掃描輸入也可處理條碼數據,確保高可靠性應用於現實世界應用程序中。

IronBarcode在C#掃描器API中能處理哪種類型的輸入?

IronBarcode能處理來自圖像和PDF等多種輸入的條碼數據,提供不同掃描需求的多樣化解決方案。

是否有教程供使用IronBarcode構建條碼掃描器API?

有的,該網頁提供了全面的教程,配有代碼範例,指導開發人員使用IronBarcode建立RESTful條碼掃描端點。

使用IronBarcode可以多快設置條碼掃描器API?

使用IronBarcode,開發人員可以在幾分鐘內設置條碼掃描器API,精簡開發時間和精力。

IronBarcode是否需要任何複雜的SDK整合?

不,IronBarcode不需要複雜的掃描器SDK整合,這使得開發人員更容易實現條碼掃描功能。

使用IronBarcode構建掃描器API的編程語言是什麼?

IronBarcode使用C#來構建掃描器API,利用.NET框架提供強大的性能。

Jordi Bardia
軟體工程師
Jordi 在 Python、C# 和 C++ 上最得心應手,當他不在 Iron Software 展現技術時,便在做遊戲編程。在分担产品测测试,产品开发和研究的责任时,Jordi 为持续的产品改进增值。他说这种多样化的经验使他受到挑战并保持参与, 而这也是他与 Iron Software 中工作一大乐趣。Jordi 在佛罗里达州迈阿密长大,曾在佛罗里达大学学习计算机科学和统计学。