使用C#实现条形码和二维码生成与识别功能

 更新时间:2026年09月05日 09:30:13   作者:大丸子  
本文将使用 Free Spire.Barcode for .NET,演示如何用 C# 生成 EAN-13 商品条码、Code128 仓储条码以及带 Logo 的品牌二维码,并完成条码的自动识别,有需要的小伙伴可以参考下

在新零售、仓储物流与品牌营销场景中,条形码和二维码几乎无处不在:商品的包装袋上印着 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");

运行后生成的商品条码如下:

使用 C# 生成 EAN-13 商品条码

说明:

  • 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");

生成的仓储条码如下:

使用 C# 生成 Code128 仓储物流条码

说明:

  • 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");

生成的品牌二维码如下:

使用 C# 生成带 Logo 的品牌二维码

说明:

  • 二维码使用 Data2D 存放数据(二维条码的通用字段),这里同时设置 Data 保证兼容
  • QRCodeDataMode.Byte 指定按字节模式编码,可承载 UTF-8 文本,适合放入完整 URL
  • QRCodeECL 设置纠错级别,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.Code128SetModeCode128 的字符子集选择,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-1313 位数字零售商品标签、超市结算
Code128字母 + 数字 + 符号仓储流水、物流运单、内部编码
Code39大写字母 + 数字 + 少量符号工业标识、资产管理
QR CodeURL、文本等任意数据扫码营销、电子票券、溯源入口

根据编码内容的复杂度与目标场景选择合适的制式,是保证条码"印得上去、扫得出来"的前提。

总结

通过本文示例,你已经掌握了使用 Free Spire.Barcode for .NET 生成 EAN-13 商品条码、Code128 仓储条码、带 Logo 的品牌二维码,以及用 ScanOne / ScanInfo 完成条码识别的完整流程。从创建 BarcodeSettings 到调用 GenerateImage 输出图片,再到反向识别,整个过程高度自动化,特别适用于商品标签批量打印、出入库核验与会员扫码核销等场景。

相比手工设计或依赖在线工具,代码方式的优势在于:条码数据可直接来源于数据库或业务系统,保证编码与商品信息的实时一致;批量生成时无需逐张操作;识别结果以结构化文本返回,便于直接写回系统进行比对与校验。在此基础上,你还可以扩展更多能力,例如将条码图片嵌入 PDF 或 Word 标签模板、按批次导出整包标签,或结合摄像头实时识别流水线上的产品编码。

如果你正在处理商品管理与营销物料相关需求,这套基于 C# 的条码生成与识别方案将为你的工作带来显著提升。

以上就是使用C#实现条形码和二维码生成与识别功能的详细内容,更多关于C#生成与识别条形码和二维码的资料请关注脚本之家其它相关文章!

相关文章

  • C#泛型运作原理的深入理解

    C#泛型运作原理的深入理解

    这篇文章主要给大家介绍了关于C#泛型运作原理的深入理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • C# 6.0的属性(Property)的语法与初始值详解

    C# 6.0的属性(Property)的语法与初始值详解

    下面小编就为大家带来一篇C# 6.0的属性(Property)的语法与初始值详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • c#异步读取数据库与异步更新ui的代码实现

    c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧
    2013-12-12
  • 关于C#中排序函数的总结

    关于C#中排序函数的总结

    下面小编就为大家带来一篇关于C#中排序函数的总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • C#实现时间戳与标准时间的互转

    C#实现时间戳与标准时间的互转

    本文主要介绍了C#中时间戳与标准时间互转的方法,其中需要注意的是基准时间的问题。文中的示例代码具有一定的学习价值,快来跟随小编一起了解一下吧
    2021-12-12
  • 详解如何实现C#和Python间实时视频数据交互

    详解如何实现C#和Python间实时视频数据交互

    我们在做RTSP|RTMP播放的时候,遇到好多开发者,他们的视觉算法大多运行在python下,需要高效率的实现C#和Python的视频数据交互,本文给大家总结了一些常用的方法,感兴趣的小伙伴跟着小编一起来看看吧
    2024-10-10
  • C# WPF实现页面跳转的两种方法介绍

    C# WPF实现页面跳转的两种方法介绍

    在 C# WPF 中,页面跳转通常有两种主要方式:使用 NavigationWindow+Page或在 Window 中切换 UserControl,下面我们来看看具体实现方法吧
    2025-10-10
  • 基于WPF实现时间选择控件

    基于WPF实现时间选择控件

    这篇文章主要介绍了如何基于WPF实现简单的时间选择控件,文中的示例代码讲解详细,对我们的学习或工作有一定帮助,需要的小伙伴可以参考一下
    2023-12-12
  • 浅谈关于C#的垃圾回收机制

    浅谈关于C#的垃圾回收机制

    浅谈关于C#的垃圾回收机制,需要的朋友可以参考一下
    2013-03-03
  • C#字符串内存驻留机制分析

    C#字符串内存驻留机制分析

    这篇文章介绍了C#字符串内存驻留机制,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-01-01

最新评论