跳過到頁腳內容
使用IRONBARCODE

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

傳統上,在 .NET 中建立 C# 掃描器 API 需要複雜的掃描器 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 編碼的圖像。 ScanFile 端點接受 multipart 表單數據,非常適合使用者直接上傳影像的 Web 應用程式。 流處理確保了高效的記憶體使用,而 BarcodeReaderOptions 配置則在速度和準確性之間取得了平衡。

ScanBase64 端點處理以 Base64 字串形式傳輸影像的場景,這是行動應用程式和 API 到 API 通訊中的標準做法。 它能夠從上傳的圖像或視訊串流中讀取一維和二維(矩陣)條碼。

輸出

首先,我們使用 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 端點。 該庫能夠處理從完美的數位條碼到具有挑戰性的現實世界採集的一切,提供企業級精度,而無需依賴硬體。

憑藉對多種輸入格式的支援、進階影像校正和最佳化的效能設置,開發人員可以在幾分鐘內部署可用於生產的掃描解決方案。 立即開始免費試用,實現您的掃描器 API,或瀏覽完整文檔,以了解批量處理和機器學習驅動的檢測等高級功能。

常見問題解答

使用 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 Framework 提供強大的效能。

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