IRONSOFTWAREHOME
与其他组件比较

QRCoder与IronBarcode: 当仅限QR的库达到其极限时

Curtis Chau
Curtis Chau
Updated: 2026年4月21日

QRCoder 有一项功能非常出色:它使用纯 C# 生成二维码,没有任何外部依赖项,采用不受限制的麻省理工学院许可证,并提供了一个周到的 API,可以处理从标准有效负载格式到各种输出渲染器的所有操作。 拥有超过6000万次NuGet下载,它的声誉是当之无愧的。 与IronBarcode的比较并非质量判断,而是范围问题。 IronBarcode支持 50 多种条形码格式,可读取和写入,并通过单一一致的 API 与 PDF 文档集成。 对于需求超出二维码生成范围的团队来说,了解 二维码 的设计有意止步于何处至关重要。

了解二维码

QRCoder 由 Raffael Herrmann 于 2013 年创建,现在由 Shane32 维护。该库完全用 C# 编写,没有任何外部依赖项——没有 SkiaSharp 版本冲突,没有 ImageSharp 商业许可问题,也不需要部署本地二进制文件。 它可以在任何支持.NET 的平台上运行。

MIT许可证是真正不受限制的。 与一些流行的库不同,QRCoder 没有隐藏的商业限制,即使达到一定的收入门槛也不会触发商业许可要求。 对于开发商业应用程序的团队来说,这种区别至关重要。

PayloadGenerator 类增加了显著的实际价值:它处理常见的二维码数据格式,包括 WiFi 凭证、联系人卡片(vCard)、日历事件、短信和地理位置点,从而开发者不需要记住每个标准的线格式。 渲染器种类繁多,可支持多种输出类型。

主要架构特征:

-**零外部依赖:**纯 C# 编写,无需任何第三方运行时库,简化了在容器化或受限环境中的部署。 -**采用无收入限制的麻省理工学院许可证:**真正免费用于商业用途,没有收入门槛或商业触发条件 -**有效载荷生成器辅助工具:**内置 WiFi、vCard、日历事件、短信、地理位置和其他常见二维码有效载荷标准的格式化程序 -渲染格式多样: PNG 字节、SVG 字符串、ASCII 艺术字、Base64、BMP 以及其他多种输出格式 -**完全纠错控制:**所有四个纠错级别(L、M、Q、H)均已暴露。 -**微型二维码支持:**适用于空间受限标签的紧凑型二维码,并非所有条形码库都支持。 -仅限二维码设计: API接口仅支持二维码生成,不支持一维格式、DataMatrix数据矩阵和条形码读取。

仅限二维码设计

QRCoder 将数据创建步骤与渲染步骤分开。QRCodeGenerator 生成一个 QRCodeData 中间对象,然后传递给渲染器类。 这种模式可以精确控制输出格式,但代价是需要额外的对象:

using QRCoder;
using System.IO;

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(
    "https://example.com",
    QRCodeGenerator.ECCLevel.M
);

// PNG bytes via PngByteQRCode
var pngQR = new PngByteQRCode(qrCodeData);
byte[] pngBytes = pngQR.GetGraphic(20); // 20px per module
File.WriteAllBytes("qr.png", pngBytes);

// SVG string via SvgQRCode
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("qr.svg", svgContent);

QRCodeGenerator.CreateQrCode 方法是代码创建唯一的入口点——没有 CreateCode128、没有 CreateDataMatrix、没有 CreateEAN13。 该图书馆完全符合其预期范围。

了解IronBarcode

IronBarcode是Iron Software出品的商业.NET条形码库,它通过一个统一的 API 涵盖了 50 多种条形码格式的生成和读取。 与其为不同格式家族维护单独的库,IronBarcode 通过在同一静态 BarcodeWriterBarcodeReader 入口点上的 BarcodeEncoding 参数公开所有格式。

该库使用静态 API 模型:BarcodeWriter.CreateBarcode 不需要实例设置,BarcodeReader.Read 接受文件路径、流、字节数组和 System.Drawing.Bitmap 对象,并自动检测多格式。 PDF 文档支持——包括从 PDF 页面读取条形码和将条形码嵌入 PDF——无需外部依赖项。

主要特点:

  • 50+ 种条码格式: QR 码、Code 128、EAN-13、UPC-A、DataMatrix、PDF417、Aztec、MaxiCode,还有通过一个 BarcodeEncoding 参数可获取的更多格式
  • 集成读取 API: BarcodeReader.Read 处理图像、PDF 和流,并自动检测格式——无需第二个库
  • **QR 码自定义:**通过 QRCodeWriter 方法进行徽标嵌入、颜色更改和静默区控制
  • **PDF集成:**读取PDF页面中的条形码,并将条形码添加到现有PDF文档中
  • 静态 API 模型: 无需生成器实例——BarcodeWriter 是一个静态类 -**商业许可:**单开发者许可起价 749 美元,无格式限制。

功能对比

下表总结了 二维码 和IronBarcode之间的根本区别:

特征二维码IronBarcode
二维码生成是的——太棒了
一维条形码生成是的(30多种格式)
其他二维格式是的(DataMatrix、PDF417、Aztec 等)
条形码读取是的——自动检测
PDF 支持是的——阅读并盖章
执照麻省理工学院——真正自由商业(749 美元,单个开发商)

详细功能对比

特征二维码IronBarcode
一代
二维码
微型 QR
代码 128
EAN-13 / UPC-A
数据矩阵
PDF417
阿兹特克
总格式150岁以上
二维码功能
纠错(L/M/Q/H)
徽标嵌入
颜色定制
SVG 输出
ASCII 艺术输出
Base64 输出
有效载荷生成器助手不——手工弦乐制作
阅读
从图像中解码
从 PDF 解码
自动格式检测
集成
PDF条形码盖章
零外部依赖自成一体
许可
许可证类型麻省理工学院商业翻译
收入限制NoneNone
按格式定价NoneNone

二维码生成

这两个库都能生成二维码,但它们的 API 在生成步骤和渲染步骤之间的关系上体现了不同的设计理念。

QR编码器方法

QRCoder 使用两阶段模式:QRCodeGenerator.CreateQrCode 生成编码数据和纠错级别的 QRCodeData 中间对象,单独的渲染器类将该中间对象转换为所需输出格式。 ECC 级别是一个必填参数,没有默认值——开发人员必须明确选择:

using QRCoder;
using System.IO;

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(
    "https://example.com",
    QRCodeGenerator.ECCLevel.M
);

var qrCode = new PngByteQRCode(qrCodeData);
byte[] pngBytes = qrCode.GetGraphic(20); // pixels per module
File.WriteAllBytes("qr.png", pngBytes);

这种模式的好处是可以不用重新生成代码数据,就能将 qrCodeData 对象重用于多个输出格式。 渲染器类包括 Base64QRCodeBitmapByteQRCode 等。

IronBarcode方法

IronBarcode 在静态 BarcodeWriter 类中将生成和渲染合并成一个流畅的链。 BarcodeEncoding.QRCode 参数选择格式,类似于 SaveAsPngToPngBinaryData 的终端方法确定输出:

using IronBarCode;

// Single fluent call — no intermediate objects
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .SaveAsPng("qr.png");

对于需要显式纠错控制的情况,QRCodeWriter 类提供特定于格式的选项:

using IronBarCode;

var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Medium
);
qr.SaveAsPng("qr.png");

IronBarcode 2D 条码创建指南涵盖了所有支持的 2D 格式,包括 QR 码、DataMatrix、PDF417 和 Aztec,通过相同的 BarcodeWriter 入口点支持。

二维码定制

这两个库都支持在二维码上嵌入徽标和更改颜色,但它们对系统类型的要求有所不同。

QR编码器方法

QRCoder 徽标嵌入通过 QRCode 渲染器类(与 PngByteQRCode 不同)实现,该类公开一个接受 System.Drawing.BitmapGetGraphic 重载。 这意味着调用代码必须直接使用 System.Drawing 来加载徽标文件:

using QRCoder;
using System.Drawing;

var qrGenerator = new QRCodeGenerator();
var qrCodeData = qrGenerator.CreateQrCode(
    "https://example.com",
    QRCodeGenerator.ECCLevel.H // High ECC required when logo occludes part of the code
);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", System.Drawing.Imaging.ImageFormat.Png);

颜色自定义通过 GetGraphic 重载的 darkColorlightColor 参数采用类似模式。

IronBarcode方法

IronBarcode 将徽标嵌入和颜色更改公开为 QRCodeWriter 结果对象上的命名方法。 AddBrandLogo 方法接受文件路径,ChangeBarCodeColor 方法接受一个 Color 值:

using IronBarCode;
using System.Drawing;

// Logo embedding
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.AddBrandLogo("logo.png");
qr.SaveAsPng("qr-logo.png");

// Colour customisation
var coloredQr = QRCodeWriter.CreateQrCode("https://example.com", 500);
coloredQr.ChangeBarCodeColor(Color.DarkBlue);
coloredQr.SaveAsPng("colored-qr.png");

二维码样式定制指南详细介绍了徽标尺寸、颜色组合和静音区控制。

条形码读取

条形码读取能力是两家图书馆之间最显著的差异。

QR编码器方法

QRCoder没有条形码读取API。 QRCodeGenerator 类和所有渲染器类都仅用于生成。 目前没有办法从图像、文件或视频流中解码二维码。 需要同时生成和读取二维码的应用程序必须添加一个单独的库(通常是 ZXing .NET ),该库具有自己的 API、自己的命名空间和自己的维护周期:

// 二维码 has no reading API.
// These methods do not exist:
//   qrGenerator.Decode("image.png");
//   QRCodeReader.Read("image.png");
//
// A separate library (e.g., ZXing.Net) is required for decoding.

这是设计上的决定,而不是疏忽——QRCoder 本身就是一个生成库。

IronBarcode方法

IronBarcode在同一个软件包中包含了一个读取 API。 BarcodeReader.Read 接受图像文件、PDF 文件、流和 System.Drawing.Bitmap 对象。 它能自动检测条形码格式,无需调用者指定要查找的格式,并返回图像中找到的所有条形码:

using IronBarCode;

// Reading a QR code — no separate library required
var results = BarcodeReader.Read("qr.png");
foreach (var result in results)
{
    Console.WriteLine(result.Value);       // decoded value
    Console.WriteLine(result.Format);      // QRCode, Code128, EAN13, etc.
}

从图像中读取条形码的指南涵盖了通过同一入口点从 PDF、多页文档、流以及低分辨率或噪声图像中读取条形码的方法。

格式范围超越二维码

QR编码器方法

QRCoder 专门生成二维码——这是其设计目的。 QRCodeGenerator.CreateQrCode 方法是库提供的唯一生成入口点。 如果项目最初使用二维码,之后需要使用 代码 128 运输标签、EAN-13 产品代码或 数据矩阵 药品合规代码,则必须引入第二个库来涵盖每种附加格式:

using QRCoder;

// 二维码 is limited to QR — other formats require separate packages
var qrGenerator = new QRCodeGenerator();
var qr = qrGenerator.CreateQrCode("scan-to-track", QRCodeGenerator.ECCLevel.M);

// 代码 128 requires a different library (e.g., NetBarcode)
// 数据矩阵 requires yet another library
// Reading any format requires yet another library

IronBarcode方法

IronBarcode 通过相同的 BarcodeWriter.CreateBarcode 入口点覆盖所有格式家族。 从 QR 码切换到 代码 128 再到 数据矩阵 只需要更改 BarcodeEncoding 参数——不需要额外的包,不需要新的命名空间,不需要单独的 API:

using IronBarCode;

// All formats — one API, one package
BarcodeWriter.CreateBarcode("scan-to-track", BarcodeEncoding.QRCode)
    .SaveAsPng("campaign-qr.png");

BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-code.png");

BarcodeWriter.CreateBarcode("LOT-ABC-123", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-code.png");

API 映射参考

二维码IronBarcode
new QRCodeGenerator()静态类——无需实例
qrGenerator.CreateQrCode(data, ECCLevel.M)BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
new PngByteQRCode(qrCodeData)不需要——渲染是流程的一部分。
qrCode.GetGraphic(20).ToPngBinaryData() with .ResizeTo(w, h)
new SvgQRCode(qrCodeData).GetGraphic(10).SaveAsSvg(path)
new QRCode(qrCodeData).GetGraphic(...)QRCodeWriter.CreateQrCode(data, size, level)
QRCodeGenerator.ECCLevel.LQRCodeWriter.QrErrorCorrectionLevel.Low
QRCodeGenerator.ECCLevel.MQRCodeWriter.QrErrorCorrectionLevel.Medium
QRCodeGenerator.ECCLevel.QQRCodeWriter.QrErrorCorrectionLevel.Quartile
QRCodeGenerator.ECCLevel.HQRCodeWriter.QrErrorCorrectionLevel.Highest
PayloadGenerator.WiFi(...).ToString()"WIFI:T:WPA;S:{ssid};P:{pass};;"
无读取 APIBarcodeReader.Read(path)
仅限二维码格式通过 BarcodeEncoding.* 支持 50岁以上 种格式

当团队考虑从 二维码 迁移到IronBarcode时

对于那些项目明确只使用二维码并且将一直如此的团队来说,QRCoder 是一个维护良好的库,它将继续很好地发挥其作用。 以下场景描述了促使团队重新评估这种姿态的情况。

格式要求不再局限于二维码

大多数条形码需求都始于二维码,而 二维码 可以可靠地处理这一初始范围。 当第二种形式进入对话时,紧张感就出现了。 物流团队需要 代码 128 标签进行运输,零售业务需要 EAN-13 产品代码,制药工作流程要求使用 数据矩阵 进行序列化——每一种新格式都会促使团队添加另一个NuGet依赖项。 每增加一个库,其集成成本就包括学习一个新的命名空间、监控一个新的发布周期,以及在.NET升级时可能出现的新版本冲突点。

条形码读取变得必不可少

为营销活动生成对外二维码的应用程序仅是一个生成系统。 能够处理入库货物、验证到货产品代码或在活动中验证门票的应用程序是一个生成和读取系统。 二维码 本身设计上不具备读取功能——这个缺陷必须由第二个库来弥补。 引入读取库会大大改变条形码子系统的集成布局,特别是当读取库本身施加格式规范要求或线程安全约束时。

多图书馆维护负担

基于 二维码 的项目的自然积累模式遵循可预测的路径:QRCoder 用于生成 QR 码,1D 条形码库用于运输标签,读取库用于解码。 每个库都有自己的文档、版本控制节奏和变更历史记录。 对于一个库来说可能只是小幅的.NET版本升级,却可能导致另一个库发生重大变更。 多年来负责管理这些累积成本的团队表示,隐藏的成本不在于初始集成,而在于多次升级周期中不断累积的维护开销。

PDF 文档支持

using 二维码 无法生成条形码以嵌入 PDF 报告,也无法在文档处理流程中从传入的 PDF 文档中提取条形码。 PDF 支持需要完整的、具有条形码功能的 PDF 库,或者专用的库组合。 构建以文档为中心的工作流程(发票处理、合规性报告、从模板 PDF 生成标签)的团队发现,QRCoder 的范围边界在项目生命周期的早期就与 PDF 要求相交。

常见迁移注意事项

有效载荷生成器字符串格式

QRCoder 的 PayloadGenerator 辅助类生成符合公共 QR 码有效负载标准的字符串。 例如,WiFi 格式会生成 WIFI:T:WPA;S:NetworkName;P:Password;;。 这些字符串可以直接在IronBarcode中构造,无需辅助类,因为该格式是 QR 码规范中记录的公共标准。 有许多 PayloadGenerator 用法的团队应该计划编写小的静态辅助方法以复制字符串构建。

ECCLevel枚举映射

QRCoder 使用 QRCodeGenerator.ECCLevel,其值为 L、M、Q、H。IronBarcode使用 QRCodeWriter.QrErrorCorrectionLevel,其值为 QuartileHighest。 映射关系是直接的,但枚举引用必须在所有调用点上更新。 二维码 要求在每次 CreateQrCode 调用时明确选择 ECC,而IronBarcode在使用 BarcodeWriter.CreateBarcode 路径时应用了合理的默认值。

渲染器类移除

迁移后,QRCoder 的渲染器类——QRCode——变得不再需要。IronBarcode将渲染构建到 GeneratedBarcode 上的流畅链中,因此中间渲染器对象模式不再沿用。 可以将实例化这些渲染器类的代码替换为 BarcodeWriter 结果上的终端方法调用。

##IronBarcode的其他功能

以上对比部分未涵盖以下IronBarcode功能:

-**在PDF中添加条形码将条形码直接嵌入到现有PDF文档的指定页面坐标处 -多条形码检测:**一次调用即可读取单个图像中存在的所有条形码,无论条形码格式如何混合

  • 流和字节数组输入BarcodeReader.Read 接受 byte[]System.Drawing.Bitmap 输入,无需文件 I/O -**条形码注释和边距在生成的条形码上添加易于阅读的文本注释并配置边距宽度 -图像格式多样性同一生成链可输出 PNG、JPEG、TIFF、BMP、GIF、HTML 和 SVG 格式的图像。 -噪声图像预处理:**自动图像预处理,以提高对模糊、倾斜或低对比度输入图像的读取速度

.NET兼容性和未来准备情况

IronBarcode持续进行积极开发,定期更新,以适应当前和即将发布的.NET版本。 该库支持当前.NET LTS和最近的发布,随着新的.NET版本推出兼容性更新。QRCoder也在积极维护中,可在所有当前.NET目标上运行; 其零依赖设计使得向前兼容变得非常简单。 这两个库都适用于长期的.NET项目。 对于选择IronBarcode 的团队,商业支持模式可提供直接的技术援助和优先的错误解决。

结论

QRCoder 和IronBarcode从不同的架构起点出发,满足了相同的初始需求——生成二维码。 二维码 是一个专门构建的单一格式库,其设计有意止步于 QR 码。 IronBarcode是一个多格式库,涵盖 50 多种条形码格式的生成、读取和 PDF 集成。 比较的对象并非一个好的库和一个更好的库; 它介于专用工具和通用工具之间。

对于需要永久、有期限地生成二维码的项目来说,QRCoder 是正确的选择。 其零依赖占用、无约束的麻省理工学院许可证和 PayloadGenerator 辅助工具使其成为 2FA 注册工作流、营销活动 QR 生成器或任何条码范围明确固定的场景的绝佳选择。 该图书馆维护良好,使用广泛,并且能够可靠地执行其既定功能。 具有这些特点的球队更换阵容并不会获得任何好处。

当项目的条形码需求超出(或可能超出)二维码生成范围时, IronBarcode就成为更实用的选择。 需要读取入库货物或扫描文档中的代码、在二维码活动中生成 代码 128 标签或生成嵌入 PDF 报告中的条形码的应用程序,可以从所有这些任务中统一的 API 中受益。 QRCoder C# 替代方案指南提供了更多关于仅支持 QR 码的库在生产环境中达到其局限性的背景信息。 授权费用起价为 749 美元,详情请参阅IronBarcode授权页面

客观评价是,合适的工具完全取决于项目的范围。 对于仅需永久支持二维码的需求,QRCoder 提供所需的一切,且完全免费。对于需要支持多种格式、读取或 PDF 集成的需求, IronBarcode可避免在项目发展过程中管理多个单一用途库的麻烦。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户