Cloudmersive 条码 API 与 IronBarcode:C# 条码库对比
Google ML Kit条形码扫描与IronBarcode:.NET开发者需要知道的内容
Google ML Kit 在 Android 上的条形码扫描功能确实令人印象深刻。 它为 Google Lens 提供动力,可以处理损坏和部分遮蔽的条形码,无需网络通话即可在设备上工作,并且支持各种 1D 和 2D 格式。 当.NET开发人员在条形码库比较中遇到这种情况时,这些事实是准确的。 对比文章经常忽略的一点是,ML Kit 没有.NET SDK、没有NuGet包、也没有 C# API。 本文面向在列表中发现 ML Kit 的开发人员,他们需要了解"在.NET项目中使用 ML Kit"在实践中究竟意味着什么,以及托管代码的等效实现方式。
什么是 Google ML Kit 条形码扫描?
Google ML Kit 条形码扫描是一个原生移动库。 那不是一个可以绕过的限制; 这是产品的设计。 ML Kit 提供两种版本:
- Android: 通过Google Maven作为
com.google.mlkit:barcode-scanning(Kotlin/Java)分发。 需要目标设备上的Google Play服务。处理从相机帧、文件URI或位图构建的InputImage对象。 - iOS: 通过CocoaPods分发为
GoogleMLKit/BarcodeScanning。 使用 Swift 或 Objective-C。
没有dotnet add package google-mlkit-barcode。 没有using Google.MLKit.BarcodeScanning;。 Google 没有发布 ML Kit 的.NET绑定。
社区维护的Xamarin和MAUI绑定(如Xamarin.GooglePlayServices.MLKit.BarcodeScanning)在不同时间存在过,但它们面临一个共同的挑战:ML Kit经常更新其Android和iOS SDK,而由个人或小团队维护的绑定项目在基础API变更时可能落后或无效。 没有Google官方的.NET NuGet包用于ML Kit条形码扫描器。
ML 套件的优势
了解 ML Kit 出现在条形码比较中的原因有助于理解相关背景信息。 在原生 Android 系统上:
-设备端推理:无需服务器往返。ML Kit 的模型使用 Google Play 服务在本地运行,这意味着扫描时延迟低且无需网络依赖。 -损伤容限: ML 模型比许多基于阈值的解码器更能处理损坏、部分遮挡或低分辨率的条形码。 对于面向消费者的、扫描现实世界条形码的应用程序来说,这是一个真正的差异化优势。
- Google Lens 集成: ML Kit 的扫描器与 Google Lens 条形码检测所使用的技术栈相同。 这是一个很强的质量信号。 -移动设备上的格式广度:原生支持 QR Code、EAN-13、EAN-8、Code 128、Code 39、Code 93、Codabar、ITF、PDF417、Data Matrix、Aztec 和 UPC-A/UPC-E。 -零配置:只需三行 Kotlin 代码片段即可生成一个可用的扫描器,无需调整阈值或选择解码器策略。
这些都是实实在在的优势。 对于.NET开发人员来说,问题不在于 ML Kit 不好,而在于他们不付出大量努力就无法使用 ML Kit。
.NET开发现状
当.NET开发人员需要扫描条形码时,ML Kit 的实际路径如下所示:
没有异步/等待的C# API。 ML Kit使用Android的Task API,并结合addOnFailureListener回调。 这些与.NET的await不对应。 任何绑定层都必须适应基于回调的 Android 异步和 .NET 的 TPL——这是一个不平凡的转换,社区绑定对此的处理并不一致。
没有.NET依赖注入集成。 BarcodeScanning.getClient(options)是一个静态工厂调用,返回一个Android BarcodeScanner对象。 没有.NET接口可以注册,没有IServiceCollection.AddBarcodeScanner(),也无法将其注入到ASP.NET Core中间件或Azure Functions中。
不支持ASP.NET Core或 Azure 函数。ML Kit 需要 Android 或 iOS 运行时环境。 它无法在 Linux 上的 Web API 进程、Azure 函数、Windows 服务器或 Docker 容器中运行。 如果您的用例是服务器端条形码处理(接受图像并返回条形码数据的 REST 端点、文档处理管道、批处理作业),则无论绑定是否可用,ML Kit 在架构上都是不兼容的。
仅限摄像头或帧输入 — 没有文件,没有PDF。 ML Kit的ByteBuffer或Android文件系统上的文件URI构建。 没有处理 PDF 文档、迭代页面或处理多页 TIFF 的概念。 服务器端文档处理完全超出了该产品的范围。
Google Play服务依赖(解包模型)。 未捆绑的ML模型变体(com.google.android.gms:play-services-mlkit-barcode-scanning)通过Google Play服务运行。 没有Play服务的设备——自定义Android版本、某些企业设备、Amazon Fire平板电脑——无法使用该变体。 捆绑模型选项(com.google.mlkit:barcode-scanning)无需Play服务但会增加大约2.4 MB的APK大小。
将 Android ML Kit 代码移植到.NET
如果您有一个带有 ML Kit 条形码扫描功能的现有 Android 应用,并且您正在将其移植到.NET MAUI或.NET 9,以下是翻译内容。 Kotlin 代码使用了 ML Kit 的回调模式; C# 代码使用了IronBarcode的同步 API。
// Android Kotlin: ML Kit
val options = BarcodeScannerOptions.Builder()
.setBarcodeFormats(Barcode.FORMAT_QR_CODE, Barcode.FORMAT_CODE_128)
.build()
val scanner = BarcodeScanning.getClient(options)
val inputImage = InputImage.fromFilePath(context, uri)
scanner.process(inputImage)
.addOnSuccessListener { barcodes ->
for (barcode in barcodes) {
val rawValue = barcode.rawValue
val format = barcode.format
}
}
.addOnFailureListener { e -> Log.e("MLKit", e.message ?: "") }
// .NET C#: IronBarcode
// NuGet: dotnet add package BarCode
using IronBarCode;
var results = BarcodeReader.Read("captured-image.jpg");
foreach (var barcode in results)
{
Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}
// .NET C#: IronBarcode
// NuGet: dotnet add package BarCode
using IronBarCode;
var results = BarcodeReader.Read("captured-image.jpg");
foreach (var barcode in results)
{
Console.WriteLine($"{barcode.Format}: {barcode.Value}");
}
Imports IronBarCode
Dim results = BarcodeReader.Read("captured-image.jpg")
For Each barcode In results
Console.WriteLine($"{barcode.Format}: {barcode.Value}")
Next
结构上的差异不仅仅体现在句法上。 ML Kit版本设置一个扫描器对象,构建一个scanner.process(),并注册成功和失败回调。 如果您需要在继续之前获得结果,您必须协调回调执行与您的其他逻辑——通常通过Java中的CountDownLatch或Kotlin中的协程来实现。
IronBarcode的BarcodeReader.Read()同步返回一个结果集合。 你立即迭代它。 没有回调注册,没有线程同步,也不需要单独管理扫描器对象。
对于移植 Android 代码的团队来说,多条形码场景的模式转换如下所示:
// .NET C#:IronBarcode— reading multiple barcodes with options
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};
var results = BarcodeReader.Read("image.jpg", options);
foreach (var barcode in results)
{
Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}");
}
// .NET C#:IronBarcode— reading multiple barcodes with options
using IronBarCode;
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};
var results = BarcodeReader.Read("image.jpg", options);
foreach (var barcode in results)
{
Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}");
}
Imports IronBarCode
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128
}
Dim results = BarcodeReader.Read("image.jpg", options)
For Each barcode In results
Console.WriteLine($"Format: {barcode.Format}, Value: {barcode.Value}")
Next
该ExpectBarcodeTypes标志等同于ML Kit的setBarcodeFormats()。 设置此设置可以缩小搜索范围并提高性能,但与 ML Kit 不同,不设置此设置不会中断读取IronBarcode将尝试所有支持的格式。
格式覆盖率比较
这两款工具都涵盖了主流的 2D 和 1D 格式。 重叠部分相当大。
| 翻译格式 | ML Kit(Android) | IronBarcode |
|---|---|---|
| 二维码 | 是 | 是 |
| EAN-13 | 是 | 是 |
| EAN-8 | 是 | 是 |
| UPC-A | 是 | 是 |
| UPC-E | 是 | 是 |
| 代码 128 | 是 | 是 |
| 代码 39 | 是 | 是 |
| 代码93 | 是 | 是 |
| 科达巴尔 | 是 | 是 |
| 国际电信联盟 | 是 | 是 |
| PDF417 | 是 | 是 |
| 数据矩阵 | 是 | 是 |
| 阿兹特克 | 是 | 是 |
| 代码 11 | 否 | 是 |
| MSI Plessey | 否 | 是 |
| 药典 | 否 | 是 |
| 交错式 2/5 | 通过国际运输论坛 | 是 |
| RSS-14 / GS1 数据条 | 否 | 是 |
| 微型 QR | 否 | 是 |
| MaxiCode | 否 | 是 |
IronBarcode支持50多个符号体系,涵盖读取和生成。 ML Kit 的格式列表固定为 Google 模型自带的格式列表——您无法添加自定义符号系统。
IronBarcode的优势
除了阅读之外, IronBarcode还涵盖了完整的条形码工作流程:
生成。ML Kit 完全没有生成 API——它读取条形码,但不创建条形码。 IronBarcode可将任何受支持的格式生成为 PNG、JPEG、SVG、HTML 或二进制数据。
// Generate a 代码 128 barcode to file
BarcodeWriter.CreateBarcode("SHIP-7834", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// Generate a 代码 128 barcode to file
BarcodeWriter.CreateBarcode("SHIP-7834", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
' Generate a 代码 128 barcode to file
BarcodeWriter.CreateBarcode("SHIP-7834", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
二维码定制。QRCodeWriter支持嵌入徽标、更改颜色和纠错级别——这些功能 ML Kit 不具备,因为 ML Kit 本身并不生成任何内容。
// QR code with embedded logo and custom color
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500)
.AddBrandLogo("company-logo.png")
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue)
.SaveAsPng("product-qr.png");
// QR code with embedded logo and custom color
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500)
.AddBrandLogo("company-logo.png")
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue)
.SaveAsPng("product-qr.png");
' QR code with embedded logo and custom color
QRCodeWriter.CreateQrCode("https://example.com/product/4821", 500) _
.AddBrandLogo("company-logo.png") _
.ChangeBarCodeColor(System.Drawing.Color.DarkBlue) _
.SaveAsPng("product-qr.png")
PDF处理。 BarcodeReader.Read("document.pdf")能够本地读取PDF每一页的条形码。 无需图像提取步骤,无需使用单独的 PDF 库逐页循环——它直接处理 PDF。
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
}
// Read all barcodes from every page of a PDF
var results = BarcodeReader.Read("invoice-batch.pdf");
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
}
Imports System
' Read all barcodes from every page of a PDF
Dim results = BarcodeReader.Read("invoice-batch.pdf")
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}")
Next
IronBarcode支持服务器端和云端运行,可在Windows、Linux、macOS、Docker、Azure Functions和AWS Lambda上运行。 无需谷歌Play服务,没有摄像头,也没有移动运行时环境。
二进制输出。 byte[]—对在不写入磁盘时以HTTP响应返回条形码图像的API非常有用。
// Generate barcode and return as byte array (e.g., in a web API)
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-8821", BarcodeEncoding.QRCode)
.ToPngBinaryData();
// Generate barcode and return as byte array (e.g., in a web API)
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("ORDER-8821", BarcodeEncoding.QRCode)
.ToPngBinaryData();
' Generate barcode and return as byte array (e.g., in a web API)
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("ORDER-8821", BarcodeEncoding.QRCode) _
.ToPngBinaryData()
功能对比
| 特征 | Google ML Kit 条形码 | IronBarcode |
|---|---|---|
| .NET / C# API | 无(无NuGet包) | 是的 — using IronBarCode; |
| NuGet 软件包 | None | BarCode |
| 条形码读取 | 是的(仅限安卓/iOS系统) | 是的(所有平台) |
| 条形码生成 | 否 | 是的(50多种格式) |
| 二维码生成 | 否 | 是 |
| 二维码标志嵌入 | 否 | 是 |
| PDF 输入支持 | 否 | 是的(母语) |
| 文件输入(PNG/JPEG) | 是的(通过 InputImage URI) | 是 |
| 摄像头/帧输入 | 是的(主要用例) | 通过图像文件 |
| 服务器端处理 | 否 | 是 |
| ASP.NET Core支持 | 否 | 是 |
| Azure Functions | 否 | 是 |
| Docker / Linux | 否 | 是 |
| Windows 应用支持 | 否(仅限安卓/iOS系统) | 是 |
| Google Play 服务部门 | 是(非捆绑模型) | 否 |
| Firebase依赖 | 否(自2020年起独立) | 否 |
| 异步/等待C# API | 否 | 同步 |
| 一张图中包含多个条形码 | 是 | 是 |
| 社区.NET绑定 | 社区维护的,不是官方的 | 不适用(原生.NET) |
| 定价 | 免费(设备API) | 749 美元起永久 |
API概念图
由于没有官方的.NET ML Kit API,因此这种映射是概念性的——它显示了每个 ML Kit 操作的意图以及IronBarcode 的等效操作。
| ML Kit(Kotlin/Java 概念) | IronBarcode(.NET C#) |
|---|---|
BarcodeScannerOptions.Builder() |
new BarcodeReaderOptions { } |
.setBarcodeFormats(FORMAT_QR_CODE) |
ExpectBarcodeTypes = BarcodeEncoding.QRCode |
BarcodeScanning.getClient(options) |
静态——无需扫描仪对象 |
InputImage.fromFilePath(context, uri) |
传递给BarcodeReader.Read()的文件路径字符串 |
InputImage.fromBitmap(bitmap, rotation) |
BarcodeReader.Read(stream)或字节数组重载 |
scanner.process(inputImage) |
BarcodeReader.Read(path, options) |
.addOnSuccessListener { barcodes -> } |
返回值Read() — 直接迭代 |
.addOnFailureListener { e -> } |
标准尝试/接球 |
barcode.rawValue |
barcode.Value |
barcode.format |
barcode.Format |
barcode.boundingBox |
结果对象的区域数据 |
Barcode.FORMAT_QR_CODE |
BarcodeEncoding.QRCode |
Barcode.FORMAT_CODE_128 |
BarcodeEncoding.Code128 |
| 无生成 API | BarcodeWriter.CreateBarcode() |
| 无生成 API | QRCodeWriter.CreateQrCode() |
Speed / 模型选择 |
ReadingSpeed.Balanced / .Faster / .Detailed |
何时考虑使用IronBarcode
将 Android 应用移植到.NET MAUI或.NET 9。如果您的 Android 应用使用 ML Kit 进行条形码扫描,并且您正在构建一个.NET等效版本,那么IronBarcode就是自然之选。 概念转换很简单——读取文件,获取结果,迭代值。
服务器端条形码处理。任何涉及扫描条形码的 HTTP 端点、处理上传图像的后台作业或从 PDF 中提取条形码的文档工作流程的场景。 ML Kit 无法参与上述任何活动。
Windows桌面应用程序。Windows平台上的WinForms、WPF或.NET MAUI 。 ML Kit 完全无法在 Windows 系统上运行。
没有Google Play服务的环境。 如果您的Android部署包含没有Google Play服务的设备——企业硬件,自定义AOSP构建,Amazon Fire设备——则无捆绑的ML Kit模型不可用,只有较大捆绑版本可用。 IronBarcode没有这样的依赖项。
生成与读取并存。如果您需要同时生成和读取条形码(例如,打印货运标签和验证扫描结果), IronBarcode可以在同一个库中处理这两项操作。 ML Kit 既不处理数据生成,也不处理服务器端读取。
无论是 Azure 还是 AWS 部署, Azure Functions、Linux 上的 Azure 应用服务、AWS Lambda 都无法托管 ML Kit。 IronBarcode的目标客户都是他们。
授权和定价
Google ML Kit条形码扫描的设备API对于Android和iOS应用是免费的。没有每次扫描费用,也不需要商业许可证。 这种定价模型适合其预期环境——一个通过Maven和CocoaPods分发的本机移动库。
IronBarcode是一个商业性的.NET库,采用永久授权:
-Lite: 749 美元 — 1 位开发者,1 个项目地点 -Plus: 1499 美元——最多可供 3 位开发者使用 Professional: 2,999 美元——最多 10 位开发人员 -无限: 5,999 美元 — 无限开发者
提供免费试用; 试验水印生成了条形码。 对于已经运行服务器基础设施以处理文档的团队来说,许可证成本通常是维护一个非官方ML Kit绑定所需的工程努力的一小部分。
结论
Google ML Kit 条形码扫描是一个精心设计的库,它能够完美地完成其设计目标:在 Android 和 iOS 设备上快速准确地扫描条形码。 与IronBarcode的比较与其说是比较哪个库更好,不如说是比较哪个库能够在你需要的场景下运行。
如果你正在用 Kotlin 为 Android 编写应用程序并使用摄像头进行扫描,那么 ML Kit 是一个绝佳的选择。但如果你正在用 C# 为.NET编写应用程序——无论是 Web API、文档处理服务、Windows 应用程序、云函数还是跨平台的 MAUI 应用——Google ML Kit 都无法满足你的需求。 没有NuGet包,没有 C# API,也没有 Google 支持的在托管代码中使用它的途径。 IronBarcode是一个原生的.NET库,涵盖了.NET支持的所有平台上的读取和生成功能。
常见问题解答
什么是 Google ML Kit 条形码扫描?
Google ML Kit 条形码扫描是一个 .NET 条形码库,用于在 C# 应用程序中生成和读取条形码。它是开发人员在为 .NET 项目选择条形码解决方案时评估的几个备选方案之一。
Google ML Kit 条形码扫描和 IronBarcode 的主要区别是什么?
IronBarcode 使用静态、无状态的 API,无需实例管理,而 Google ML Kit 条形码扫描通常需要在使用前创建和配置实例。IronBarcode 还提供原生 PDF 支持、自动格式检测以及跨所有环境的单密钥许可。
IronBarcode 的授权是否比 Google ML Kit 条形码扫描更容易?
IronBarcode 使用单一许可证密钥,同时涵盖开发和生产部署。与将 SDK 密钥与运行时密钥分开的许可系统相比,这简化了 CI/CD 流水线和 Docker 配置。
IronBarcode 是否支持 Google ML Kit 条形码扫描支持的所有条形码格式?
IronBarcode 支持超过 30 种条码符号体系,包括 QR 码、Code 128、Code 39、DataMatrix、PDF417、Aztec、EAN-13、UPC-A、GS1 等等。格式自动检测功能意味着无需显式枚举格式。
IronBarcode是否支持原生PDF条码读取?
是的。IronBarcode 可以直接从 PDF 文件中读取条形码,使用 `BarcodeReader.Read("document.pdf")` 方法,无需单独的 PDF 渲染库。每页的读取结果包括页码、条形码格式、数值和置信度评分。
与 Google ML Kit 条形码扫描相比,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 安装程序或运行时文件。
与 Google ML Kit 不同,我可以在购买前评估 IronBarcode 吗?
是的。IronBarcode 的试用模式会返回完整的解码条形码值——只有生成的输出图像才会带有水印。您可以在购买前,用自己的文档测试读取准确率。
Google ML Kit 条形码扫描和 IronBarcode 的价格有什么区别?
IronBarcode 的永久单开发者许可证起价为 749 美元,涵盖开发和生产环境。定价详情和批量许可选项请访问 IronBarcode 许可页面。无需单独的运行时许可证。
从 Google ML Kit 条形码扫描迁移到 IronBarcode 是否简单?
从 Google ML Kit 条形码扫描迁移到 IronBarcode 主要涉及将基于实例的 API 调用替换为 IronBarcode 的静态方法、移除许可相关的样板代码以及更新结果属性名称。大多数迁移都是减少代码,而不是增加代码。
IronBarcode 能生成带有 logo 的二维码吗?
是的。`QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")` 可以将品牌图片原生嵌入二维码中,并支持配置纠错功能。此外,它还支持通过 `ChangeBarCodeColor()` 函数创建彩色二维码。

