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}");
}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}");
}
该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");
二维码定制。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")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}");
}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}")
NextIronBarcode**支持服务器端和云端运行,**可在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)
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支持的所有平台上的读取和生成功能。

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