Scandit SDK 与 IronBarcode:C# 条形码库对比
要开始使用 Scandit 读取条形码,您需要配置 DataCaptureContext,创建 BarcodeCaptureSettings,显式启用符号体系,获取摄像头,将其设置为帧源,将摄像头切换到开启状态,并启用捕获。 网站上仍然没有标明价格。
这种组合——强制性的摄像头管道和不透明的Enterprise定价——恰恰定义了 Scandit 何时不适合.NET项目。 如果您正在构建服务器端文档处理工作流、读取上传文件中条形码的ASP.NET Core API,或者处理发货 PDF 的 Azure 函数,那么 Scandit 的架构会在每个环节都对您不利。本文将对比分析 Scandit 架构的由来、IronBarcode的替代方案,以及两种方案的成本。
了解 Scandit SDK
Scandit SDK 是一个专为移动和边缘计算环境构建的商业Enterprise条码扫描平台。 该库旨在支持 iOS、Android 和 MAUI 设备上的实时摄像头扫描,其专业产品线涵盖增强现实叠加、多条形码同时检测和身份文件扫描。 Scandit 的主要部署场景是移动现场工作人员、仓库运营和零售互动点场景,在这些场景中,物理摄像头、实时用户和低于 100 毫秒的响应时间同时存在。
该库的架构围绕 DataCaptureContext 管道组织,该管道将相机会话、帧分析设置和条形码捕获配置协调为一个统一的有状态系统。 由于 Scandit 平台中的每个产品线(SparkScan、MatrixScan、ID 扫描、AR 叠加层和解析器)都是单独授权并通过联系销售模式定价的,因此任何 Scandit 集成的总成本在销售洽谈之前都无法确定。
Scandit SDK 的主要架构特点包括:
-相机优先设计: SDK 假定有一个物理相机和一个运行中的帧源。 所有条形码读取均在实时视频帧上进行,而不是在静态文件或视频流上进行。
-强制性数据捕获上下文初始化:每次集成都首先构建一个 DataCaptureContext 并将其连接到相机实例,然后才能进行任何条形码工作。
-显式符号声明:在捕获会话开始之前,必须使用 EnableSymbologies 单独启用条形码格式。 自动检测功能不可用。
-事件驱动的结果交付:条形码结果通过事件回调异步交付(BarcodeScanned),而不是通过方法调用同步返回。
-模块化产品架构: SparkScan、MatrixScan、ID 扫描、AR 叠加层和解析器是单独定价的功能,需要单独的合同项目。
-联系销售定价:不公布定价。 每次集成都需要先进行销售询价,才能确定许可费用。
-移动优先平台目标:主要支持 iOS 和 Android。 服务器端、Docker 和无服务器部署不在 SDK 的设计范围内。
数据捕获上下文管道
所有 Scandit 集成都从以下相机初始化序列开始,然后才能读取单个条形码:
// Scandit SDK: full camera pipeline setup
// NuGet: Scandit.BarcodePicker
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
var settings = BarcodeCaptureSettings.Create();
settings.EnableSymbologies(new HashSet<Symbology>
{
Symbology.Ean13Upca,
Symbology.Ean8,
Symbology.Code128,
Symbology.QrCode
});
var barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings);
var camera = Camera.GetDefaultCamera();
await dataCaptureContext.SetFrameSourceAsync(camera);
await camera.SwitchToDesiredStateAsync(FrameSourceState.On);
barcodeCapture.IsEnabled = true;
// Scandit SDK: full camera pipeline setup
// NuGet: Scandit.BarcodePicker
var dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE");
var settings = BarcodeCaptureSettings.Create();
settings.EnableSymbologies(new HashSet<Symbology>
{
Symbology.Ean13Upca,
Symbology.Ean8,
Symbology.Code128,
Symbology.QrCode
});
var barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings);
var camera = Camera.GetDefaultCamera();
await dataCaptureContext.SetFrameSourceAsync(camera);
await camera.SwitchToDesiredStateAsync(FrameSourceState.On);
barcodeCapture.IsEnabled = true;
Imports Scandit.DataCapture.Core
Imports Scandit.DataCapture.Barcode
Imports Scandit.DataCapture.Barcode.Capture
Imports Scandit.DataCapture.Core.Source
Imports System.Collections.Generic
' Scandit SDK: full camera pipeline setup
' NuGet: Scandit.BarcodePicker
Dim dataCaptureContext = DataCaptureContext.ForLicenseKey("YOUR-SCANDIT-LICENSE")
Dim settings = BarcodeCaptureSettings.Create()
settings.EnableSymbologies(New HashSet(Of Symbology) From {
Symbology.Ean13Upca,
Symbology.Ean8,
Symbology.Code128,
Symbology.QrCode
})
Dim barcodeCapture = BarcodeCapture.Create(dataCaptureContext, settings)
Dim camera = Camera.GetDefaultCamera()
Await dataCaptureContext.SetFrameSourceAsync(camera)
Await camera.SwitchToDesiredStateAsync(FrameSourceState.On)
barcodeCapture.IsEnabled = True
这个区块中的每一行都是摄像头基础设施。 没有文件路径参数。 没有PDF文件。 没有直播流。 该库假定在开始任何条形码工作之前,摄像头必须处于运行状态。
了解IronBarcode
IronBarcode是一个用于条形码读取和生成的商业.NET库。 该库专为服务器端、桌面端和云环境而设计,其中条形码数据以文件、流、字节数组或 PDF 文档中的嵌入内容的形式到达。 它的 API 是无状态的——没有会话对象,没有需要初始化的相机管道,也没有需要在读取之间管理的持久上下文。 对 BarcodeReader.Read 的单个静态调用接受文件路径、流、字节数组或 PDF,并返回结果集合。
IronBarcode以单个NuGet包的形式提供,其中包含对 30 多种一维和二维条形码格式的所有读取和生成功能。 该库支持自动格式检测,这意味着调用者无需指定要查找的符号体系。 产品价格已在产品页面上公布,无需销售洽谈。
IronBarcode的主要特点包括:
-无状态的基于文件的 API:读取操作从接受文件路径、流、字节数组或 PDF 文档的单个方法调用开始。 -自动格式检测:所有支持的条形码格式均可自动检测。 显式符号配置是一种可选的性能优化,而不是必要条件。 -原生 PDF 支持:直接读取多页 PDF 文档,结果按页码索引。 无需外部PDF渲染库。 -服务器和云就绪:支持ASP.NET Core、Azure Functions、Linux 上的 Docker 和容器化部署,无需架构上的变通方法。 -并发处理:无状态 API 本质上是线程安全的,支持高吞吐量批处理场景的异步模式。 -条形码生成:生成图像和 PDF 格式的条形码,支持所有条形码符号体系。 生成和阅读包含在同一个软件包中。 -已公布的永久授权:价格以一次性永久购买的形式公开列出,不收取每次扫描或每台设备的费用。
功能对比
下表列出了 Scandit SDK 和IronBarcode之间的根本区别:
| 特征 | Scandit SDK | IronBarcode |
|---|---|---|
| 主要用例 | 移动设备上的实时摄像头扫描 | 服务器端文件、流和 PDF 条形码读取 |
| 需要摄像头 | 是 | 否 |
| PDF条形码提取 | 不支持 | 本地支持 |
| 定价模式 | 联系销售人员,按产品咨询 | 已发布的永久层级 |
| 服务器端处理 | 并非设计用于 | 主要部署目标 |
| 符号配置 | 扫描前必须完成 | 选修的; 自动检测是默认设置 |
| 条形码生成 | 不支持 | 包含在单个包装内 |
详细功能对比
| 特征 | Scandit SDK | IronBarcode |
|---|---|---|
| 阅读 | ||
| 图像文件读取 | 并非设计用于 | 主要关注点 |
| PDF条形码提取 | 不支持 | 原生多页 |
| 流/字节数组输入 | 不支持 | 是 |
| 自动格式检测 | 否(必须注明) | 是 |
| 一维条码格式(Code 128、EAN、UPC 等) | 30+ | 30+ |
| 二维格式(QR码、DataMatrix码、Aztec码、PDF417码) | 是 | 是 |
| 每个文档可检测多个条形码 | MatrixScan(独立产品) | 是的(单件装) |
| 条形码损坏恢复 | 有限的 | 是的(基于机器学习) |
| 一代 | ||
| 条形码生成 | 不支持 | 是 |
| 输出到图像文件 | 不支持 | 是 |
| 输出为 PDF | 不支持 | 是 |
| 架构 | ||
| 初始化模型 | 有状态相机管道 | 无状态方法调用 |
| 结果交付 | 事件回调(异步) | 同步返回值 |
| 相机依赖性 | 要求 | 不适用 |
| 符号学预声明 | 要求 | 可选项 |
| 平台 | ||
| iOS / Android (MAUI) | 主要目标 | 程序化使用 |
| ASP.NET Core | 并非设计用于 | 全面支持 |
| Azure 功能/ 无服务器 | 不切实际 | 全面支持 |
| Docker/Linux服务器 | 不支持 | 全面支持 |
| 控制台/后台服务 | 并非设计用于 | 全面支持 |
| 许可 | ||
| 定价透明度 | 联系销售人员 | 发布于网站 |
| 许可证类型 | 年均(按产品计) | 永久一次性 |
| 按扫描次数或按设备收费 | 是 | 否 |
| 单一软件包即可访问所有功能 | 否(模块化产品) | 是 |
条形码读取架构
这两个库之间最显著的结构性区别在于它们如何对输入和输出之间的关系进行建模。
Scandit SDK 方法
Scandit 实时处理摄像头帧。DataCaptureContext 保持一个活动的摄像头会话,而 BarcodeCapture 监听每个传入帧中的条形码。 条形码结果通过 BarcodeScanned 事件异步传递。 使用 Scandit 读取静态图像文件需要调整相机管道,将文件视为帧源——这种工作流程目前尚未得到原生支持,需要工程努力才能近似实现。
// Scandit SDK: event-callback result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
{
string value = barcode.Data;
string symbology = barcode.Symbology.ToString();
ProcessBarcode(value, symbology);
}
};
// Scandit SDK: event-callback result delivery
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
{
string value = barcode.Data;
string symbology = barcode.Symbology.ToString();
ProcessBarcode(value, symbology);
}
};
Imports System
' Scandit SDK: event-callback result delivery
AddHandler barcodeCapture.BarcodeScanned, Sub(sender, args)
For Each barcode In args.Session.NewlyRecognizedBarcodes
Dim value As String = barcode.Data
Dim symbology As String = barcode.Symbology.ToString()
ProcessBarcode(value, symbology)
Next
End Sub
事件驱动模型适用于连续实时扫描,其中条形码在视频流中出现的时间是不可预测的。 对于基于文件的处理,该模型引入了不必要的复杂性:输入具有已知的完成边界,相机会话永远不会自然终止,异步回调模式与请求-响应服务器架构不兼容。
IronBarcode方法
IronBarcode将每个输入视为一个离散文档,并给出确定性的结果。 BarcodeReader.Read 方法接受文件路径、流或字节数组,同步执行所有检测,并返回结果集合。 没有会话要打开,没有帧源要配置,也没有事件要订阅。
// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
Console.WriteLine($"{result.Value} ({result.Format})");
// IronBarcode: direct file reading
// NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-KEY";
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
Console.WriteLine($"{result.Value} ({result.Format})");
' IronBarcode: direct file reading
' NuGet: dotnet add package IronBarcode
IronBarCode.License.LicenseKey = "YOUR-KEY"
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
Console.WriteLine($"{result.Value} ({result.Format})")
Next
对于从图像中读取条形码,无状态 API 除了许可证密钥之外不需要任何初始化。 格式检测是自动的。 上述完整程序只需三行操作代码即可从图像文件中读取任何受支持的条形码格式。
平台和部署支持
条形码库的部署环境决定了它是否能在目标环境中运行,而与功能无关。
Scandit SDK 方法
Scandit 的架构需要摄像头硬件和一个可以通过原生摄像头 API 将其暴露出来的移动平台。 iOS 和 Android 是主要支持的目标平台。 Windows桌面系统是次要目标。 ASP.NET Core、Azure Functions、Docker 容器和 Linux 服务器不在该库的设计范围内。 DataCaptureContext 假定摄像头会话正在运行,这在无服务器计算环境、容器化部署或后台处理服务中没有等效项。
| 平台 | Scandit SDK |
|---|---|
| iOS / Android (MAUI) | 主要目标 |
| Windows 桌面 | 次要支持 |
| ASP.NET Core | 并非设计用于 |
| Azure 功能 | 不切实际 |
| Docker/Linux服务器 | 不支持 |
| 控制台/后台服务 | 并非设计用于 |
IronBarcode方法
IronBarcode专为服务器、云和容器化环境而设计。 无状态 API 没有硬件依赖性,也没有平台特定的初始化要求。 将条形码处理部署到 Azure Functions是一个受支持且有文档记录的途径。 Linux 上的 Docker 是一个标准的部署目标。 ASP.NET Core端点从上传的文件中读取条形码代表了一个核心支持的场景,无需任何架构上的变通方法。
| 平台 | IronBarcode |
|---|---|
| iOS / Android (MAUI) | 程序化文件处理 |
| ASP.NET Core | 全面支持 |
| Azure 功能/ Lambda | 全面支持 |
| Docker/Linux服务器 | 全面支持 |
| 控制台/后台服务 | 全面支持 |
| Blazor服务器 | 全面支持 |
并发批处理
处理大量带有条形码的文档是服务器端常见的需求,而这两个库从根本上不同的角度来处理这个问题。
Scandit SDK 方法
Scandit 的摄像头流水线设计用于单个摄像头会话,服务于单个用户或设备。FrameSourceState 模型假定摄像头会话是持续的,而不是按吞吐量处理文档队列。 要使库能够处理批量文件,需要为每个文档模拟一次相机会话,或者通过共享管道对文档处理进行序列化,但这两种方法都不是受支持的或高效的模式。
IronBarcode方法
因为IronBarcode的 BarcodeReader.Read 方法是无状态的,所以从多个线程同时调用本质上是安全的。 并发批处理除了定义 BarcodeReaderOptions: 之外,不需要任何特殊配置。
// IronBarcode: concurrent batch processing
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var files = Directory.GetFiles("./incoming/", "*.pdf");
var allResults = new ConcurrentBag<BarcodeResult>();
Parallel.ForEach(files, file =>
{
var results = BarcodeReader.Read(file, options);
foreach (var r in results)
allResults.Add(r);
});
// IronBarcode: concurrent batch processing
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
MaxParallelThreads = 4
};
var files = Directory.GetFiles("./incoming/", "*.pdf");
var allResults = new ConcurrentBag<BarcodeResult>();
Parallel.ForEach(files, file =>
{
var results = BarcodeReader.Read(file, options);
foreach (var r in results)
allResults.Add(r);
});
Imports System.IO
Imports System.Collections.Concurrent
Imports System.Threading.Tasks
' IronBarcode: concurrent batch processing
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.MaxParallelThreads = 4
}
Dim files = Directory.GetFiles("./incoming/", "*.pdf")
Dim allResults As New ConcurrentBag(Of BarcodeResult)()
Parallel.ForEach(files, Sub(file)
Dim results = BarcodeReader.Read(file, options)
For Each r In results
allResults.Add(r)
Next
End Sub)
有关异步和多线程条形码读取的详细模式,请参阅IronBarcode文档,其中涵盖了线程安全模式和吞吐量调整选项。
PDF文档处理
PDF 条形码提取与基于图像的读取是截然不同的功能,代表了这两个库之间的显著差异。
Scandit SDK 方法
Scandit 没有原生 PDF 支持。 使用 Scandit 从 PDF 中提取条形码需要使用单独的 PDF 渲染库将每个 PDF 页面渲染成光栅图像,然后将这些图像输入到相机模拟流程中。这种方法引入了额外的依赖项、额外的许可成本以及大量的工程工作,而这项任务在文档处理工作流程中却是常规操作。 多页文档需要遍历页面、管理渲染图像的内存,并手动协调各页面的结果。
IronBarcode方法
IronBarcode可以直接读取 PDF 文档中的条形码。 PDF 文件路径是 BarcodeReader.Read 的有效参数,结果包含一个 PageNumber 属性,该属性指示每个条形码在文档的哪一页上找到:
// IronBarcode: extract barcodes from every page of a PDF
var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})");
}
// IronBarcode: extract barcodes from every page of a PDF
var results = BarcodeReader.Read("shipping-manifest.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})");
}
Imports IronBarcode
' IronBarcode: extract barcodes from every page of a PDF
Dim results = BarcodeReader.Read("shipping-manifest.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value} ({barcode.Format})")
Next
有关从 PDF 中读取条形码的完整指南,包括页面范围选择和多条形码提取选项, IronBarcode文档涵盖了 PDF 处理场景的全部内容。
定价和许可
许可结构不仅影响图书馆的成本,还影响评估和采用图书馆所需的时间。
斯堪迪特方法
Scandit公司不公布定价信息。 产品页面列出了功能和产品名称——SparkScan、MatrixScan、ID 扫描、AR 叠加层、解析器——并将所有咨询转接到销售对话中。 报价流程包括解释使用案例、估算扫描量、指定设备、讨论支持级别以及协商合同期限,然后才会提供成本数字。 G2 和 DiscoverSDK 等平台上的评论一致指出,中小企业的成本难以预测,预算预测也面临挑战。 Scandit 的每条产品线都是单独定价和单独签订合同的,这意味着扩展功能需要额外的销售周期。
IronBarcode方法
IronBarcode在产品页面上公布其许可级别,无需提交表单或进行销售咨询:
| 许可证 | 价格 | 开发者 | 项目 |
|---|---|---|---|
| 一点 | 一次性 749 美元 | 1 | 1 |
| 专业 | 一次性支付 1,499 美元 | 10 | 10 |
| 无限制 | 一次性支付 2,999 美元 | 无限制 | 无限制 |
许可证永久有效。 没有按扫描次数收费,没有按设备收费,也没有触发等级变更的流量阈值。 年度续费是可选的,费用为原价的一半,但购买的许可证即使不续费仍然有效。 IronBarcode单个软件包的所有功能——读取、生成、PDF 支持、多条形码检测——在每个级别中都包含在内。
API 映射参考
下表将 Scandit SDK 概念与其对应的IronBarcode概念进行映射,供团队评估迁移的转换成本:
| Scandit SDK | IronBarcode | 备注 |
|---|---|---|
DataCaptureContext.ForLicenseKey("key") |
IronBarCode.License.LicenseKey = "key" |
一项任务; 不需要上下文对象 |
BarcodeCaptureSettings.Create() |
new BarcodeReaderOptions() |
IronBarcode中为可选 |
settings.EnableSymbologies(Symbology.Code128, ...) |
(not needed) | 自动检测是默认设置 |
Camera.GetDefaultCamera() |
(not applicable) | 文件处理中没有相机概念 |
dataCaptureContext.SetFrameSourceAsync(camera) |
(not applicable) | IronBarcode中没有帧源 |
camera.SwitchToDesiredStateAsync(FrameSourceState.On) |
(not applicable) | 无摄像头状态机 |
barcodeCapture.IsEnabled = true |
BarcodeReader.Read(path) |
单次调用即可启动读取 |
BarcodeScanned += 事件处理程序 |
遍历 BarcodeReader.Read() 返回值 |
同步收集; 无事件系统 |
args.Session.NewlyRecognizedBarcodes |
返回值 BarcodeReader.Read() |
直接收集途径 |
barcode.Data |
result.Value |
相同的语义内容 |
barcode.Symbology |
result.Format |
等效格式枚举 |
| SparkScan、MatrixScan、身份证扫描(均为独立产品) | 单个 IronBarcode 包 |
没有单独的插件 |
当团队考虑从 Scandit SDK 迁移到IronBarcode时
服务器端处理要求
构建ASP.NET Core API、后台处理服务或Azure 功能的团队会发现,Scandit 的架构从集成的第一道防线就存在根本性的不匹配。 DataCaptureContext 和摄像头管道假定了服务器环境中不存在的硬件。 当一个项目的条形码需求完全在服务器端时——从上传的文件读取数据、处理文档队列、从传入的 PDF 中提取条形码数据——相机管道增加了初始化复杂性、异步状态机开销和平台限制,而这些对实际的业务需求没有任何贡献。
批量文档处理
处理大量带有条形码的文档(例如运输清单、发票、库存记录、医疗表格)的组织发现,Scandit 的框架源模型无法与文档队列配合使用。 该库是为连续的相机拍摄会话而设计的,而不是为具有确定的开始和结束点的离散文档而设计的。 当文档量增长且需要并行处理时,相机管道的状态性就变成了工程上的障碍,而不是一项功能。
定价透明度
开发团队在为新项目制定预算方案、进行供应商比较或成本效益分析时,如果未先进入销售流程,就无法与 Scandit 完成这些工作。当项目预算和时间表都已确定时,如果无法在未进行销售洽谈的情况下确定许可费用,就会造成延误和不确定性,进而对项目规划产生后续影响。 同时评估多个图书馆选项的团队发现,由于没有公布价格,Scandit 很难纳入结构化的比较中。
降低管道复杂性
即使 Scandit 已经部署用于移动摄像头扫描,一些团队仍然发现,同一应用程序中的服务器端条形码要求需要不同的工具。 适用于实时移动扫描的相机处理流程,在应用于静态文档处理时会引入不必要的复杂性。 达到这一步的团队通常会采用IronBarcode进行服务器端处理,并配合现有的 Scandit 部署,而不是尝试将相机管道扩展到它原本设计无法处理的用例。
常见迁移注意事项
相机管道没有等效文件
整个 DataCaptureContext 初始化块——上下文创建、设置配置、符号启用、相机采集、帧源分配和状态转换——在IronBarcode的基于文件的 API 中没有等效项。 迁移服务器端集成代码时,此代码块将被完全删除。 尚未翻译; 它被移除了。IronBarcode的替代方案是分配许可证密钥,然后调用 BarcodeReader.Read 函数。
事件回调直接返回
Scandit 通过 BarcodeScanned 事件提供条形码结果,因为实时摄像头扫描本质上是异步的。 IronBarcode以类型化集合的形式同步返回结果,因为基于文件的读取具有已知的完成边界。 迁移过程包括将事件处理程序逻辑转换为标准迭代:
// Scandit callback pattern (removed during migration)
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
ProcessBarcode(barcode.Data, barcode.Symbology.ToString());
};
//IronBarcodedirect return (replacement)
foreach (var result in BarcodeReader.Read("document.png"))
ProcessBarcode(result.Value, result.Format.ToString());
// Scandit callback pattern (removed during migration)
barcodeCapture.BarcodeScanned += (sender, args) =>
{
foreach (var barcode in args.Session.NewlyRecognizedBarcodes)
ProcessBarcode(barcode.Data, barcode.Symbology.ToString());
};
//IronBarcodedirect return (replacement)
foreach (var result in BarcodeReader.Read("document.png"))
ProcessBarcode(result.Value, result.Format.ToString());
Imports System
' Scandit callback pattern (removed during migration)
AddHandler barcodeCapture.BarcodeScanned, Sub(sender, args)
For Each barcode In args.Session.NewlyRecognizedBarcodes
ProcessBarcode(barcode.Data, barcode.Symbology.ToString())
Next
End Sub
' IronBarcodedirect return (replacement)
For Each result In BarcodeReader.Read("document.png")
ProcessBarcode(result.Value, result.Format.ToString())
Next
符号声明移除
Scandit 要求在扫描开始前显式调用 EnableSymbologies 调用。 IronBarcode不需要预先声明符号体系——所有格式都会自动检测。 迁移过程中,所有 settings.EnableSymbologies(...) 调用均被删除。 如果原始的 Scandit 代码出于性能原因限制了符号体系,IronBarcode 可以通过 BarcodeReaderOptions.ExpectBarcodeTypes 提供等效的优化,但这不是入门的必要条件。
IronBarcode的其他功能
除了上述比较中涵盖的领域之外, IronBarcode还提供了一些功能,可以扩展其在文档和数据处理场景中的应用:
-条形码生成:生成条形码作为图像文件或将其嵌入 PDF 中,支持所有条形码格式,包括二维码、Code 128、Data Matrix 和 PDF417。
- GS1 和结构化数据解析:直接从条形码结果解码结构化条形码数据格式,包括 GS1-128 应用标识符。
-图像校正和预处理:自动图像校正倾斜、低对比度或损坏的条形码,无需手动预处理即可提高扫描文档的读取率。
-多条形码检测:使用
BarcodeReader.Read选项,通过一次ExpectMultipleBarcodes调用即可检测文档中存在的所有条形码,包括同一页面上的混合格式。 - MAUI 条形码读取:在使用捕获和处理模型的 MAUI 应用程序中,IronBarcode 在使用
MediaPicker捕获照片后处理步骤。 -流和字节数组输入:除了文件路径之外,BarcodeReader.Read还接受Stream和byte[]输入,从而可以与上传处理程序、内存缓冲区和网络流集成,而无需创建临时文件。
.NET兼容性和未来准备情况
IronBarcode支持.NET Framework 4.6.2 及更高版本、 .NET Standard 2.0 以及所有现代.NET版本,包括.NET 6、 .NET 7、 .NET 8 和.NET 9。该库会定期更新,以保持与当前和即将发布的.NET版本(包括预计于 2026 年底发布的.NET 10)的兼容性。其无状态 API 设计与现代.NET中引入的异步优先编程模型兼容,并且支持 Linux 和容器化部署,使其能够胜任.NET应用持续增长的云原生工作负载。 由于该库以单个NuGet包的形式提供,除了.NET运行时本身之外没有特定于平台的运行时依赖项,因此在.NET版本之间升级不需要单独的库更新或额外的配置。
结论
Scandit SDK 和IronBarcode代表了条形码处理方面截然不同的方法,反映了不同的预期部署环境。 Scandit 专为在移动硬件上进行实时相机扫描而构建,其架构可协调实时相机会话、逐帧分析设置和事件驱动的结果交付。 IronBarcode专为在服务器、桌面和云基础设施上进行基于文件和以文档为中心的处理而构建,它具有无状态 API,可以接受文件、流和 PDF,并返回同步结果。 这些并不是同一理念的不同实现方式——它们是服务于不同应用场景的不同理念。
Scandit SDK 是移动应用程序的合适选择,用户需要将设备摄像头对准物理条形码,并获得 100 毫秒以下的视觉反馈。 其 AR 叠加功能、通过 MatrixScan 实现的多条形码同时检测以及通过 ID Scanning 实现的身份文件扫描都是专门构建的功能,没有基于文件的条形码库可以复制这些功能。 那些大规模部署移动现场工作人员、运行面向消费者的扫描体验或需要Enterprise移动扫描 SLA 的组织,正是 Scandit 的目标用户群体。
当条形码数据以文件(图像、PDF、字节数组或上传流)的形式到达,并且处理过程无需摄像头、无需用户、无需用户界面时, IronBarcode是合适的选择。 服务器端文档处理、 ASP.NET Core API 端点、Azure Functions、计划批处理作业和容器化微服务代表了IronBarcode的运行环境。 其公开定价、单一软件包功能访问和直接文件读取 API 消除了 Scandit 的相机管道模型和联系销售模型在这些场景中引入的架构摩擦和预算不确定性。
客观评价是,选择很大程度上取决于部署环境,而不是个人偏好。 需要进行实时移动摄像头扫描的项目,答案显而易见。 对于需要服务器端提取 PDF 条形码的项目,答案同样很明确。 这两个库有时会被混淆的地方在于中间部分——MAUI 应用程序、混合架构以及既有移动扫描又有文档处理需求的组织。 在这种情况下,这两个库可以共存:Scandit 处理面向摄像头的工作, IronBarcode处理文档处理工作,这两个库都不会被迫承担它原本设计之外的角色。
常见问题解答
什么是 Scandit SDK?
Scandit SDK 是一个 .NET 条形码库,用于在 C# 应用程序中生成和读取条形码。它是开发人员在为 .NET 项目选择条形码解决方案时评估的几个备选方案之一。
Scandit SDK 和 IronBarcode 的主要区别是什么?
IronBarcode 使用静态、无状态的 API,无需实例管理,而 Scandit SDK 通常需要在使用前创建和配置实例。IronBarcode 还提供原生 PDF 支持、自动格式检测以及跨所有环境的单密钥许可。
IronBarcode 的授权是否比 Scandit SDK 更容易?
IronBarcode 使用单一许可证密钥,同时涵盖开发和生产部署。与将 SDK 密钥与运行时密钥分开的许可系统相比,这简化了 CI/CD 流水线和 Docker 配置。
IronBarcode是否支持Scandit SDK支持的所有条形码格式?
IronBarcode 支持超过 30 种条码符号体系,包括 QR 码、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1 等等。格式自动检测功能意味着无需显式枚举格式。
IronBarcode是否支持原生PDF条码读取?
是的。IronBarcode 可以直接从 PDF 文件中读取条形码,使用 `BarcodeReader.Read("document.pdf")` 方法,无需单独的 PDF 渲染库。每页的读取结果包括页码、条形码格式、数值和置信度评分。
与 Scandit SDK 相比,IronBarcode 在批量处理方面有何不同?
IronBarcode 的静态方法是无状态的,并且天然线程安全,因此可以直接使用 Parallel.ForEach,而无需进行线程级实例管理。所有定价层级均无吞吐量上限。
IronBarcode支持哪些.NET版本?
IronBarcode 在单个 NuGet 包中支持 .NET Framework 4.6.2+、.NET Core 3.1 以及 .NET 5、6、7、8 和 9。平台目标包括 Windows x64/x86、Linux x64 和 macOS x64/ARM。
如何在.NET项目中安装IronBarcode?
通过 NuGet 安装 IronBarcode:在程序包管理器控制台中运行“Install-Package IronBarCode”,或在命令行界面中运行“dotnet add package IronBarCode”。无需其他 SDK 安装程序或运行时文件。
与 Scandit 不同,我可以在购买前评估 IronBarcode 吗?
是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。
Scandit SDK 和 IronBarcode 的价格有什么区别?
IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。
从 Scandit SDK 迁移到 IronBarcode 是否简单?
从 Scandit SDK 迁移到 IronBarcode 主要涉及将基于实例的 API 调用替换为 IronBarcode 的静态方法、移除许可相关的样板代码以及更新结果属性名称。大多数迁移工作都是减少代码,而不是增加代码。
IronBarcode 能生成带有 logo 的二维码吗?
是的。`QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以将品牌图片原生嵌入二维码中,并支持配置纠错功能。此外,它还支持通过 `ChangeBarCodeColor()` 函数创建彩色二维码。

