C#代码实现扫描图片中的条形码
在实际业务系统中,条码的识别需求随处可见——从仓储物流的包裹追踪、零售业的商品扫码,到票务系统的票据验证、医疗行业的样本追溯,都离不开对条码图片的自动化解析。
本文将介绍如何在 .NET 项目中通过 C# 实现一维条码扫描,涵盖从图片文件、内存流中读取条码,获取条码位置信息等实用示例。
注意:本文使用的免费库 FreeSpire.Barcode 不支持二维码(QR Code、Data Matrix 等)的扫描。
一、环境配置与依赖安装
首先需要创建一个 .NET 项目。无论是控制台应用还是桌面程序均可。
通过 NuGet 包管理器安装依赖库:
Install-Package FreeSpire.Barcode
或在 .NET CLI 中执行:
dotnet add package FreeSpire.Barcode
安装完成后,在代码文件中引入命名空间:
using Spire.Barcode;
二、核心 API 说明
条码扫描主要由 BarcodeScanner 类提供,其中包含以下常用方法:
| 方法 | 说明 |
|---|---|
Scan(string path) | 从图片文件中扫描所有条码 |
Scan(Stream stream) | 从数据流中扫描所有条码 |
Scan(Bitmap bitmap) | 从位图对象中扫描所有条码 |
ScanOne(...) | 快速扫描单一条码(适用于图像中只包含一个条码的场景) |
ScanInfo(...) | 扫描并获取条码类型、位置坐标等详细信息 |
所有 Scan 和 ScanInfo 方法均提供了带 BarCodeType 参数的重载版本,可指定只识别特定类型的一维条码(如 Code128、EAN-13 等),从而提高识别效率。
三、从图片文件扫描条码
3.1 扫描单张图片中的条码
最简单的场景是扫描一张图片中已存在的条码。以下示例演示如何从图片文件中读取 Code128 条码的内容:
using Spire.Barcode;
class Program
{
static void Main(string[] args)
{
// 指定图片路径
string imagePath = @"C:\barcode-sample.png";
// 扫描图片中的条码,仅识别 Code128 类型
string[] results = BarcodeScanner.Scan(imagePath, BarCodeType.Code128);
// 输出识别结果
if (results.Length > 0)
{
foreach (string result in results)
{
Console.WriteLine("识别到条码内容: " + result);
}
}
else
{
Console.WriteLine("未识别到任何条码。");
}
}
}
Scan() 方法返回一个字符串数组,能够处理一张图片中包含多个条码的情形。若图片中恰好只有一个条码,也可使用 ScanOne() 方法直接返回字符串结果:
string result = BarcodeScanner.ScanOne(imagePath, BarCodeType.Code128);
3.2 扫描多种条码类型
在实际业务中,图片可能包含不同类型的一维条码(如 Code 128、EAN-13 混合出现)。若不确定条码类型,可直接调用不指定类型的方法重载:
string[] results = BarcodeScanner.Scan(imagePath);
四、从数据流扫描条码
在 Web 应用或微服务架构中,用户上传的图片通常以数据流(Stream)的形式存在,无需写入磁盘即可直接处理。这种方式可以减少 I/O 开销,提升响应速度,也更适合云端部署环境。
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. 将图片转换为内存流(适配上传流、网络流直接使用)
using (FileStream fs = new FileStream(imagePath, FileMode.Open, FileAccess.Read))
using (MemoryStream ms = new MemoryStream())
{
fs.CopyTo(ms);
// 流指针复位(关键:必须将流位置重置到起始位置)
ms.Position = 0;
// 2. 从内存流中扫描条码(自动检测类型)
string[] results = BarcodeScanner.Scan(ms);
// 输出结果
if (results != null && results.Length > 0)
{
Console.WriteLine("流数据条码识别结果:" + results[0]);
}
}
}
}
}
除了 Stream 输入外,Scan() 方法还支持直接从 Bitmap 对象进行扫描,方便与现有的图像处理流程进行集成。
五、知识扩展
在 C# 中识别图片里的条形码,有多种方案可选。选择哪种,主要取决于项目的预算、性能和功能需求。
1.免费开源方案:ZXing.NET
对于绝大多数开发者而言,这通常是首选。它不仅免费,功能也足够强大。
安装:在 NuGet 包管理器控制台中执行:
Install-Package ZXing.Net
从图片文件识别:这是最基础的功能,只需几行代码即可完成。
using ZXing;
public string ScanBarcodeFromFile(string imagePath)
{
// 初始化BarcodeReader
var reader = new BarcodeReader();
// 从图片文件中解码
var result = reader.Decode(imagePath);
// 输出识别结果
if (result != null)
{
Console.WriteLine($"识别成功!类型: {result.BarcodeFormat}, 内容: {result.Text}");
return result.Text;
}
else
{
Console.WriteLine("未识别到条形码。");
return null;
}
}从内存中的 Bitmap 识别:如果你的图片是以 Bitmap 对象的形式存在于内存中,同样可以轻松识别。
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;
}处理中文内容:如果条码内容是中文,识别可能出现乱码,可以强制指定字符编码来解决。
var reader = new BarcodeReader
{
Options = new DecodingOptions
{
CharacterSet = "UTF-8" // 针对中文内容设置
}
};2. 商用方案:简单高效
对于有预算的企业级应用,商用库能提供更便捷的API、更全面的技术支持以及更复杂的条码识别能力。
IronBarcode
特点:API 设计极为简洁,甚至只需一行代码即可完成识别。它还提供了调试视图,方便开发时定位问题。
安装:
Install-Package BarCode
代码示例:
using IronBarCode;
public string ScanBarcodeWithIron(string imagePath)
{
// 一行代码识别条码
var result = BarcodeReader.Read(imagePath).FirstOrDefault();
return result?.Value;
}Aspose.BarCode
特点:功能全面的专业级库,提供精细的配置选项,适合对识别速度和准确性要求极高的场景。
安装:
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;
}六、总结
本文介绍了如何在 .NET 项目中通过 C# 实现一维条码扫描,涵盖了从基础安装配置、单张图片扫描、数据流处理、多码识别到性能优化等各个环节。主要要点总结如下:
BarcodeScanner.Scan()和ScanOne()是条码识别的核心方法,支持图片文件、Stream 流和 Bitmap 对象三种输入方式ScanInfo()可获取条码类型和位置坐标,便于实现区域标注或数据分析- Web 应用中推荐使用内存流直接处理上传图片,避免磁盘 I/O 开销
- 条码识别率受图片质量影响较大,需关注静区、分辨率和清晰度
- 通过指定条码类型、缩小图片尺寸等方法可有效提升扫描速度
条码识别作为自动化数据处理的基础环节,其稳定性和准确度直接影响业务流程的效率。掌握上述技术要点后,开发者可以根据实际需求灵活构建适用于自身场景的一维条码扫描解决方案。
到此这篇关于C#代码实现扫描图片中的条形码的文章就介绍到这了,更多相关C#扫描图片条形码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
DevExpress实现GridControl同步列头checkbox与列中checkbox状态
这篇文章主要介绍了DevExpress实现GridControl同步列头checkbox与列中checkbox状态,需要的朋友可以参考下2014-08-08
混合语言编程—C#使用原生的Directx和OpenGL绘图的方法
本文要说的是混合C#和C/C++语言编程,在C#的Winform和WPF下使用原生的Direct和OpenGL进行绘图2013-09-09
浅析C#中的Main(String[] args)参数输入问题
本篇文章主要是对C#中的Main(String[] args)参数输入问题进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助2014-01-01


最新评论