在新零售、仓储物流与品牌营销场景中,条形码和二维码几乎无处不在:商品的包装袋上印着 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#生成与识别条形码和二维码的资料请关注代码网其它相关文章!
发表评论