跳至页脚内容
视频

How to Use Async and Multithread in Barcodes Using C#

从 二维码 迁移到 IronBarcode

本指南是为那些项目最初使用 二维码 开发,但后来发展到需要 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
// 二维码 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
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M)
Dim qrCode As 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
$vbLabelText   $csharpLabel

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");
//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");
Imports 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
Dim results = BarcodeReader.Read("incoming.png")
$vbLabelText   $csharpLabel

IronBarcode与 QRCoder:功能对比

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

快速入门:QRCoder 到IronBarcode 的迁移

步骤 1:替换 NuGet 软件包

从项目中移除 QRCoder:

dotnet remove package QRCoder
dotnet remove package QRCoder
SHELL

安装IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

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

dotnet remove package ZXing.Net
dotnet remove package ZXing.Net
SHELL

步骤 2:更新命名空间

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

// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;
// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;
' Before (QRCoder)
Imports QRCoder

' After (IronBarcode)
Imports IronBarCode
$vbLabelText   $csharpLabel

步骤 3:初始化许可证

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

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

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

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

代码迁移示例

基本二维码生成

最常见的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
    }
}
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
    }
}
Imports QRCoder

Public Class BarcodeService
    Private ReadOnly _generator As New QRCodeGenerator()

    Public Function GenerateQR(content As String) As Byte()
        Dim qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M)
        Dim qrCode = New PngByteQRCode(qrCodeData)
        Return qrCode.GetGraphic(10) ' 10px per module
    End Function
End Class
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

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

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

Public Class BarcodeService
    Public Function GenerateQR(content As String) As Byte()
        Return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode) _
            .ResizeTo(200, 200) _
            .ToPngBinaryData()
    End Function
End Class
$vbLabelText   $csharpLabel

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);
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);
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim pngBytes = New PngByteQRCode(qrCodeData).GetGraphic(10)
File.WriteAllBytes("output.png", pngBytes)
$vbLabelText   $csharpLabel

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();
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();
Imports 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
Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

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);
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);
Imports QRCoder
Imports System.IO

Dim generator As New QRCodeGenerator()
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim svgContent As String = New SvgQRCode(qrCodeData).GetGraphic(10)
File.WriteAllText("output.svg", svgContent)
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

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

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

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsImage("output.svg")
$vbLabelText   $csharpLabel

.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);
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);
Imports QRCoder

Dim generator As New QRCodeGenerator()

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

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

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");
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");
Imports IronBarCode

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

' Explicit level via QRCodeWriter
Dim qr = QRCodeWriter.CreateQrCode( _
    "https://example.com", _
    500, _
    QRCodeWriter.QrErrorCorrectionLevel.Highest _
)
qr.SaveAsPng("high-ecc.png")
$vbLabelText   $csharpLabel

电平映射为: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);
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);
Imports QRCoder
Imports System.Drawing
Imports System.Drawing.Imaging

Dim generator As New QRCodeGenerator()
' ECCLevel.H is required — the logo occludes part of the code
Dim qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H)

Dim qrCode As New QRCode(qrCodeData)
Dim logoBitmap As New Bitmap("logo.png")
Dim qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap)
qrBitmap.Save("qr-logo.png", ImageFormat.Png)
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

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

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

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500) _
    .SaveAsPng("qr-logo.png")
$vbLabelText   $csharpLabel

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));
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));
Imports QRCoder

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

Dim generator = New QRCodeGenerator()
Dim qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M)
Dim qrCode = New PngByteQRCode(qrData)
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10))
$vbLabelText   $csharpLabel

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");
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");
Imports IronBarCode

' Construct the standard WiFi QR string directly
Dim wifiPayload As String = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;"
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode) _
    .ResizeTo(300, 300) _
    .SaveAsPng("wifi.png")
$vbLabelText   $csharpLabel

对于使用多种.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.L QRCodeWriter.QrErrorCorrectionLevel.Low
QRCodeGenerator.ECCLevel.M QRCodeWriter.QrErrorCorrectionLevel.Medium 未指定时的默认值
QRCodeGenerator.ECCLevel.Q QRCodeWriter.QrErrorCorrectionLevel.High
QRCodeGenerator.ECCLevel.H QRCodeWriter.QrErrorCorrectionLevel.Highest 需要用于嵌入徽标
PayloadGenerator.WiFi(...).ToString() "WIFI:T:WPA;S:{ssid};P:{pass};;" 直接构造标准字符串
PayloadGenerator.ContactData(...).ToString() "BEGIN:VCARD\n..." vCard 是一种公共标准
无读取 API BarcodeReader.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};;";
public static string WifiPayload(string ssid, string password, string auth = "WPA")
    => $"WIFI:T:{auth};S:{ssid};P:{password};;";
Public Shared Function WifiPayload(ssid As String, password As String, Optional auth As String = "WPA") As String
    Return $"WIFI:T:{auth};S:{ssid};P:{password};;"
End Function
$vbLabelText   $csharpLabel

问题 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);
// 二维码 ECCLevel.H →IronBarcodeQrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);

// 二维码 ECCLevel.M →IronBarcodedefault (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
' 二维码 ECCLevel.H →IronBarcodeQrErrorCorrectionLevel.Highest
Dim qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest)

' 二维码 ECCLevel.M →IronBarcodedefault (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
$vbLabelText   $csharpLabel

问题 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();
// 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();
Imports System

' Before: GetGraphic(20) — output size varies with content
Dim bytes = New PngByteQRCode(qrData).GetGraphic(20)

' After: fixed 400×400 regardless of content
Dim bytes As Byte() = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) _
    .ResizeTo(400, 400) _
    .ToPngBinaryData()
$vbLabelText   $csharpLabel

二维码 迁移清单

迁移前任务

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

# 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" .
# 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 无关,也未得到他们的认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

常见问题解答

我为什么要从 QRCoder.NET 迁移到 IronBarcode?

常见原因包括简化许可(消除 SDK + 运行时密钥的复杂性)、消除吞吐量限制、获得原生 PDF 支持、改进 Docker/CI/CD 部署以及减少生产代码中的 API 样板代码。

如何用 IronBarcode 替换 QRCoder API 调用?

用 `IronBarCode.License.LicenseKey = "key"` 替换实例创建和许可相关的样板代码。用 `BarcodeReader.Read(path)` 替换读取器调用,用 `BarcodeWriter.CreateBarcode(data, encoding)` 替换写入器调用。静态方法无需实例管理。

从 QRCoder.NET 迁移到 IronBarcode 时,代码需要做多少更改?

大多数迁移都能减少代码行数。许可样板代码、实例构造函数和显式格式配置都被移除。核心读/写操作映射到更简洁的 IronBarcode 等效代码,并生成更清晰的结果对象。

迁移过程中是否需要同时保留 QRCoder.NET 和 IronBarcode?

不。大多数迁移都是直接替换,而不是并行操作。一次迁移一个服务类,替换 NuGet 引用,并更新实例化和 API 调用模式,然后再迁移下一个类。

IronBarcode 的 NuGet 包名称是什么?

该软件包名为“IronBarCode”(B 和 C 大写)。使用“Install-Package IronBarCode”或“dotnet add package IronBarCode”进行安装。代码中的 using 指令为“using IronBarCode;”。

与 QRCoder.NET 相比,IronBarcode 如何简化 Docker 部署?

IronBarcode 是一个 NuGet 包,不包含任何外部 SDK 文件或已挂载的许可证配置。在 Docker 环境中,设置 IRONBARCODE_LICENSE_KEY 环境变量后,该包会在启动时自动处理许可证验证。

从 QRCoder 迁移后,IronBarcode 是否能自动检测所有条形码格式?

是的。IronBarcode 可以自动检测所有支持格式的条码符号,无需显式枚举 BarcodeTypes。如果已知条码格式且性能至关重要,BarcodeReaderOptions 允许缩小搜索范围以进行优化。

IronBarcode 能否在不使用单独库的情况下读取 PDF 中的条形码?

是的。`BarcodeReader.Read("document.pdf")` 可以直接处理 PDF 文件。结果包括每个条形码的页码、格式、值和置信度。无需外部 PDF 渲染步骤。

IronBarcode如何处理并行条码处理?

IronBarcode 的静态方法是无状态且线程安全的。可以直接对文件列表使用 Parallel.ForEach,无需进行线程级实例管理。BarcodeReaderOptions.MaxParallelThreads 控制内部线程预算。

从 QRCoder.NET 迁移到 IronBarcode 时,结果属性会发生哪些变化?

常见重命名:BarcodeValue 变为 Value,BarcodeType 变为 Format。IronBarcode 结果还会添加 Confidence 和 PageNumber。解决方案范围内的查找替换功能会处理现有结果处理代码中的重命名。

如何在 CI/CD 流水线中设置 IronBarcode 许可?

将 IRONBARCODE_LICENSE_KEY 存储为管道密钥,并在应用程序启动代码中赋值 IronBarCode.License.LicenseKey。一个密钥即可覆盖所有环境,包括开发、测试、预发布和生产环境。

IronBarcode是否支持生成自定义样式的二维码?

是的。QRCodeWriter.CreateQrCode() 支持通过 ChangeBarCodeColor() 自定义颜色、通过 AddBrandLogo() 嵌入徽标、可配置纠错级别以及多种输出格式,包括 PNG、JPG、PDF 和流媒体。

Curtis Chau
技术作家

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

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我