使用C#实现条形码和二维码生成与识别功能
作者:大丸子
在新零售、仓储物流与品牌营销场景中,条形码和二维码几乎无处不在:商品的包装袋上印着 13 位的 EAN 商品条码,仓库货架与物流单上贴着 Code128 仓储条码,商家海报和产品手册上则印着带品牌 Logo 的二维码引导用户扫码关注。过去,这些条码图片往往依赖专门的条码设计软件手工制作,或求助于第三方在线生成工具——既要逐张导出、拼接 Logo,又无法与企业的商品数据、会员系统实时联动,一旦商品上量,效率问题立刻暴露。
使用程序化的方式生成条码,情况则完全不同:只需把商品编码、链接或会员信息作为数据传入,几行代码即可批量输出高质量的条码图片,必要时还能自动叠加品牌 Logo。更重要的是,程序还能反向"读懂"条码,把扫码枪或手机照片中的条码内容还原成结构化的文本数据,用于出入库校验、会员核销等环节,形成"生成—印刷—识别"的完整闭环。
本文将使用 Free Spire.Barcode for .NET,演示如何用 C# 生成 EAN-13 商品条码、Code128 仓储条码以及带 Logo 的品牌二维码,并完成条码的自动识别。该库面向 .NET 开发者,只需一行代码即可创建或读取常见的一维、二维条码,支持 Bitmap、PNG、JPG、TIFF 等多种输出格式。
1. 环境准备与库安装
Free Spire.Barcode for .NET 是 Spire.Barcode for .NET 的免费版本,支持生成与识别主流的一维条码,并支持生成二维码。在 Visual Studio 的包管理器控制台中执行以下命令即可安装:
Install-Package FreeSpire.Barcode
安装完成后,在代码文件顶部引入条码命名空间:
using Spire.Barcode; using System.Drawing;
版本说明:免费版仅供个人与教育机构使用,商业用途请购买商业版。免费版支持生成与识别 CODABAR、CODE11、CODE39、CODE39 EXTENDED、CODE93、CODE93 EXTENDED、CODE128、EAN8、EAN13、EAN14、SCC14 等一维条码,并支持生成 QR Code 二维码;其中 QR Code 仅支持生成、不支持扫描识别,EAN128、PostNet 等类型仅支持生成。本文的示例均基于免费版能力展开。
2. 生成 EAN-13 商品条码
EAN-13 是最常见的零售商品条码标准,由 13 位数字组成:前 3 位是国家/地区前缀,中间是厂商代码与商品代码,最后 1 位是校验码。下面以一款国产商品的编码为例,演示完整的生成流程:
using Spire.Barcode;
using System.Drawing;
// 1. 创建条码配置对象
BarcodeSettings settings = new BarcodeSettings();
// 2. 指定条码类型与数据
settings.Type = BarCodeType.EAN13;
settings.Data = "6901234567892";
// 3. 创建生成器并输出条码图片
BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcodeImage = generator.GenerateImage();
// 4. 保存为 PNG 图片
barcodeImage.Save("EAN13Code.png");运行后生成的商品条码如下:

说明:
BarcodeSettings是条码的配置中心,Type决定条码制式,Data存放待编码的数据BarCodeGenerator依据配置生成条码,GenerateImage()返回System.Drawing.Image对象,可调用Save()落盘,也可直接用于 WinForms 的PictureBox显示- EAN-13 的
Data必须为 13 位数字,若位数不符,编码时会被自动校验或截断,因此建议在写入前先做一次长度校验
原理补充:EAN-13 的第 13 位是校验位,由前 12 位按"奇数位权重 1、偶数位权重 3"加权求和后取模计算得出。程序化生成最大的好处是无需人工计算校验位——库会自动补全,确保条码一次生成即可被扫描设备正确识别。
3. 生成 Code128 仓储物流条码
仓储与物流场景更常用 Code128 条码,它支持字母、数字与符号的混合编码,且信息密度高,适合承载入库单号、运单号、批次号等流水信息。下面生成一个包含字母与数字的入库流水条码,并让条码下方直接显示编码文本:
using Spire.Barcode;
using System.Drawing;
// 1. 创建条码配置对象
BarcodeSettings settings = new BarcodeSettings();
// 2. 指定条码类型、数据与子集模式
settings.Type = BarCodeType.Code128;
settings.Data = "INB20260904-0001";
// 3. 子集自动选择,并开启底部文本显示
settings.Code128SetMode = Code128SetMode.Auto;
settings.ShowTextOnBottom = true;
// 4. 生成并保存
BarCodeGenerator generator = new BarCodeGenerator(settings);
generator.GenerateImage().Save("Code128Code.png");生成的仓储条码如下:

说明:
Code128SetMode.Auto让库根据数据内容在 A/B/C 三个字符集中自动切换,数值密集的编码会用 C 子集压缩,条码更短ShowTextOnBottom = true会在条码下方直接渲染编码文本,方便人工肉眼核对,尤其适合标签打印场景- Code128 允许字母、数字与常见符号混合,相比纯数字的 EAN 条码,更适合承载内部业务流水号
4. 生成带 Logo 的品牌二维码
二维码(QR Code)可承载 URL、文本等任意数据,是扫码营销的核心载体。为了让二维码更具品牌辨识度,可以在二维码中心叠加企业 Logo,同时通过设置数据模式与容错级别,保证叠加 Logo 后仍然稳定可扫:
using Spire.Barcode;
using System.Drawing;
// 1. 创建二维码配置对象
BarcodeSettings settings = new BarcodeSettings();
// 2. 指定类型与数据(例如商品详情页链接)
settings.Type = BarCodeType.QRCode;
settings.Data2D = "https://www.example.com/product/1024";
settings.Data = "https://www.example.com/product/1024";
// 3. 设置数据模式与容错级别
settings.QRCodeDataMode = QRCodeDataMode.Byte;
settings.QRCodeECL = QRCodeECL.M;
// 4. 叠加品牌 Logo,并关闭底部文本
settings.QRCodeLogoImage = Image.FromFile(@"logo.png");
settings.ShowTextOnBottom = false;
// 5. 生成并保存
BarCodeGenerator generator = new BarCodeGenerator(settings);
Image barcode = generator.GenerateImage();
barcode.Save("BrandQRCode.png");生成的品牌二维码如下:

说明:
- 二维码使用
Data2D存放数据(二维条码的通用字段),这里同时设置Data保证兼容 QRCodeDataMode.Byte指定按字节模式编码,可承载 UTF-8 文本,适合放入完整 URLQRCodeECL设置纠错级别,M表示约 15% 的纠错能力QRCodeLogoImage接收一张Image对象作为中心 Logo,一般建议搭配较高的纠错级别,覆盖部分模块后仍可被手机识别
原理解释:二维码通过"里德-所罗门纠错码"在数据区之外冗余存储校验信息,允许部分模块被遮挡或污损后仍能恢复原数据。纠错级别从低到高分为 L、M、Q、H 四档,对应约 7%、15%、25%、30% 的容错率。品牌 Logo 覆盖的正是数据区的中心区域,选择 M 或 Q 级别即可在"美观"与"可扫"之间取得平衡。
5. 识别条码内容
生成只是闭环的一半。在收货核验、会员核销等场景中,我们需要把条码图片还原为结构化数据。Free Spire.Barcode 提供了两种识别方式:ScanOne 用于快速读取单一条码,ScanInfo 用于读取条码的详细元信息。
5.1 快速识别:ScanOne
ScanOne 直接返回识别出的字符串,适合"读一个条码、拿到一个结果"的轻量场景:
using Spire.Barcode;
// 直接识别图片中的条码
string scanResult = BarcodeScanner.ScanOne("Code128Code.png");
Console.WriteLine("识别结果:" + scanResult);对上一节生成的仓储条码执行上述代码,控制台会输出:
识别结果:INB20260904-0001
5.2 详细识别:ScanInfo
当一张图片中可能包含多个条码,或需要拿到条码类型、位置坐标等细节时,使用 ScanInfo:
using Spire.Barcode;
using System.Drawing;
// 识别图片中的所有条码
BarcodeInfo[] barcodeInfos = BarcodeScanner.ScanInfo("barcodes.png");
// 遍历识别结果
foreach (BarcodeInfo info in barcodeInfos)
{
Console.WriteLine("条码类型:" + info.BarCodeReadType);
Console.WriteLine("条码数据:" + info.DataString);
// 输出条码顶点坐标,供定位与裁剪使用
foreach (Point p in info.Vertexes)
{
Console.WriteLine("顶点坐标:" + p.ToString());
}
}说明:
BarcodeInfo.BarCodeReadType返回识别出的条码制式,可用于判断条码是否符合预期(例如校验是否为 EAN-13)BarcodeInfo.DataString是识别的核心结果,即被编码的原始数据BarcodeInfo.Vertexes提供条码外轮廓的顶点坐标,可用于在原始图片上定位、框选或裁剪条码区域
6. 关键类与方法解析
通过前文的示例可以看出,Free Spire.Barcode 的 API 高度统一:配置条码 → 生成图片 → 识别还原,掌握几个核心类即可应对绝大多数场景。
核心类
| 类 / 方法 / 属性 | 说明 |
|---|---|
BarcodeSettings | 条码配置对象,集中保存条码制式、数据与外观参数 |
BarcodeSettings.Type | 指定条码制式,取值为 BarCodeType 枚举(EAN13、Code128、QRCode 等) |
BarcodeSettings.Data | 一维条码的编码数据(字母/数字字符串) |
BarcodeSettings.Data2D | 二维条码(如二维码)的编码数据 |
BarcodeSettings.Code128SetMode | Code128 的字符子集选择,Auto 自动切换,可提升编码密度 |
BarcodeSettings.ShowTextOnBottom | 是否在条码底部显示编码文本,便于人工核对 |
BarcodeSettings.QRCodeDataMode | 二维码的数据模式,Byte 可按字节编码 UTF-8 文本 |
BarcodeSettings.QRCodeECL | 二维码纠错级别(L / M / Q / H),影响容错率 |
BarcodeSettings.QRCodeLogoImage | 二维码中心叠加的 Logo 图片 |
BarCodeGenerator | 条码生成器,根据 BarcodeSettings 输出条码图片 |
BarCodeGenerator.GenerateImage() | 生成条码,返回 System.Drawing.Image |
BarcodeScanner.ScanOne(path) | 快速识别单一条码,返回识别字符串 |
BarcodeScanner.ScanInfo(path) | 识别图片中所有条码,返回 BarcodeInfo[] |
BarcodeInfo.BarCodeReadType | 识别出的条码制式 |
BarcodeInfo.DataString | 识别出的原始数据 |
BarcodeInfo.Vertexes | 条码外轮廓顶点坐标集合 |
选型建议
| 条码类型 | 编码内容 | 典型场景 |
|---|---|---|
| EAN-13 | 13 位数字 | 零售商品标签、超市结算 |
| Code128 | 字母 + 数字 + 符号 | 仓储流水、物流运单、内部编码 |
| Code39 | 大写字母 + 数字 + 少量符号 | 工业标识、资产管理 |
| QR Code | URL、文本等任意数据 | 扫码营销、电子票券、溯源入口 |
根据编码内容的复杂度与目标场景选择合适的制式,是保证条码"印得上去、扫得出来"的前提。
总结
通过本文示例,你已经掌握了使用 Free Spire.Barcode for .NET 生成 EAN-13 商品条码、Code128 仓储条码、带 Logo 的品牌二维码,以及用 ScanOne / ScanInfo 完成条码识别的完整流程。从创建 BarcodeSettings 到调用 GenerateImage 输出图片,再到反向识别,整个过程高度自动化,特别适用于商品标签批量打印、出入库核验与会员扫码核销等场景。
相比手工设计或依赖在线工具,代码方式的优势在于:条码数据可直接来源于数据库或业务系统,保证编码与商品信息的实时一致;批量生成时无需逐张操作;识别结果以结构化文本返回,便于直接写回系统进行比对与校验。在此基础上,你还可以扩展更多能力,例如将条码图片嵌入 PDF 或 Word 标签模板、按批次导出整包标签,或结合摄像头实时识别流水线上的产品编码。
如果你正在处理商品管理与营销物料相关需求,这套基于 C# 的条码生成与识别方案将为你的工作带来显著提升。
以上就是使用C#实现条形码和二维码生成与识别功能的详细内容,更多关于C#生成与识别条形码和二维码的资料请关注脚本之家其它相关文章!
