C#代碼實現(xiàn)掃描圖片中的條形碼
在實際業(yè)務系統(tǒng)中,條碼的識別需求隨處可見——從倉儲物流的包裹追蹤、零售業(yè)的商品掃碼,到票務系統(tǒng)的票據(jù)驗證、醫(yī)療行業(yè)的樣本追溯,都離不開對條碼圖片的自動化解析。
本文將介紹如何在 .NET 項目中通過 C# 實現(xiàn)一維條碼掃描,涵蓋從圖片文件、內(nèi)存流中讀取條碼,獲取條碼位置信息等實用示例。
注意:本文使用的免費庫 FreeSpire.Barcode 不支持二維碼(QR Code、Data Matrix 等)的掃描。
一、環(huán)境配置與依賴安裝
首先需要創(chuàng)建一個 .NET 項目。無論是控制臺應用還是桌面程序均可。
通過 NuGet 包管理器安裝依賴庫:
Install-Package FreeSpire.Barcode
或在 .NET CLI 中執(zhí)行:
dotnet add package FreeSpire.Barcode
安裝完成后,在代碼文件中引入命名空間:
using Spire.Barcode;
二、核心 API 說明
條碼掃描主要由 BarcodeScanner 類提供,其中包含以下常用方法:
| 方法 | 說明 |
|---|---|
Scan(string path) | 從圖片文件中掃描所有條碼 |
Scan(Stream stream) | 從數(shù)據(jù)流中掃描所有條碼 |
Scan(Bitmap bitmap) | 從位圖對象中掃描所有條碼 |
ScanOne(...) | 快速掃描單一條碼(適用于圖像中只包含一個條碼的場景) |
ScanInfo(...) | 掃描并獲取條碼類型、位置坐標等詳細信息 |
所有 Scan 和 ScanInfo 方法均提供了帶 BarCodeType 參數(shù)的重載版本,可指定只識別特定類型的一維條碼(如 Code128、EAN-13 等),從而提高識別效率。
三、從圖片文件掃描條碼
3.1 掃描單張圖片中的條碼
最簡單的場景是掃描一張圖片中已存在的條碼。以下示例演示如何從圖片文件中讀取 Code128 條碼的內(nèi)容:
using Spire.Barcode;
class Program
{
static void Main(string[] args)
{
// 指定圖片路徑
string imagePath = @"C:\barcode-sample.png";
// 掃描圖片中的條碼,僅識別 Code128 類型
string[] results = BarcodeScanner.Scan(imagePath, BarCodeType.Code128);
// 輸出識別結(jié)果
if (results.Length > 0)
{
foreach (string result in results)
{
Console.WriteLine("識別到條碼內(nèi)容: " + result);
}
}
else
{
Console.WriteLine("未識別到任何條碼。");
}
}
}
Scan() 方法返回一個字符串數(shù)組,能夠處理一張圖片中包含多個條碼的情形。若圖片中恰好只有一個條碼,也可使用 ScanOne() 方法直接返回字符串結(jié)果:
string result = BarcodeScanner.ScanOne(imagePath, BarCodeType.Code128);
3.2 掃描多種條碼類型
在實際業(yè)務中,圖片可能包含不同類型的一維條碼(如 Code 128、EAN-13 混合出現(xiàn))。若不確定條碼類型,可直接調(diào)用不指定類型的方法重載:
string[] results = BarcodeScanner.Scan(imagePath);
四、從數(shù)據(jù)流掃描條碼
在 Web 應用或微服務架構(gòu)中,用戶上傳的圖片通常以數(shù)據(jù)流(Stream)的形式存在,無需寫入磁盤即可直接處理。這種方式可以減少 I/O 開銷,提升響應速度,也更適合云端部署環(huán)境。
using System;
using System.IO;
using Spire.Barcode;
namespace BarcodeScanDemo
{
class StreamScan
{
static void Main(string[] args)
{
string imagePath = @"C:\Barcode\stream_barcode.jpg";
// 1. 將圖片轉(zhuǎn)換為內(nèi)存流(適配上傳流、網(wǎng)絡流直接使用)
using (FileStream fs = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
using (MemoryStream ms = new MemoryStream())
{
fs.CopyTo(ms);
// 流指針復位(關鍵:必須將流位置重置到起始位置)
ms.Position = 0;
// 2. 從內(nèi)存流中掃描條碼(自動檢測類型)
string[] results = BarcodeScanner.Scan(ms);
// 輸出結(jié)果
if (results != null && results.Length > 0)
{
Console.WriteLine("流數(shù)據(jù)條碼識別結(jié)果:" + results[0]);
}
}
}
}
}
除了 Stream 輸入外,Scan() 方法還支持直接從 Bitmap 對象進行掃描,方便與現(xiàn)有的圖像處理流程進行集成。
五、知識擴展
在 C# 中識別圖片里的條形碼,有多種方案可選。選擇哪種,主要取決于項目的預算、性能和功能需求。
1.免費開源方案:ZXing.NET
對于絕大多數(shù)開發(fā)者而言,這通常是首選。它不僅免費,功能也足夠強大。
安裝:在 NuGet 包管理器控制臺中執(zhí)行:
Install-Package ZXing.Net
從圖片文件識別:這是最基礎的功能,只需幾行代碼即可完成。
using ZXing;
public string ScanBarcodeFromFile(string imagePath)
{
// 初始化BarcodeReader
var reader = new BarcodeReader();
// 從圖片文件中解碼
var result = reader.Decode(imagePath);
// 輸出識別結(jié)果
if (result != null)
{
Console.WriteLine($"識別成功!類型: {result.BarcodeFormat}, 內(nèi)容: {result.Text}");
return result.Text;
}
else
{
Console.WriteLine("未識別到條形碼。");
return null;
}
}從內(nèi)存中的 Bitmap 識別:如果你的圖片是以 Bitmap 對象的形式存在于內(nèi)存中,同樣可以輕松識別。
using System.Drawing;
using ZXing;
public string ScanBarcodeFromBitmap(Bitmap bitmap)
{
var reader = new BarcodeReader();
var result = reader.Decode(bitmap);
return result?.Text;
}識別圖片中的多個條碼:ZXing 也支持一次識別圖片中的多個條碼。
using ZXing;
using ZXing.Common;
using System.Drawing;
public List<string> ScanMultipleBarcodes(Bitmap bitmap)
{
var reader = new BarcodeReader();
// 解碼多個條碼
var results = reader.DecodeMultiple(bitmap);
if (results != null && results.Length > 0)
{
return results.Select(r => r.Text).ToList();
}
return null;
}處理中文內(nèi)容:如果條碼內(nèi)容是中文,識別可能出現(xiàn)亂碼,可以強制指定字符編碼來解決。
var reader = new BarcodeReader
{
Options = new DecodingOptions
{
CharacterSet = "UTF-8" // 針對中文內(nèi)容設置
}
};2. 商用方案:簡單高效
對于有預算的企業(yè)級應用,商用庫能提供更便捷的API、更全面的技術支持以及更復雜的條碼識別能力。
IronBarcode
特點:API 設計極為簡潔,甚至只需一行代碼即可完成識別。它還提供了調(diào)試視圖,方便開發(fā)時定位問題。
安裝:
Install-Package BarCode
代碼示例:
using IronBarCode;
public string ScanBarcodeWithIron(string imagePath)
{
// 一行代碼識別條碼
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}Aspose.BarCode
特點:功能全面的專業(yè)級庫,提供精細的配置選項,適合對識別速度和準確性要求極高的場景。
安裝:
Install-Package Aspose.BarCode
代碼示例:
using Aspose.BarCode.BarCodeRecognition;
public string ScanBarcodeWithAspose(string imagePath)
{
using (BarCodeReader reader = new BarCodeReader(imagePath, DecodeType.AllSupportedTypes))
{
foreach (BarCodeResult result in reader.ReadBarCodes())
{
Console.WriteLine($"Code Type: {result.CodeType}, Code Text: {result.CodeText}");
return result.CodeText;
}
}
return null;
}六、總結(jié)
本文介紹了如何在 .NET 項目中通過 C# 實現(xiàn)一維條碼掃描,涵蓋了從基礎安裝配置、單張圖片掃描、數(shù)據(jù)流處理、多碼識別到性能優(yōu)化等各個環(huán)節(jié)。主要要點總結(jié)如下:
BarcodeScanner.Scan()和ScanOne()是條碼識別的核心方法,支持圖片文件、Stream 流和 Bitmap 對象三種輸入方式ScanInfo()可獲取條碼類型和位置坐標,便于實現(xiàn)區(qū)域標注或數(shù)據(jù)分析- Web 應用中推薦使用內(nèi)存流直接處理上傳圖片,避免磁盤 I/O 開銷
- 條碼識別率受圖片質(zhì)量影響較大,需關注靜區(qū)、分辨率和清晰度
- 通過指定條碼類型、縮小圖片尺寸等方法可有效提升掃描速度
條碼識別作為自動化數(shù)據(jù)處理的基礎環(huán)節(jié),其穩(wěn)定性和準確度直接影響業(yè)務流程的效率。掌握上述技術要點后,開發(fā)者可以根據(jù)實際需求靈活構(gòu)建適用于自身場景的一維條碼掃描解決方案。
到此這篇關于C#代碼實現(xiàn)掃描圖片中的條形碼的文章就介紹到這了,更多相關C#掃描圖片條形碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

