IRONSOFTWAREHOME
视频

从 二维码 迁移到 IronBarcode

Curtis Chau
Curtis Chau
Updated: 2026年8月1日

本指南是为那些项目最初使用 二维码 开发,但后来发展到需要 QR 码生成以外的功能的开发团队编写的。 二维码 是一个维护良好、质量上乘的库,在其预期范围内表现出色,迁移并不反映其质量。 这是为了满足一些超出 二维码 设计功能范围的需求,例如格式扩展、条形码读取、PDF 集成等。 本指南涵盖了从 二维码 到IronBarcode的完整技术路径:软件包替换、命名空间更改、每个常见模式的代码转换、API 等效性映射以及过渡期间出现的问题的解决方案。

为什么要从 二维码 迁移?

除二维码外,格式要求: 二维码 仅生成二维码。 随着项目需要Code 128标签用于物流、EAN-13代码用于零售产品识别、DataMatrix用于制药序列化或PDF417用于政府文件合规,必须为每个新增格式引入一个单独的库。 随着所需格式数量的增加,独立软件包、API 和维护义务的数量也会增加。

条形码读取要求: 二维码 没有条形码读取 API——它本身就是一个仅用于生成条形码的库。 任何需要解码传入图像中的二维码、验证扫描文档上的条形码或处理发货标签的应用程序,都必须在 二维码 之外添加一个专用的读取库。 第二个库有它自己的 API 接口、自己的更新周期,以及每次.NET升级时自身的兼容性问题。

**多库维护:**基于 二维码 的项目的实际积累模式是从用于生成 QR 的 二维码 到用于运输标签的一维条形码库,再到用于解码的读取库。 管理三到四个独立的软件包意味着要跟踪不同的发行说明,在任何一个软件包更新时解决版本冲突,以及保持对整个开发团队中多个 API 的熟悉程度。 随着时间的推移,维护负担会以各种方式累积,而这些在最初的集成估算中是看不到的。

**PDF 支持:**在 PDF 文档中嵌入条形码或从传入的 PDF 文件中提取条形码均超出 二维码 的功能范围。 文档处理流程——发票处理、从 PDF 模板生成标签、合规性报告——很早就遇到了这个边界。 必须向 二维码 添加专用的 PDF 库,或者架构必须通过单独的子系统来处理条形码生成和 PDF 生成。

基本问题

QRCoder 可以高效地解决二维码生成问题。 一旦任何需求超出二维码范围,代码库就必须开始引入额外的软件包来填补每个空白:

// 二维码 handles QR generation well — but no further
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));

// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
C#

IronBarcode将 PDF 生成、读取和集成整合到一个 API 中:

//IronBarcode— one library covers all of the above
using IronBarCode;

// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
C#

IronBarcode与 QRCoder:功能对比

特征二维码IronBarcode
二维码生成是的——太棒了
微型 QR
代码 128 / 代码 39
EAN-13 / UPC-A
数据矩阵
PDF417
阿兹特克
总格式150岁以上
条形码读取是的——自动检测
PDF条形码提取
PDF条形码盖章
徽标嵌入
颜色定制
SVG 输出
有效载荷生成器助手不——手工弦乐制作
零外部依赖自成一体
执照麻省理工学院——不受限制商业——Lite级别涵盖单个开发人员

快速入门:QRCoder 到IronBarcode 的迁移

步骤 1:替换 NuGet 软件包

从项目中移除 QRCoder:

dotnet remove package QRCoder
SHELL

安装IronBarcode:

dotnet add package IronBarcode
SHELL

如果该项目使用了 ZXing .NET和 二维码 进行条形码读取,那么也可以在此阶段移除该软件包:

dotnet remove package ZXing.Net
SHELL

步骤 2:更新命名空间

将 二维码 命名空间导入替换为IronBarcode命名空间:

// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;

步骤 3:初始化许可证

在应用程序启动时添加许可证初始化——Startup.cs或静态构造函数:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

无需注册即可获得免费试用密钥。 生产环境部署需要购买许可证。

代码迁移示例

基本二维码生成

最常见的QRCoder模式需要三个对象:一个PngByteQRCode。 在IronBarcode中,一个静态调用即可取代此链。

QRCoder 方法:

using QRCoder;

public class BarcodeService
{
    private readonly QRCodeGenerator _generator = new QRCodeGenerator();

    public byte[] GenerateQR(string content)
    {
        var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
        var qrCode = new PngByteQRCode(qrCodeData);
        return qrCode.GetGraphic(10); // 10px per module
    }
}

IronBarcode方法:

using IronBarCode;

public class BarcodeService
{
    public byte[] GenerateQR(string content)
    {
        return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
            .ResizeTo(200, 200)
            .ToPngBinaryData();
    }
}

BarcodeWriter是一个静态类——不需要实例,也没有中间数据对象。 GetGraphic中接受的每模块像素整数。 在QRCoder通过模块计数调整输出大小(例如,GetGraphic(10)为10px每模块的图像)时,IronBarcode接受绝对像素尺寸。

将二维码保存到文件

QRCoder 仅通过终端步骤将内存中的字节与文件输出分开——渲染器链也是如此。 IronBarcode在同一条链上使用不同的终端方法。

QRCoder 方法:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);

IronBarcode方法:

using IronBarCode;

// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("output.png");

// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .ToPngBinaryData();

SaveAsPng方法是一个直接写入磁盘的终端。 byte[]用于流、HTTP响应或数据库存储。

SVG 输出

QRCoder 方法:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);

IronBarcode方法:

using IronBarCode;

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsImage("output.svg");

.svg扩展将产生SVG输出)。

纠错级别映射

QRCoder在每次QRCodeGenerator.ECCLevel枚举显式选择ECC。 IronBarcode在使用QRCodeWriter.QrErrorCorrectionLevel提供显式控制。

QRCoder 方法:

using QRCoder;

var generator = new QRCodeGenerator();

// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);

// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

IronBarcode方法:

using IronBarCode;

// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("default-ecc.png");

// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");

电平映射为:ECCLevel.LECCLevel.MECCLevel.QECCLevel.HHighest

徽标嵌入

这两个库都支持在二维码中嵌入logo。 QRCoder通过System.Drawing.Bitmap参数路由此流程。 IronBarcode提供QRCodeWriter.CreateQrCodeWithLogo()作为专用工厂方法,接受用于URL和徽标的文件路径。 二维码样式定制指南涵盖徽标尺寸、位置和颜色组合选项。

QRCoder 方法:

using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;

var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

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", ImageFormat.Png);

IronBarcode方法:

using IronBarCode;

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
    .SaveAsPng("qr-logo.png");

CreateQrCodeWithLogo接受内容和徽标图像的文件路径字符串。 错误校正会自动设置为嵌入徽标所需的等级; 不需要明确的ECC配置。

有效载荷生成器.WiFi迁移

QRCoder的PayloadGenerator.WiFi格式化标准的WiFi QR有效负载字符串。 输出格式是QR码规范定义的公共标准(WIFI:T:{auth};S:{ssid};P:{password};;)。 迁移时,可以直接构建这些字符串。

QRCoder 方法:

using QRCoder;

var wifi = new PayloadGenerator.WiFi(
    ssid: "OfficeNetwork",
    password: "SecurePass123",
    authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));

IronBarcode方法:

using IronBarCode;

// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("wifi.png");

对于使用多种.ToString()输出生成的格式化字符串,然后直接或通过一个小的静态辅助方法构造该字符串。

二维码 API 到IronBarcode映射参考

二维码IronBarcode备注
new QRCodeGenerator()静态类——无实例BarcodeWriter不需要实例化
qrGenerator.CreateQrCode(data, ECCLevel.M)BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)直接替换
new PngByteQRCode(qrCodeData)不需要渲染是流畅链的一部分
byte[].ToPngBinaryData()通过.ResizeTo(w, h)调整大小
File.WriteAllBytes(path, bytes)模式.SaveAsPng(path)GeneratedBarcode上的终端方法
new SvgQRCode(qrCodeData).GetGraphic(10).SaveAsImage(path)传递.svg扩展以输出SVG
new QRCode(qrCodeData).GetGraphic(...)QRCodeWriter.CreateQrCode(data, size, level)用于徽标和颜色定制
QRCodeGenerator.ECCLevel.LQRCodeWriter.QrErrorCorrectionLevel.Low
QRCodeGenerator.ECCLevel.MQRCodeWriter.QrErrorCorrectionLevel.Medium未指定时的默认值
QRCodeGenerator.ECCLevel.QQRCodeWriter.QrErrorCorrectionLevel.High
QRCodeGenerator.ECCLevel.HQRCodeWriter.QrErrorCorrectionLevel.Highest需要用于嵌入徽标
PayloadGenerator.WiFi(...).ToString()"WIFI:T:WPA;S:{ssid};P:{pass};;"直接构造标准字符串
PayloadGenerator.ContactData(...).ToString()"BEGIN:VCARD\n..."vCard 是一种公共标准
无读取 APIBarcodeReader.Read(path)新功能——无需单独的库
仅限二维码格式通过BarcodeEncoding.*提供50多种格式新功能

常见迁移问题和解决方案

问题 1:有效载荷生成器字符串格式更改

QRCoder:PayloadGenerator.ContactData和其他助手自动生成格式化字符串。 代码将助手对象的CreateQrCode

**解决方案:**识别每个PayloadGenerator类型生成的字符串——其格式在QR码规范中有记录并且易于再现。 对于WiFi:WIFI:T:WPA;S:{ssid};P:{password};;。 对于vCard:标准的BEGIN:VCARD / END:VCARD块。 如果多个调用点使用相同的有效负载类型,请编写静态辅助方法:

public static string WifiPayload(string ssid, string password, string auth = "WPA")
    => $"WIFI:T:{auth};S:{ssid};P:{password};;";

问题 2:ECCLevel 枚举映射

QRCoder:H。 这是每次CreateQrCode调用的必需参数。

**解决方案:**使用QRCodeWriter.QrErrorCorrectionLevel等效项。 使用BarcodeWriter.CreateBarcode时,ECC级别会自动默认为Medium且不需要参数。 更新每个呼叫点:

// 二维码 ECCLevel.H →IronBarcodeQrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);

// 二维码 ECCLevel.M →IronBarcodedefault (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
C#

问题 3:渲染器类移除

**QRCoder:**每个输出格式都需要其渲染器类实例化—QRCode。 这些类接受GetGraphic,具有不同的返回类型。

**解决方案:**移除所有渲染器类实例。 IronBarcode将格式输出构建到 fluent 链的终端方法中。 在.ToPngBinaryData()。 将.svg扩展)。 QRCodeData中间对象也消失了——在IronBarcode中不需要它。

问题 4:移除 PngByteQRCode 和基于模块的尺寸调整

QRCoder:PngByteQRCode.GetGraphic(int pixelsPerModule)通过每个QR模块的像素数量来调整输出大小。 最终图像尺寸取决于模块数量,而模块数量又随内容长度和 ECC 级别而变化。

**解决方案:**用ResizeTo(int width, int height)替换基于模块的大小,以获得绝对的像素尺寸。 如果你的代码是根据模块数量动态计算预期输出大小的,请切换到满足输出要求的固定目标大小:

// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);

// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .ToPngBinaryData();

二维码 迁移清单

迁移前任务

在进行任何更改之前,请审核代码库中所有 二维码 的使用情况:

# Find all 二维码 namespace imports
grep -r "using QRCoder" --include="*.cs" .

# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .

# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .

# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .

# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
SHELL
  • 记录所有正在使用的PayloadGenerator类型并注意其字符串输出格式
  • 记录所有正在使用的ECC级别值及其调用位置
  • 找出所有与 二维码 配对用于解码的 ZXing .NET读取代码——这可以同时替换。
  • 获取IronBarcode许可证密钥(无需注册即可获得试用密钥)

代码更新任务

  1. 运行dotnet remove package QRCoder
  2. 如果它仅用于与QRCoder一起读取,则运行dotnet remove package ZXing.Net
  3. 运行dotnet add package IronBarcode
  4. IronBarCode.License.LicenseKey = "YOUR-KEY";添加到应用程序启动中
  5. 将所有using IronBarCode;
  6. 删除所有BarcodeWriter是静态的
  7. generator.CreateQrCode(data, ECCLevel.X)+渲染器链模式
  8. .ResizeTo(w, h)
  9. File.WriteAllBytes(path, bytes)保存模式
  10. .svg扩展)
  11. 用直接格式化字符串替换PayloadGenerator.WiFi(...)和其他助手实例化
  12. 将每个QRCodeWriter.QrErrorCorrectionLevel等效项
  13. 将任何ZXing.Net BarcodeReader.Read(path)
  14. 对于徽标嵌入,将QRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)

迁移后测试

  • 使用至少两个独立的二维码扫描应用程序扫描所有生成的二维码,以验证其可读性。
  • 验证嵌入徽标的QR码是否能正确扫描——确认错误校正级别为Highest
  • 将生成的代码的视觉输出与迁移前的示例进行比较,以确保外观一致性。
  • 测试所有PayloadGenerator替换项——确认WiFi、vCard和其他有效负载字符串能在目标设备上正确解码
  • 如果ZXing.Net也被移除,验证所有条形码读取路径通过BarcodeReader.Read功能正常
  • 在一个干净的环境中运行应用程序,以确认没有残留的 二维码 或 ZXing .NET引用导致绑定失败。
  • 验证IronBarcode许可证密钥是否已在生产环境和测试环境中正确加载

迁移到IronBarcode的主要优势

**用于所有条形码操作的单一API:**迁移后,每个条形码任务——生成、读取、PDF加盖——使用相同的IronBarCode命名空间和相同的入口点。 加入该项目的开发者只需学习一个 API 而不是三个。 条形码子系统内的代码审查变得一致。 文档查找是集中式的。

无需第二个库的条形码读取:BarcodeReader.Read处理图像文件、PDF页面、流和内存位图,支持自动格式检测。 以前需要 ZXing .NET才能实现的读取功能(以及其格式规范要求和线程安全考虑)现在只需一次方法调用即可立即使用。 从图像中读取条形码的指南涵盖多条形码检测、图像预处理和 PDF 页面扫描。

**无需新增依赖的格式扩展:**迁移后添加Code 128、EAN-13、DataMatrix、PDF417或任何其他支持的格式,只需不同的BarcodeEncoding参数值。 无需安装任何新软件包,无需学习任何新 API,也无需处理任何版本兼容性问题。 新的格式要求只需一行代码更改,而无需集成新的库。

**简化的QR码定制:**徽标嵌入、颜色变化和静区控制作为QRCodeWriter结果上的命名方法可用。 QRCoder对徽标嵌入所需的System.Drawing.Bitmap依赖项被简单的文件路径字符串替代。 二维码样式定制指南记录了所有可用的定制选项。

**内置 PDF 集成:**无需添加 PDF 库,即可从传入的 PDF 文档中读取条形码并将其添加到现有的 PDF 文件中。 以前需要单独依赖 PDF 的文档处理工作流程现在已将条形码和 PDF 功能整合在一起。

**减少长期维护开销:**从三四个独立包合并为一个包,消除了跟踪多个发布周期、解决库间版本冲突以及在.NET版本升级时更新多个测试套件所带来的累积开销。 条形码子系统的维护成本降低到仅依赖于单个软件包。

请注意: NetBarcode、QRCoder 和 ZXing.NET 是其各自所有者的注册商标。 本网站与 NetBarcode、QRCoder 或 ZXing.NET 无关,也未得到他们的认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。
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 天试用密钥
无需信用卡或创建账户