跳至页脚内容
与其他组件比较

Google ML Kit 条形码扫描与 IronBarcode:C# 条形码库对比

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,依赖于 Firebase。 使用 Swift 或 Objective-C。

没有 dotnet add package google-mlkit-barcode。 没有 using Google.MLKit.BarcodeScanning;。 Google 没有发布 ML Kit 的.NET绑定。

社区维护的 Xamarin 绑定在不同时期都存在,但它们有一个始终存在的问题:ML Kit 频繁更新其 Android 和 iOS SDK,而由个人或小型团队维护的绑定项目往往会在底层 API 发生变化时滞后或完全失效。 截至 2026 年,还没有积极维护的、可用于生产的.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 的实际路径如下所示:

没有 async/await C# API。ML Kit 使用 Android 的 Task API,以及 addOnSuccessListeneraddOnFailureListener 回调函数。 这些与 .NET 的 Task<t>await 不对应。 任何绑定层都必须适应基于回调的 Android 异步和 .NET 的 TPL——这是一个不平凡的转换,社区绑定对此的处理并不一致。

没有 .NET 依赖注入集成。 BarcodeScanning.getClient(options) 是一个静态工厂调用,返回一个 Android BarcodeScanner 对象。 没有 .NET 接口可以注册,没有 IServiceCollection.AddBarcodeScanner(),也无法将其注入到 ASP.NET Core 中间件或Azure 功能中。

不支持ASP.NET Core或 Azure 函数。ML Kit 需要 Android 或 iOS 运行时环境。 它无法在 Linux 上的 Web API 进程、Azure 函数、Windows 服务器或 Docker 容器中运行。 如果您的用例是服务器端条形码处理(接受图像并返回条形码数据的 REST 端点、文档处理管道、批处理作业),则无论绑定是否可用,ML Kit 在架构上都是不兼容的。

仅支持摄像头或帧输入——不支持文件或 PDF。ML Kit 的 InputImage 可由 BitmapByteBuffer 或 Android 文件系统上的文件 URI 构建。 没有处理 PDF 文档、迭代页面或处理多页 TIFF 的概念。 服务器端文档处理完全超出了该产品的范围。

依赖于 Google Play 服务。设备上的机器学习模型通过 Google Play 服务运行。 没有 Google Play 服务的设备(例如定制的 Android 系统、某些Enterprise设备、亚马逊 Fire 平板电脑)无法使用默认的 ML Kit 配置。 "捆绑"模型选项(com.google.mlkit:barcode-scanning-bundled)可以解决这个问题,但会显著增加 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 IronBarcode
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 IronBarcode
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
$vbLabelText   $csharpLabel

结构上的差异不仅仅体现在句法上。 ML Kit 版本设置了一个扫描器对象,构造了一个 InputImage,调用了 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,
    ExpectedBarcodeTypes = 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,
    ExpectedBarcodeTypes = 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,
    .ExpectedBarcodeTypes = 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
$vbLabelText   $csharpLabel

ExpectedBarcodeTypes 标志相当于 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-20240312-7834", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
// Generate a 代码 128 barcode to file
BarcodeWriter.CreateBarcode("SHIP-20240312-7834", BarcodeEncoding.Code128)
    .SaveAsPng("shipping-label.png");
' Generate a 代码 128 barcode to file
BarcodeWriter.CreateBarcode("SHIP-20240312-7834", BarcodeEncoding.Code128) _
    .SaveAsPng("shipping-label.png")
$vbLabelText   $csharpLabel

二维码定制。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")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

IronBarcode支持服务器端和云端运行,可在Windows、Linux、macOS、Docker、Azure Functions和AWS Lambda上运行。 无需谷歌Play服务,没有摄像头,也没有移动运行时环境。

二进制输出。 .ToPngBinaryData() 直接返回 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()
$vbLabelText   $csharpLabel

功能对比

特征 Google ML Kit 条形码 IronBarcode
.NET / C# API 无(无NuGet包) 是的 — using IronBarCode;
NuGet 软件包 IronBarcode
条形码读取 是的(仅限安卓/iOS系统) 是的(所有平台)
条形码生成 是的(50多种格式)
二维码生成
二维码标志嵌入
PDF 输入支持 是的(母语)
文件输入(PNG/JPEG) 是的(通过 InputImage URI)
摄像头/帧输入 是的(主要用例) 通过图像文件
服务器端处理
ASP.NET Core支持
Azure 功能
Docker / Linux
Windows 应用支持 否(仅限安卓/iOS系统)
Google Play 服务部门 是的(标准型号)
Firebase 依赖项(iOS)
Async/await C# API 同步(符合.NET模型)
一张图中包含多个条形码
社区.NET绑定 非官方、不稳定 不适用(原生.NET)
定价 免费(作为 Google Play 的一部分) 749 美元起永久

API概念图

由于没有官方的.NET ML Kit API,因此这种映射是概念性的——它显示了每个 ML Kit 操作的意图以及IronBarcode 的等效操作。

ML Kit(Kotlin/Java 概念) IronBarcode(.NET C#)
BarcodeScannerOptions.Builder() new BarcodeReaderOptions { }
.setBarcodeFormats(FORMAT_QR_CODE) ExpectedBarcodeTypes = 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.BarcodeImage(区域数据)
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 服务的设备(例如Enterprise硬件、自定义 AOSP 版本、Amazon Fire 设备),则标准 ML Kit 模型不可用。 IronBarcode没有这样的依赖项。

生成与读取并存。如果您需要同时生成和读取条形码(例如,打印货运标签和验证扫描结果), IronBarcode可以在同一个库中处理这两项操作。 ML Kit 既不处理数据生成,也不处理服务器端读取。

无论是 Azure 还是 AWS 部署, Azure Functions、Linux 上的 Azure 应用服务、AWS Lambda 都无法托管 ML Kit。 IronBarcode的目标客户都是他们。

授权和定价

Google ML Kit 条形码扫描功能免费提供给 Android 和 iOS 应用使用。无需支付每次扫描费用,也无需商业许可。 这种定价模式在其预期的应用场景中是合理的——原生移动库与 Google Play 服务捆绑在一起。

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()` 函数创建彩色二维码。

Jordi Bardia
软件工程师
Jordi 最擅长 Python、C# 和 C++,当他不在 Iron Software 利用这些技能时,他就在游戏编程。分享产品测试、产品开发和研究的责任,Jordi 在持续的产品改进中增加了巨大的价值。多样的经验使他面临挑战并保持投入,他表示这是在 Iron Software 工作的最喜欢的方面之一。Jordi 在佛罗里达州迈阿密长大,并在佛罗里达大学学习计算机科学和统计学。

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我