跳至页脚内容
视频

How to Set a Barcode Crop Region in C#

从NetBarcode迁移到 IronBarcode

本指南涵盖了从NetBarcode到IronBarcode的完整迁移路径,包括软件包删除步骤、命名空间更新、API 转换示例以及在迁移开始之前查找每个调用点的检查清单。 本指南涉及一种常见场景,即项目起始于使用NetBarcode进行1D条形码生成,后来需要2D格式、读取能力或澄清 SixLabors.ImageSharp 许可义务,这些都超出了NetBarcode的范围。

为什么要从NetBarcode迁移?

格式限制:NetBarcode 的 Type 枚举定义了确切的 11 种条形码格式,全部为线性。 没有 QR 码、DataMatrix、PDF417 或 Aztec 的条目。 当一个项目增加了二维码要求——例如用于非接触式配送链接、移动深度链接或药品数据矩阵要求——NetBarcode 就无法满足了。 根据该库的设计,唯一的办法就是停止使用该库来处理这种格式,并引入一个单独的软件包。 超出该11项枚举的每个额外格式需求都会为依赖树添加另一个库。

没有读取 API:NetBarcode生成条形码图像,但没有提供解码方法。 需要扫描退货标签、从供应商发票中提取条形码值或验证打印的条形码是否与其源数据匹配的项目必须添加单独的读取库。 ZXing .NET是最常见的选择,它在已经包含NetBarcode和(通常)QR 专用库的代码库中引入了第三个 API 接口。

ImageSharp 商业许可证: NetBarcode依赖于 SixLabors.ImageSharp,它使用分割商业许可证。 免费套餐适用于开源项目和年收入低于规定门槛的公司; 超过该门槛需要商业许可证。 此条件嵌入在传递依赖链中, NuGet在安装过程中不会将其暴露出来。 零售或物流公司如果大规模处理条形码(这正是NetBarcode的目标用例),可能在未评估自身义务的情况下就已经超过了阈值。

多库累积:当需要 QR 码时使用 QRCoder,当需要读取时使用 ZXing .NET的项目,会累积三个独立的条形码相关依赖项。 它们各自有自己的发布计划、对 ImageSharp 版本的要求以及需要维护的 API。 将涵盖生成、读取、一维和二维的单一库合并,消除了跨库版本管理问题。

基本问题

一个项目如果一开始只使用 NetBarcode,后来发展到需要 2D 格式,最终就会出现这种拆分导入的情况:

//NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
//NetBarcodefor 1D — one library, one API
using NetBarcode;
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QRCoder added separately for QR — second library, second API
using QRCoder;
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var png = new PngByteQRCode(qrData).GetGraphic(20);
File.WriteAllBytes("qr.png", png);
Imports NetBarcode
Imports QRCoder
Imports System.IO

'NetBarcode for 1D — one library, one API
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")

' QRCoder added separately for QR — second library, second API
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim png = New PngByteQRCode(qrData).GetGraphic(20)
File.WriteAllBytes("qr.png", png)
$vbLabelText   $csharpLabel

迁移到IronBarcode后,只需一次导入即可生成相同的两个输出:

using IronBarCode;

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

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");
using IronBarCode;

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

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

IronBarcode与 NetBarcode:功能对比

特征 NetBarcode IronBarcode
一维条形码生成
二维条码生成(QR码、DataMatrix码、PDF417码、Aztec码)
从图像中读取条形码
从 PDF 文档中读取条形码
一维格式计数 11 30+
二维格式计数 0 8岁以上
总符号学 11 50岁以上
GS1-128,GS1 数据条
邮政格式
SVG 输出
批量处理 手册 内置
ImageSharp依赖性 是的(分裂许可证)
商业支持 社区 专业
许可模式 MIT(+ ImageSharp 条件) 商业翻译

快速入门:NetBarcode 到IronBarcode 的迁移

步骤 1:替换 NuGet 软件包

移除NetBarcode及其对 ImageSharp 的传递依赖:

dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
dotnet remove package NetBarcode
dotnet remove package SixLabors.ImageSharp
SHELL

请注意,如果项目中的其他包也传递性地引用 SixLabors.ImageSharp ,则它可能会重新出现在已恢复的包列表中。 移除后,运行 dotnet list package --include-transitive 以确认 ImageSharp 是否仍然存在,及其商业许可证条件是否仍适用于项目。

步骤 2:添加IronBarcode

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

NuGet 包名称是 IronBarcode; 代码中使用的命名空间是 IronBarCode(注意大写C)。

步骤 3:更新命名空间并初始化许可证

替换所有包含NetBarcode调用的文件中的旧 using 指令:

// 消除 these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;

// Add this:
using IronBarCode;
// 消除 these:
// using NetBarcode;
// using SixLabors.ImageSharp;
// using SixLabors.ImageSharp.PixelFormats;
// using SixLabors.Fonts;

// Add this:
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

在应用程序启动时添加许可证初始化一次——在 Startup.cs 或项目的入口点:

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

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

提供免费试用密钥供评估; 购买许可证后,生成的条形码图像中将不再带有试用水印。

代码迁移示例

Code128生成

最常见的NetBarcode使用模式可以直接转换为IronBarcode ,只需将构造函数更改为静态方法并重命名方法即可。

NetBarcode 方法:

using NetBarcode;

var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
using NetBarcode;

var barcode = new Barcode("12345678901234", Type.Code128);
barcode.SaveImageFile("shipping-label.png");
Imports NetBarcode

Dim barcode As New Barcode("12345678901234", Type.Code128)
barcode.SaveImageFile("shipping-label.png")
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("12345678901234", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping-label.png")
$vbLabelText   $csharpLabel

new Barcode(data, Type.X) 构造函数变为 BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X)SaveImageFile() 方法变为 SaveAsJpeg()SaveAsWindowsBitmap(),根据所需的输出格式。 IronBarcode操作指南中记录了所有可用的1D 条形码生成选项。

EAN-13

零售产品条形码类型通过常量重命名和方法重命名在库之间直接映射。

NetBarcode 方法:

using NetBarcode;

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
using NetBarcode;

var ean13 = new Barcode("5901234123457", Type.EAN13);
ean13.SaveImageFile("product-ean.png");
Imports NetBarcode

Dim ean13 As New Barcode("5901234123457", Type.EAN13)
ean13.SaveImageFile("product-ean.png")
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-ean.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13)
    .SaveAsPng("product-ean.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("5901234123457", BarcodeEncoding.EAN13) _
    .SaveAsPng("product-ean.png")
$vbLabelText   $csharpLabel

编码常量名称与NetBarcodeType 枚举成员名称相匹配,其中有直接等价的。注意 UPC-A (Type.UPCA)、UPC-E (Type.UPCE)、ITF (Type.ITF) 和 MSI (Type.MSI) 不属于NetBarcodeType 枚举——如果需要这些格式,IronBarcode 原生支持它们通过 BarcodeEncoding.ITFBarcodeEncoding.MSI

GetImage() 转换为 ToPngBinaryData()

NetBarcode 的 GetImage() 方法返回 SixLabors.ImageSharp.Image<Rgba32>,这需要在调用代码中显式导入 ImageSharp,并将下游逻辑绑定到 ImageSharp API。IronBarcode直接在 GeneratedBarcode 对象上暴露二进制和流输出方法,完全消除调用代码对 ImageSharp 的依赖。

NetBarcode 方法:

using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();

using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
using NetBarcode;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var barcode = new Barcode("12345", Type.Code128);
Image<Rgba32> image = barcode.GetImage();

using var stream = new MemoryStream();
image.SaveAsPng(stream);
byte[] bytes = stream.ToArray();
Imports NetBarcode
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats
Imports System.IO

Dim barcode As New Barcode("12345", Type.Code128)
Dim image As Image(Of Rgba32) = barcode.GetImage()

Using stream As New MemoryStream()
    image.SaveAsPng(stream)
    Dim bytes As Byte() = stream.ToArray()
End Using
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);

// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();

// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128);

// Retrieve bytes directly — no ImageSharp type in calling code
byte[] bytes = barcode.ToPngBinaryData();

// Or write to a stream directly
using var stream = new MemoryStream();
barcode.SaveAsPng(stream);
Imports IronBarCode

Dim barcode = BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)

' Retrieve bytes directly — no ImageSharp type in calling code
Dim bytes As Byte() = barcode.ToPngBinaryData()

' Or write to a stream directly
Using stream As New MemoryStream()
    barcode.SaveAsPng(stream)
End Using
$vbLabelText   $csharpLabel

Image<Rgba32> 结果进行进一步 ImageSharp 操作的代码——调整大小、合成、格式转换——将需要逐一评估这些操作,因为IronBarcode不会暴露 ImageSharp 对象。

同时替换NetBarcode和 QRCoder

同时运行NetBarcode和 QRCoder 的项目可以同时替换两者。IronBarcode的二维生成使用与一维生成相同的 BarcodeWriter.CreateBarcode 方法; 唯一不同的是 BarcodeEncoding 常量。 有关编码选项和配置,请参阅二维条形码生成指南。

NetBarcode 和 QRCoder 方法:

using NetBarcode;
using QRCoder;

// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
using NetBarcode;
using QRCoder;

// 1D with NetBarcode
var code128 = new Barcode("12345", Type.Code128);
code128.SaveImageFile("label.png");

// QR with QRCoder
var qrGenerator = new QRCodeGenerator();
var qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20));
Imports NetBarcode
Imports QRCoder

' 1D with NetBarcode
Dim code128 As New Barcode("12345", Type.Code128)
code128.SaveImageFile("label.png")

' QR with QRCoder
Dim qrGenerator As New QRCodeGenerator()
Dim qrData = qrGenerator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M)
Dim qrCode As New PngByteQRCode(qrData)
File.WriteAllBytes("qr.png", qrCode.GetGraphic(20))
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");
using IronBarCode;

// 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix)
    .SaveAsPng("pharma-label.png");
Imports IronBarCode

' 1D — same API as 2D
BarcodeWriter.CreateBarcode("12345", BarcodeEncoding.Code128) _
    .SaveAsPng("label.png")

' QR — change the encoding constant, nothing else
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode) _
    .SaveAsPng("qr.png")

' Additional 2D formats available with no further imports
BarcodeWriter.CreateBarcode("01034531200000111719112510ABCD1234", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("pharma-label.png")
$vbLabelText   $csharpLabel

增加阅读功能

如果该项目还使用了 ZXing .NET进行读取,则可以与NetBarcode一起删除该依赖项。IronBarcode的 BarcodeReader 处理具有自动格式检测的图像和 PDF 文档。

ZXing .NET方法:

using ZXing;
using ZXing.Common;
using ZXing.Rendering;

var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };

// Bitmap loading and format-specific handling required before decode call
using ZXing;
using ZXing.Common;
using ZXing.Rendering;

var reader = new BarcodeReaderGeneric();
reader.Options = new DecodingOptions { TryHarder = true };

// Bitmap loading and format-specific handling required before decode call
Imports ZXing
Imports ZXing.Common
Imports ZXing.Rendering

Dim reader = New BarcodeReaderGeneric()
reader.Options = New DecodingOptions With {.TryHarder = True}

' Bitmap loading and format-specific handling required before decode call
$vbLabelText   $csharpLabel

IronBarcode方法:

using IronBarCode;

// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.Format}: {r.Value}");
}

// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
using IronBarCode;

// Read from an image file — automatic format detection
var imageResults = BarcodeReader.Read("shipping-label.png");
foreach (var r in imageResults)
{
    Console.WriteLine($"{r.Format}: {r.Value}");
}

// Read from a PDF document — no separate PDF library needed
var pdfResults = BarcodeReader.Read("supplier-invoice.pdf");
foreach (var r in pdfResults)
{
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}");
}
Imports IronBarCode

' Read from an image file — automatic format detection
Dim imageResults = BarcodeReader.Read("shipping-label.png")
For Each r In imageResults
    Console.WriteLine($"{r.Format}: {r.Value}")
Next

' Read from a PDF document — no separate PDF library needed
Dim pdfResults = BarcodeReader.Read("supplier-invoice.pdf")
For Each r In pdfResults
    Console.WriteLine($"Page {r.PageNumber}: {r.Format}: {r.Value}")
Next
$vbLabelText   $csharpLabel

有关读取选项的完整文档可在"从图像读取条形码"指南中找到,其中涵盖速度调整、多条形码检测和图像校正设置。

NetBarcodeAPI 到IronBarcode映射参考

NetBarcode IronBarcode 备注
new Barcode(data, Type.Code128) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) 构造函数 → 静态方法
new Barcode(data, Type.EAN13) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN13) 直接映射
new Barcode(data, Type.Code39) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code39) 直接映射
new Barcode(data, Type.EAN8) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.EAN8) 直接映射
new Barcode(data, Type.Codabar) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Codabar) 直接映射
new Barcode(data, Type.Code93) BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code93) 直接映射
barcode.SaveImageFile("x.png") .SaveAsPng("x.png") 方法重命名
barcode.SaveImageFile("x.jpg") .SaveAsJpeg("x.jpg") 方法重命名
barcode.GetImage()Image<Rgba32> .ToPngBinaryData().SaveAsPng() 没有 ImageSharp 类型暴露
Type.QRCode BarcodeEncoding.QRCode 新功能
Type.DataMatrix BarcodeEncoding.DataMatrix 新功能
Type.PDF417 BarcodeEncoding.PDF417 新功能
Type.Aztec BarcodeEncoding.Aztec 新功能
无读取 API BarcodeReader.Read(path) 新功能
using NetBarcode; using IronBarCode; 命名空间替换
using SixLabors.ImageSharp; 消除 不再需要
using SixLabors.ImageSharp.PixelFormats; 消除 不再需要
using SixLabors.Fonts; 消除 不再需要

编码常量的完整列表请参阅支持的条形码格式参考文档。

常见迁移问题和解决方案

问题 1:移除软件包后,ImageSharp 的传递依赖仍然存在

问题:运行 dotnet remove package NetBarcode 后,dotnet restore 显示依赖树中仍存在 SixLabors.ImageSharp,因为项目中的另一个包也引用了它。

解决方案:运行 dotnet list package --include-transitive 以识别哪个包仍在将 ImageSharp 拉入。如果仅是 NetBarcode,移除显式包引用并恢复应清除它。 如果另一个软件包负责,该软件包的ImageSharp依赖关系及其商业许可证条件将在范围内独立于NetBarcode移除。

dotnet list package --include-transitive | grep -i imagesharp
dotnet list package --include-transitive | grep -i imagesharp
SHELL

第二期:图像移除后无法解析类型

问题:移除 SixLabors.ImageSharp 包后,任何声明为 Image<Rgba32> 的变量或参数类型为 SixLabors.ImageSharp.Image<Rgba32> 的都会产生编译错误,因为类型不再可用。

解决方案:将每个用法替换为相应的IronBarcode输出方法。 如果变量用于获取字节码,请替换为 .ToPngBinaryData()。 如果写入到流中,替换为 .SaveAsPng(stream)。 如果保存到文件,替换为 .SaveAsPng(path)

// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);

// After — no external image type required
barcode.SaveAsPng(stream);
// Before — requires SixLabors.ImageSharp reference
Image<Rgba32> img = barcode.GetImage();
img.SaveAsPng(stream);

// After — no external image type required
barcode.SaveAsPng(stream);
' Before — requires SixLabors.ImageSharp reference
Dim img As Image(Of Rgba32) = barcode.GetImage()
img.SaveAsPng(stream)

' After — no external image type required
barcode.SaveAsPng(stream)
$vbLabelText   $csharpLabel

问题 3:v1.8 版本重大变更背景

问题:在 v1.8 之前针对NetBarcode编写的代码库可能有 GetImage() 调用,存储结果而没有显式类型,依赖于 v1.8 之前的内部返回类型。 即使没有IronBarcode迁移,NetBarcode 更新后这些调用也可能已经失效。

解决方案:利用IronBarcode迁移的机会同时解决任何 v1.8 之前已经存在的崩坏。应该通过项目范围的搜索定位所有 GetImage() 调用站点,并在迁移过程中替换为适当的IronBarcode输出方法。 下面迁移清单中的 grep 命令用于识别这些位置。

NetBarcode迁移清单

迁移前

在进行任何更改之前,请先审核所有NetBarcode使用情况:

grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
grep -r "using NetBarcode" ./src
grep -r "new Barcode(" ./src
grep -r "Type\.Code128\|Type\.EAN13\|Type\.Code39\|Type\.EAN8" ./src
grep -r "Type\.Codabar\|Type\.Code93" ./src
grep -r "SaveImageFile(" ./src
grep -r "GetImage(" ./src
grep -r "using SixLabors\.ImageSharp" ./src
grep -r "Image<Rgba32>" ./src
SHELL
  • 找出所有需要更改 using 指令的文件
  • 注意所有 GetImage() 调用站点及下游使用的 Image<Rgba32> 对象
  • 检查 QRCoder 或 ZXing .NET是否存在,并可在同一步骤中将其移除。
  • 运行 dotnet list package --include-transitive 记录当前 ImageSharp 依赖状态,然后再删除
  • 获取IronBarcode许可证密钥(无需购买即可获得免费试用密钥)

代码更新

  1. 运行 dotnet remove package NetBarcode
  2. 如果未被其他包使用,运行 dotnet remove package SixLabors.ImageSharp
  3. 运行 dotnet add package IronBarcode
  4. 在应用程序启动时添加 IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
  5. 在每个受影响的文件中用 using IronBarCode; 替换 using NetBarcode;
  6. 从所有文件中移除 using SixLabors.ImageSharp.PixelFormats;using SixLabors.Fonts;
  7. 使用 API 映射表将每个 new Barcode(data, Type.X) 调用转换为 BarcodeWriter.CreateBarcode(data, BarcodeEncoding.X)
  8. SaveAsPng() 或适当的格式特定方法替换 SaveImageFile()
  9. 根据需要将 GetImage() 调用替换为 SaveAsPng()SaveAsPng(stream)
  10. 如果移除 QRCoder: 用 BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode) 替换 QRCodeGenerator + PngByteQRCode
  11. 如果移除 ZXing.Net: 用 BarcodeReader.Read(path) 替换阅读器设置

迁移后测试

  • 构建项目并确认无编译错误
  • 对生成的条形码输出运行现有的单元测试
  • 通过目视检查条形码图像,确保其符号正确且内容清晰可读。
  • 如果在迁移过程中添加了二维码格式,请验证二维码输出。
  • 测试条形码扫描功能的读取功能(如果已添加条形码扫描功能)。
  • 运行 dotnet list package --include-transitive 以确认如果已删除,ImageSharp 不再存在
  • 验证许可证密钥初始化是否在首次条形码操作之前运行

迁移到IronBarcode的主要优势

统一格式覆盖:迁移后,QR 代码、DataMatrix、PDF417、Aztec 和其他所有二维格式均可通过用于 Code128 和 EAN-13 的相同 API 调用获得。当格式要求扩展时,无需第二个库,只需更改格式类型之间的 BarcodeEncoding 常量。

内置读取:BarcodeReader.Read() 处理具有自动格式检测的图像文件和 PDF 文档。 以前需要 ZXing .NET进行读取的项目可以消除这种依赖性,并整合到一个条形码库中,从而减少项目中的开发人员必须学习的 API 范围。

IronBarcode不依赖 SixLabors.ImageSharp,也不依赖于 ImageSharp 。 迁移后,NetBarcode传递依赖中嵌入的分裂商业许可证条件不再适用于项目。 许可证合规审查变得更加简单,因为条形码库的义务直接陈述,并不依赖于第三方图像处理库的收入门槛。

稳定的公共 API: IronBarcode不会在其公共 API 接口中公开第三方类型。 从 BarcodeWriter.CreateBarcodeGeneratedBarcode 返回类型是IronBarcode自己的类型,这意味着IronBarcode内部渲染的未来更新不会像NetBarcode在 v1.8 中的 GetImage() 类型更改那样导致调用代码中的重大变更。

维护单一依赖项:用IronBarcode替换 NetBarcode、QRCoder 和 ZXing .NET,可将三个升级周期、三套发行说明和三个潜在的版本冲突减少到一个。 随着.NET版本的更新和依赖项更新的必要性,维护工作量会随着单个库的减少而增加,而不是像以前那样需要三个库。

请注意NetBarcode、QRCoder 和 ZXing.NET 是其各自所有者的注册商标。 本网站与 NetBarcode、QRCoder 或 ZXing.NET 无关,也未得到他们的认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。

常见问题解答

我为什么要从NetBarcode迁移到IronBarcode?

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

如何用 IronBarcode 替换 NetBarcode API 调用?

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

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

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

迁移过程中是否需要同时安装 NetBarcode 和 IronBarcode?

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

IronBarcode 的 NuGet 包名称是什么?

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

与 NetBarcode 相比,IronBarcode 如何简化 Docker 部署?

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

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

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

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

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

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

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

从 NetBarcode 迁移到 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 小时在线。
聊天
电子邮件
打电话给我