C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#生成与识别条形码和二维码

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

作者:大丸子

本文将使用 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 商品条码

说明:

原理补充: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 仓储物流条码

说明:

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 的品牌二维码

说明:

原理解释:二维码通过"里德-所罗门纠错码"在数据区之外冗余存储校验信息,允许部分模块被遮挡或污损后仍能恢复原数据。纠错级别从低到高分为 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());
    }
}

说明:

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#生成与识别条形码和二维码的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文