How to Read Barcodes From Streams in C#
从barKoder SDK迁移到IronBarcode
Barkoder提供官方.NET包 —— Plugin.Maui.Barkoder 和 Barkoder.Xamarin —— 但两者都是严格的移动摄像头扫描组件。 如果您评估了barKoder的MatrixSight算法、去模糊模式、多条码检测或DPM支持,然后发现需要文件输入、PDF处理、服务器端部署或条码生成,那么barKoder在.NET上都不提供这些。 本指南展示了IronBarcode如何覆盖每个需求,并针对每个场景提供工作代码。
为什么从barKoder SDK迁移
从barKoder评估转移到IronBarcode的团队普遍报告了相同的触发因素:
仅限移动摄像头界面: Barkoder的.NET影响范围是Barkoder.Xamarin(v1.3.0)。 两者都封装了iOS / Android SDK并提供一个BarkoderView摄像头控制。 没有通用Barkoder.NET库,没有ASP.NET Core目标,没有控制台 / 工作器 / 桌面目标,也没有Linux服务器目标。
只读架构: Barkoder 是一个只读 SDK。 如果你的应用需要生成条形码——打印运输标签、创建包装二维码、将条形码嵌入文档——Barkoder 无法提供任何功能。 在项目进行过程中发现生成需求的团队需要一个能够涵盖工作流程两端的库。
无需 PDF 处理:在.NETEnterprise应用程序中,条形码经常出现在 PDF 文档中——发票、装运清单、医疗记录、合规文件。 Barkoder 对这种工作流程毫无概念。 它专为移动设备上的实时摄像头输入而设计,无法处理 PDF 文件。
无需服务器端部署: Barkoder 的处理模型是设备端移动扫描。 它无法在ASP.NET Core、Azure Functions、Docker 容器或 AWS Lambda 中运行。 构建服务器端条形码 API、文档处理管道或云功能的团队无法部署 Barkoder。
无文件 / 流输入:即使在MAUI应用中,BarkoderView也只能处理实时摄像头画面。 没有文件路径、字节数组或Stream重载,因此处理上传的图像或图库照片需要不同的库。
基本界限
Barkoder的MAUI界面是基于摄像头的。 使用Plugin.Maui.Barkoder的.NET开发者编写的代码如下所示:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.SetFlashEnabled(False)
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
End Class
IronBarcode为相同数据提供文件/流/PDF API:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("scanned-label.png", options)
For Each result In results
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}")
Next
IronBarcodevs barKoder SDK: 功能对比
| 特征 | barKoder SDK | IronBarcode |
|---|---|---|
| .NET / C# API | MAUI / Xamarin 摄像头 UI 仅 | 完整的.NET界面 |
| NuGet软件包 | Plugin.Maui.Barkoder, Barkoder.Xamarin |
BarCode |
| 条形码损坏恢复 | MatrixSight / DeBlur | ReadingSpeed.ExtremeDetail + ML |
| 多条形码检测 | 是 | ExpectMultipleBarcodes = true |
| DataMatrix / DPM | 是的(只读) | 是的——读取并生成 |
| 二维码 | 是的(只读) | 是的——读取并生成 |
| PDF417 | 是 | 是 |
| 阿兹特克 | 是 | 是 |
| Code128、Code39、EAN | 是 | 是的——超过50种格式 |
| 条形码生成 | None | 完整版 — 所有格式 |
| PDF处理 | None | 本地 |
| 文件 / 流 / byte[] 输入 | 无——仅摄像头帧 | 是 |
| ASP.NET Core。 | None | 满的 |
| Docker / Linux | None | 满的 |
| Azure Functions | None | 满的 |
| AWS-Lambda(AWS Lambda | None | 满的 |
| 离线/物理隔离 | 设备端 | 完全本地化 |
| Async/Await | 基于回调 | 满的 |
| 依赖注入 | None | 完整的.NET DI |
| iOS 通过 MAUI | Plugin.Maui.Barkoder(摄像头界面) |
程序化(文件/流) |
| Android 通过 MAUI | Plugin.Maui.Barkoder(摄像头界面) |
程序化(文件/流) |
| 定价 | 年度订购 | 749 美元起永久 |
快速开始:从barKoder SDK迁移到IronBarcode
步骤 1:替换 NuGet 软件包
安装IronBarcode:
dotnet add package BarCode
如果您的项目使用Barkoder.Xamarin仅用于非摄像头工作流程(或您完全转向文件 / PDF处理),请移除它:
dotnet remove package Plugin.Maui.Barkoder
dotnet remove package Plugin.Maui.Barkoder
如果应用仍需要实时摄像头界面,请保留Plugin.Maui.Barkoder并附加IronBarcode用于文件 / PDF / 生成工作。
步骤 2:更新命名空间
移除barKoder命名空间(如果不再需要),并添加IronBarcode命名空间:
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
Imports IronBarCode
步骤 3:初始化许可证
在应用启动时添加许可证初始化——在ASP.NET Core中的Program.cs,或在控制台或桌面应用中在任何条码操作之前:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
代码迁移示例
从图像中读取条形码
核心读场景从barKoder的实时摄像头帧映射到IronBarcode的文件/流/byte[] API。
barKoder MAUI方法:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"Barcode: {r.TextualData}")
Console.WriteLine($"Type: {r.BarcodeTypeName}")
Next
End Sub
End Class
IronBarcode方法:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("scan.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
Next
IronBarcode的BarcodeReader.Read()自动检测条码格式,无需预先指定格式。 对于移动设备拍摄并上传到服务器的图像、从文件系统加载的图像,或者从流中接收的字节数组形式的图像,同样的调用也适用。 有关完整的阅读文档,请参阅IronBarcode阅读指南。
损坏条形码恢复(等效于去模糊模式)
Barkoder 的 DeBlur 模式是其最常被提及的功能之一。 IronBarcode通过ReadingSpeed.ExtremeDetail为文件输入提供等效功能。
barKoder MAUI方法:
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
Imports Barkoder.Maui
' Live camera scanning with DeBlur enabled via configuration
BarkoderView.SetEnabledBarcodeTypes() ' configure formats
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Recovered: {r.TextualData}")
Next
End Sub
IronBarcode方法:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("worn-shipping-label.png", options)
If results.Any() Then
Console.WriteLine($"Recovered barcode: {results.First().Value}")
Else
Console.WriteLine("Could not decode — image quality too low")
End If
ReadingSpeed.ExtremeDetail运行一个基于ML的多遍图像分析管道,在尝试解码之前应用对比度增强、锐化、旋转校正和损坏恢复。 对于批量工作流程,使用ExtremeDetail。
多条形码检测
Barkoder的多条码帧扫描映射到IronBarcode的ExpectMultipleBarcodes选项,适用于图像和PDF。
barKoder MAUI方法:
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
Imports Barkoder.Maui
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
IronBarcode方法:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
' Works identically on images and PDFs
Dim results = BarcodeReader.Read("shipping-manifest.pdf", options)
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}")
Next
这是一个单独的方法调用。 无需页面提取,无需多次请求,无需按条形码处理开销。 PDF文件可直接读取。
DataMatrix 生成和读取
Barkoder 可以读取 DataMatrix 数据,但无法生成 DataMatrix 数据。 IronBarcode涵盖了工作流程的两端,这是工业跟踪系统的常见要求。
barKoder MAUI方法:
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
Imports Barkoder.Maui
' Camera-only DataMatrix scanning; no generation available
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Part ID: {r.TextualData}")
Next
End Sub
IronBarcode方法:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix) _
.SaveAsPng("part-label.png")
' Read DataMatrix from a scanned industrial part image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("etched-part-photo.png", options)
For Each result In results
Console.WriteLine($"Part Serial: {result.Value}")
Console.WriteLine($"Barcode Type: {result.Format}")
Next
有关支持的编码格式和生成选项的完整列表,请参阅IronBarcode条形码生成文档。
品牌二维码生成
Barkoder 不生成条形码。 IronBarcode生成带有嵌入式徽标的二维码,这是市场营销、包装和产品识别工作流程中的常见需求。
barKoder MAUI方法:
Not available — Plugin.Maui.Barkoder is a reader-only SDK with no
generation API on any platform.
IronBarcode方法:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("branded-qr.png")
ASP.NET Core条形码 API 端点
Barkoder 没有服务器端部署模型。 相当于移动扫描上传端点的功能(从任何客户端接收图像并返回条形码数据)需要一个.NET库。
barKoder方式:
Not available — Plugin.Maui.Barkoder runs only inside a MAUI app head
against a live camera. There is no ASP.NET Core integration and no
server-side execution model.
IronBarcode方法:
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
app.MapPost("/api/scan", Async Function(file As IFormFile) As Task(Of IResult)
Using stream = file.OpenReadStream()
Dim imageBytes(CInt(stream.Length) - 1) As Byte
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read(imageBytes, options)
Return Results.Ok(results.Select(Function(r) New With {
.Value = r.Value,
.Format = r.Format.ToString()
}))
End Using
End Function)
barKoder SDKAPI到IronBarcode映射参考
此表将barKoder的MAUI / Xamarin界面映射到等效的IronBarcode调用:
| barKoder API | IronBarcode等效物 |
|---|---|
| 通过barKoder门户/配置设置许可证 | IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" |
在BarkoderView上配置去模糊 |
Speed = ReadingSpeed.ExtremeDetail |
在BarkoderView上配置多扫描 |
ExpectMultipleBarcodes = true |
SetEnabledBarcodeTypes(...) |
BarcodeEncoding.<Format>(读取时自动检测) |
BarkoderView.StartScanning(IBarkoderDelegate) |
BarcodeReader.Read("image.png") — 同步 |
BarcodeResult.TextualData |
result.Value |
BarcodeResult.BarcodeTypeName |
result.Format |
| MatrixSight损伤恢复 | ReadingSpeed.ExtremeDetail 与ML预处理 |
| 实时摄像头帧输入 | 文件路径 / Stream / byte[] 输入 |
| 设备端处理 | 完全本地通话——无需网络通话 |
| 无代际支持 | BarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode() |
| 不支持 PDF | BarcodeReader.Read("document.pdf") — 原生 |
| 没有服务器部署 | 适用于ASP.NET Core、Docker、Azure Functions 和 Lambda。 |
| 无页面索引(不适用) | result.PageNumber — 可在PDF读取时使用 |
常见迁移问题和解决方案
问题1:NuGet包名
barKoder SDK:官方.NET包是Barkoder.Xamarin。 均不涵盖非移动场景。
解决方案:安装IronBarcode:
dotnet add package BarCode
如果不再需要Plugin.Maui.Barkoder(您完全转向文件 / PDF / 服务器处理),请移除它:
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
问题2:摄像头帧输入与文件输入
barKoder SDK:所有输入都作为实时摄像头帧传入——设备上处理的连续视频流。没有文件路径输入模式。
解决方案: IronBarcode接受文件、流、字节数组和 System.Drawing.Image 对象。 对于通过移动客户端上传的图片,直接读取请求流:
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
Imports System.IO
Using stream = file.OpenReadStream()
Dim imageBytes = New Byte(stream.Length - 1) {}
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim results = BarcodeReader.Read(imageBytes, options)
End Using
问题 3:基于回调的 API 与同步结果
barKoder SDK: BarkoderView.StartScanning(IBarkoderDelegate)使用委托 / 回调模式 —— 随着条码在摄像机画面中被检测到,DidFinishScanning(BarcodeResult[]) 异步触发。
解决方案:IronBarcode的IEnumerable<BarcodeResult>。 在ASP.NET Core上下文中需要异步时,包装在Task.Run()中:
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
问题 4:去模糊模式配置
barKoder SDK:扫描开始前,在BarkoderView配置上启用去模糊,并适用于所有后续扫描。
解决方案:在IronBarcode中,等效功能是通过ReadingSpeed.ExtremeDetail。 创建选项对象一次,即可重复使用:
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
Imports System
Dim deepOptions As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
' Reuse across multiple reads
Dim results = BarcodeReader.Read("image.png", deepOptions)
问题五:发电能力不足
barKoder SDK:Barkoder是只读的。 目前没有用于生成条形码或二维码的API。
解决方案: IronBarcode可同时实现读取和生成。 使用QRCodeWriter用于QR码:
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports System
' Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
' QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500) _
.SaveAsPng("product-qr.png")
' Get as bytes for embedding in API response or PDF
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128) _
.ToPngBinaryData()
barKoder SDK迁移检查表
迁移前任务
审查您的代码库中barKoder的引用:
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
记录当前已实施或计划实施的条形码应用场景:
- 需要读取哪些条形码格式(Code128、DataMatrix、QR、PDF417 等)
- 是否需要损坏条码恢复(
ReadingSpeed.ExtremeDetail) - 是否需要多条码检测(
ExpectMultipleBarcodes = true) - 是否需要条码生成(
BarcodeWriter,QRCodeWriter) - 是否需要PDF处理(
BarcodeReader.Read("doc.pdf")) - 部署目标(ASP.NET Core、Azure Functions、Docker、Lambda、桌面、MAUI)
代码更新任务
- 移除
.csproj中,当不再需要时 - 安装
BarCodeNuGet包 - 移除
using Barkoder.Maui;(或Xamarin等价物),当不再需要时 - 将
using IronBarCode;添加到所有条码处理文件 - 在应用启动时添加
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"; - 用
BarkoderView.StartScanning/DidFinishScanning回调 - 将
result.Value - 将
result.Format - 在
Speed = ReadingSpeed.ExtremeDetail - 在
ExpectMultipleBarcodes = true - 为任何生成需求添加
BarcodeWriter.CreateBarcode()调用 - 为QR码生成需求添加
QRCodeWriter.CreateQrCode()调用 - 用
BarcodeReader.Read("document.pdf")替换任何PDF预处理代码 - 对于异步ASP.NET Core端点,将同步
Task.Run()中
迁移后测试
代码更新完成后,请验证以下内容:
- 确认
BarcodeReader.Read()返回使用的所有图像格式的结果(PNG、JPEG、TIFF、BMP) - 验证
ReadingSpeed.ExtremeDetail从测试集中最低质量样本中恢复条码 - 确认
ExpectMultipleBarcodes = true返回来自多条码文档的正确条码数 - 测试所有生产文档工作流程中使用的 PDF 版本的 PDF 读取功能。
- 验证
BarcodeWriter.CreateBarcode()输出可以被目标扫描仪扫描 - 验证
QRCodeWriter.CreateQrCode()输出可以被移动QR读取器扫描 - 使用移动客户端上传文件来测试ASP.NET Core端点(如果适用)
- 确认在 Docker、Azure 或 Lambda 部署目标中运行正常
- 在适用情况下,运行涵盖完整读取-处理-生成周期的端到端测试。
迁移到IronBarcode的主要优势
覆盖非摄像头.NET的平台: IronBarcode从NuGet安装并运行于任何.NET项目中——ASP.NET Core、Azure Functions、Lambda、Docker、控制台、工作器、WPF、WinForms、Avalonia、Blazor、MAUI。Barkoder的Plugin.Maui.Barkoder仅覆盖于MAUI移动应用头中的摄像头界面; IronBarcode覆盖其他所有。
不使用摄像头的抗损伤读取:使Barkoder有吸引力的功能——去模糊、MatrixSight、损伤恢复——在IronBarcode中通过ReadingSpeed.ExtremeDetail和基于ML的图像预处理呈现。 Barkoder 在实时摄像头输入上实现的精度提升, IronBarcode在文件、扫描文档和上传图像上也能实现。
完整的读取和生成工作流程: Barkoder 是只读的。 IronBarcode是一款支持 50 多种格式的条形码读取和生成软件,所有功能均集成在一个软件包中。 需要生成运输标签、创建包装二维码或在文档中嵌入条形码的团队不需要第二个库。
原生 PDF 支持:从 PDF 文档(发票、清单、医疗记录、合规文件)中读取条形码是IronBarcode 的一项一流功能。 无需中间图像提取,无需逐页调用 API,也无需其他依赖项。 一个多页PDF在单个BarcodeReader.Read()调用中被处理。
完全服务器端部署: IronBarcode可在ASP.NET Core、Azure Functions、AWS Lambda、Docker 容器以及任何其他.NET托管环境中运行。 它可在本地处理条形码,无需网络调用,无需管理 API 密钥,也不会因远程服务而增加延迟。处理一个条形码或一百万个条形码的成本相同——不收取任何请求费用。
可预测的永久定价: IronBarcode提供一次性永久许可,单个开发人员起价为 749 美元,不收取每次请求费用,没有数量限制,也没有订阅续订。 对于构建大规模处理条形码的生产应用程序的团队来说,成本模型简单且可预测。
常见问题解答
我为什么要从 Barkoder SDK 迁移到 IronBarcode?
常见原因包括简化许可(消除 SDK + 运行时密钥的复杂性)、消除吞吐量限制、获得原生 PDF 支持、改进 Docker/CI/CD 部署以及减少生产代码中的 API 样板代码。
如何用 IronBarcode 替换 Barkoder API 调用?
用 `IronBarCode.License.LicenseKey = "key"` 替换实例创建和许可相关的样板代码。用 `BarcodeReader.Read(path)` 替换读取器调用,用 `BarcodeWriter.CreateBarcode(data, encoding)` 替换写入器调用。静态方法无需实例管理。
从 Barkoder SDK 迁移到 IronBarcode 时,需要修改多少代码?
大多数迁移都能减少代码行数。许可样板代码、实例构造函数和显式格式配置都被移除。核心读/写操作映射到更简洁的 IronBarcode 等效代码,并生成更清晰的结果对象。
迁移过程中是否需要同时安装 Barkoder SDK 和 IronBarcode?
不。大多数迁移都是直接替换,而不是并行操作。一次迁移一个服务类,替换 NuGet 引用,并更新实例化和 API 调用模式,然后再迁移下一个类。
IronBarcode 的 NuGet 包名称是什么?
该软件包名为“IronBarCode”(B 和 C 大写)。使用“Install-Package IronBarCode”或“dotnet add package IronBarCode”进行安装。代码中的 using 指令为“using IronBarCode;”。
与 Barkoder SDK 相比,IronBarcode 如何简化 Docker 部署?
IronBarcode 是一个 NuGet 包,不包含任何外部 SDK 文件或已挂载的许可证配置。在 Docker 环境中,设置 IRONBARCODE_LICENSE_KEY 环境变量后,该包会在启动时自动处理许可证验证。
从 Barkoder 迁移后,IronBarcode 是否能自动检测所有条形码格式?
是的。IronBarcode 可以自动检测所有支持格式的条码符号,无需显式枚举 BarcodeTypes。如果已知条码格式且性能至关重要,BarcodeReaderOptions 允许缩小搜索范围以进行优化。
IronBarcode 能否在不使用单独库的情况下读取 PDF 中的条形码?
是的。`BarcodeReader.Read("document.pdf")` 可以直接处理 PDF 文件。结果包括每个条形码的页码、格式、值和置信度。无需外部 PDF 渲染步骤。
IronBarcode如何处理并行条码处理?
IronBarcode 的静态方法是无状态且线程安全的。可以直接对文件列表使用 Parallel.ForEach,无需进行线程级实例管理。BarcodeReaderOptions.MaxParallelThreads 控制内部线程预算。
从 Barkoder SDK 迁移到 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 和流媒体。

