跳至页脚内容
USING IRONBARCODE

如何构建.NET MAUI条形码扫描器 SDK 应用程序

.NET MAUI实现了以单一代码库同时面向 Android、iOS 和 Windows 的承诺。 真正的挑战在于如何集成条形码扫描等原生硬件功能。 手动桥接相机 API 意味着需要进行平台特定的配置、条件编译指令,以及花费数小时进行调试。 还有一条更快捷的路。

本教程将向您展示如何使用IronBarcode在.NET MAUI中构建一个可工作的跨平台条形码扫描器。 您将设置项目、配置平台权限、扫描图像文件中的条形码、读取 PDF 文档中的条形码,并使用扫描选项处理多种条形码——所有这些都可以通过您可以在任何受支持的目标上运行的代码完成。

开始免费试用,并按照以下步骤操作。

NuGet 使用 NuGet 安装

PM >  Install-Package BarCode

IronBarcode 上查看 NuGet 快速安装。超过 1000 万次下载,它正以 C# 改变 PDF 开发。 您也可以下载 DLL

如何在 .NET MAUI 中设置条码扫描器 SDK?

设置 .NET MAUI BarCode 扫描仪 SDK 需要创建一个新项目、安装 NuGet 软件包并配置平台权限。 在 Visual Studio 中,整个配置过程只需几分钟。

创建 .NET MAUI 项目

打开 Visual Studio,创建一个新的 .NET MAUI App 项目。 将项目命名为类似"条形码扫描器"这样的描述性名称,并选择.NET 8 或更高版本作为目标框架。 Visual Studio 会生成默认项目结构,其中包含 Android 和 iOS 平台特定的文件夹。

如果您面向的是.NET 10,则相同的项目模板也适用。 更新 <TargetFrameworks> 文件中的 .csproj 属性,根据需要包含 net10.0-iosnet10.0-windows10.0.19041.0。 有关目标框架名称和最低操作系统版本要求的完整列表,请参阅.NET MAUI支持的平台文档

安装 IronBarcode

使用程序包管理器控制台安装IronBarcode NuGet程序包

Install-Package BarCode

此命令下载并安装条形码扫描器 SDK 以及.NET MAUI应用程序所需的所有依赖项。

配置平台权限

即使扫描的是图像文件而不是实时摄像头画面,为.NET MAUI条形码扫描器应用程序配置以下权限也是很好的做法。

对于 Android 系统,请将以下内容添加到 Platforms/Android/AndroidManifest.xml

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.CAMERA" />
XML

对于 iOS,请将以下条目添加到 Platforms/iOS/Info.plist

<key>NSPhotoLibraryUsageDescription</key>
<string>Access needed to select barcode images for scanning.</string>
<key>NSCameraUsageDescription</key>
<string>Camera permission for barcode scanning.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>Access needed to select barcode images for scanning.</string>
<key>NSCameraUsageDescription</key>
<string>Camera permission for barcode scanning.</string>
XML

初始化 SDK.

在应用程序生命周期的早期阶段设置您的许可证密钥,以确保在进行任何扫描调用之前IronBarcode已完全激活。 请将激活信息放在 MauiProgram.cs:

using IronBarCode;

var builder = MauiApp.CreateBuilder();
builder
    .UseMauiApp<App>()
    .ConfigureFonts(fonts =>
    {
        fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
    });

// Activate IronBarcode before the app starts
License.LicenseKey = "YOUR_LICENSE_KEY_HERE";

return builder.Build();
using IronBarCode;

var builder = MauiApp.CreateBuilder();
builder
    .UseMauiApp<App>()
    .ConfigureFonts(fonts =>
    {
        fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
    });

// Activate IronBarcode before the app starts
License.LicenseKey = "YOUR_LICENSE_KEY_HERE";

return builder.Build();
$vbLabelText   $csharpLabel

IronBarcode提供免费试用许可证,供开发和测试使用。 在启动时设置一次密钥;同一进程内对 BarcodeReaderBarcodeWriter 的所有后续调用均使用已激活的许可证。

如何从图像文件中读取条形码?

MAUI条码扫描器的核心功能是读取选定图像中的条码。 BarcodeReader.Read() 方法接受一个文件路径,并返回一个 BarcodeResult 对象集合,每个检测到的条形码对应一个对象。

设计用户界面

MainPage.xaml 中创建一个简洁的界面,允许用户选择图像文件并查看扫描的条形码数据:

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="BarcodeScanner.MainPage">
    <VerticalStackLayout Padding="20" Spacing="15">
        <Label Text=".NET MAUI Barcode Scanner" FontSize="24" HorizontalOptions="Center"/>
        <Button Text="Select Image to Scan" Clicked="OnSelectImageClicked"/>
        <Image x:Name="SelectedImageView" HeightRequest="200"/>
        <Label x:Name="ResultLabel" FontSize="16"/>
    </VerticalStackLayout>
</ContentPage>
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="BarcodeScanner.MainPage">
    <VerticalStackLayout Padding="20" Spacing="15">
        <Label Text=".NET MAUI Barcode Scanner" FontSize="24" HorizontalOptions="Center"/>
        <Button Text="Select Image to Scan" Clicked="OnSelectImageClicked"/>
        <Image x:Name="SelectedImageView" HeightRequest="200"/>
        <Label x:Name="ResultLabel" FontSize="16"/>
    </VerticalStackLayout>
</ContentPage>
XML

实施条形码扫描

将扫描逻辑添加到 MainPage.xaml.cs。 这段代码通过 MAUI FilePicker API 处理图像选择,并将所选文件路径传递给IronBarcode:

using IronBarCode;

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private async void OnSelectImageClicked(object sender, EventArgs e)
    {
        var result = await FilePicker.PickAsync(new PickOptions
        {
            FileTypes = FilePickerFileType.Images,
            PickerTitle = "Select a barcode image"
        });

        if (result != null)
        {
            // Display the selected image
            SelectedImageView.Source = ImageSource.FromFile(result.FullPath);

            // Read barcodes from the image file
            var barcodes = BarcodeReader.Read(result.FullPath);

            ResultLabel.Text = barcodes.Any()
                ? $"Found: {barcodes.First().Value}"
                : "No barcodes detected in selected image.";
        }
    }
}
using IronBarCode;

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
    }

    private async void OnSelectImageClicked(object sender, EventArgs e)
    {
        var result = await FilePicker.PickAsync(new PickOptions
        {
            FileTypes = FilePickerFileType.Images,
            PickerTitle = "Select a barcode image"
        });

        if (result != null)
        {
            // Display the selected image
            SelectedImageView.Source = ImageSource.FromFile(result.FullPath);

            // Read barcodes from the image file
            var barcodes = BarcodeReader.Read(result.FullPath);

            ResultLabel.Text = barcodes.Any()
                ? $"Found: {barcodes.First().Value}"
                : "No barcodes detected in selected image.";
        }
    }
}
$vbLabelText   $csharpLabel

输出

 .NET MAUI条形码扫描器 SDK:几分钟内构建跨平台扫描器:图 1 - 扫描的条形码输出

BarcodeReader.Read() 方法分析选定的图像并返回所有检测到的条形码。 IronBarcode可自动识别多种条形码符号,包括 QR 码、Code 128、Code 39、EAN-13 和许多其他支持的格式。 结果集合公开了诸如 PageNumber 之类的属性,以及每个检测到的代码的边界框坐标。

如何扫描 PDF 文档中的 BarCode?

IronBarcode与其他许多同类产品的一个显著区别在于,它可以直接从 PDF 文件中读取条形码。 对于处理文档工作流程的.NET MAUI应用程序来说,这一点至关重要——发货清单、采购订单、医疗记录和类似用例都依赖于嵌入 PDF 的条形码。

BarcodeReader.ReadPdf() 方法接受一个文件路径,并返回与图像读取器相同的 BarcodeResult 集合,但增加了一个 PageNumber 属性,用于标识每个条形码来自哪个 PDF 页面:

using IronBarCode;

private async void OnSelectPdfClicked(object sender, EventArgs e)
{
    var result = await FilePicker.PickAsync(new PickOptions
    {
        PickerTitle = "Select a PDF with barcodes"
    });

    if (result != null)
    {
        // Read barcodes from every page of the PDF
        var barcodes = BarcodeReader.ReadPdf(result.FullPath);

        var output = string.Join("\n", barcodes.Select(b =>
            $"Page {b.PageNumber}: [{b.BarcodeType}] {b.Value}"));

        await DisplayAlert("Scan Results", output.Length > 0 ? output : "No barcodes found.", "OK");
    }
}
using IronBarCode;

private async void OnSelectPdfClicked(object sender, EventArgs e)
{
    var result = await FilePicker.PickAsync(new PickOptions
    {
        PickerTitle = "Select a PDF with barcodes"
    });

    if (result != null)
    {
        // Read barcodes from every page of the PDF
        var barcodes = BarcodeReader.ReadPdf(result.FullPath);

        var output = string.Join("\n", barcodes.Select(b =>
            $"Page {b.PageNumber}: [{b.BarcodeType}] {b.Value}"));

        await DisplayAlert("Scan Results", output.Length > 0 ? output : "No barcodes found.", "OK");
    }
}
$vbLabelText   $csharpLabel

输出

 .NET MAUI条形码扫描器 SDK:几分钟内构建跨平台扫描器:图 2 - 扫描包含二维码的 PDF 文件的输出结果

ReadPdf() 方法扫描 PDF 的所有页面,并返回条形码数据以及页码,从而可以轻松处理包含多个条形码的文档。 如果 PDF 文件跨越数十页,请考虑传递一个 BarcodeReaderOptions 对象,并将 PageNumbers 设置为特定范围,以将扫描限制在相关页面,从而减少处理时间。

如何处理多个 BarCode 和 QR 码?

生产应用经常需要从单个图像中检测多个条形码,或者按条形码类型筛选结果。 BarcodeReaderOptions 类公开了控制检测行为的配置属性。 将 ExpectMultipleBarcodes 设置为 true 会告诉读取器在第一次匹配后继续扫描,而不是提前停止:

using IronBarCode;

// Configure the reader for multi-barcode detection with type filtering
var options = new BarcodeReaderOptions
{
    ExpectMultipleBarcodes = true,
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
    Speed = ReadingSpeed.Balanced
};

var barcodes = BarcodeReader.Read(imagePath, options);

foreach (var barcode in barcodes)
{
    Console.WriteLine($"Type: {barcode.BarcodeType}, Value: {barcode.Value}");
}
using IronBarCode;

// Configure the reader for multi-barcode detection with type filtering
var options = new BarcodeReaderOptions
{
    ExpectMultipleBarcodes = true,
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128,
    Speed = ReadingSpeed.Balanced
};

var barcodes = BarcodeReader.Read(imagePath, options);

foreach (var barcode in barcodes)
{
    Console.WriteLine($"Type: {barcode.BarcodeType}, Value: {barcode.Value}");
}
$vbLabelText   $csharpLabel

Speed 属性控制扫描时间和准确性之间的权衡。 ReadingSpeed.Faster 优先考虑吞吐量,适合批量扫描高质量图像的应用。ReadingSpeed.ExtraSlow 则针对对比度低、角度倾斜或部分遮挡的复杂输入,应用更积极的图像校正。 ReadingSpeed.Balanced 是大多数应用程序的正确起点。

BarcodeEncoding 枚举支持位组合,因此您可以将扫描限制为与用例相关的符号体系,而不会因不必要的检查而降低性能。

如何从内存流中读取条形码?

文件路径在大多数情况下都能很好地工作,但某些.NET MAUI工作流会通过内存传递图像数据——从相机预览捕获的帧、从 REST API 下载的字节或进程内生成的图像数据。 IronBarcode支持在 BarcodeReader.Read() 重载中直接输入 System.IO.Stream

using IronBarCode;
using System.IO;

// Read a barcode from a MemoryStream (e.g., an in-memory image buffer)
private BarcodeResult[] ReadFromStream(Stream imageStream)
{
    return BarcodeReader.Read(imageStream);
}

// Example: download an image and scan without writing to disk
private async Task<string> ScanDownloadedBarcode(string imageUrl)
{
    using var httpClient = new HttpClient();
    using var stream = await httpClient.GetStreamAsync(imageUrl);
    using var memoryStream = new MemoryStream();

    await stream.CopyToAsync(memoryStream);
    memoryStream.Position = 0;

    var barcodes = BarcodeReader.Read(memoryStream);
    return barcodes.Any() ? barcodes.First().Value : string.Empty;
}
using IronBarCode;
using System.IO;

// Read a barcode from a MemoryStream (e.g., an in-memory image buffer)
private BarcodeResult[] ReadFromStream(Stream imageStream)
{
    return BarcodeReader.Read(imageStream);
}

// Example: download an image and scan without writing to disk
private async Task<string> ScanDownloadedBarcode(string imageUrl)
{
    using var httpClient = new HttpClient();
    using var stream = await httpClient.GetStreamAsync(imageUrl);
    using var memoryStream = new MemoryStream();

    await stream.CopyToAsync(memoryStream);
    memoryStream.Position = 0;

    var barcodes = BarcodeReader.Read(memoryStream);
    return barcodes.Any() ? barcodes.First().Value : string.Empty;
}
$vbLabelText   $csharpLabel

流重载接受任何 Stream 子类,包括 FileStream 和网络流。 该库内部会处理格式检测,因此在调用之前无需指定图像类型。

如何在MAUI应用程序中生成条形码?

IronBarcode既能生成条形码,也能读取条形码。 BarcodeWriter 类生成条形码,作为图像文件、Bitmap 对象或 Stream 实例,您可以在 MAUI 视图中内联显示这些条形码。 这对于需要打印或共享条形码以及具备扫描功能的库存管理应用程序非常有用:

using IronBarCode;

// Generate a QR code and display it in a MAUI Image control
private async void OnGenerateQrClicked(object sender, EventArgs e)
{
    // Create a QR code barcode
    var qrCode = QRCodeWriter.CreateQrCode(
        value: "https://ironsoftware.com/csharp/barcode/",
        qrCodeSize: 500,
        errorCorrection: QRCodeWriter.QrErrorCorrectionLevel.Medium
    );

    // Save to a temporary file and display
    var tempPath = Path.Combine(FileSystem.CacheDirectory, "generated-qr.png");
    qrCode.SaveAsPng(tempPath);

    GeneratedImageView.Source = ImageSource.FromFile(tempPath);
}
using IronBarCode;

// Generate a QR code and display it in a MAUI Image control
private async void OnGenerateQrClicked(object sender, EventArgs e)
{
    // Create a QR code barcode
    var qrCode = QRCodeWriter.CreateQrCode(
        value: "https://ironsoftware.com/csharp/barcode/",
        qrCodeSize: 500,
        errorCorrection: QRCodeWriter.QrErrorCorrectionLevel.Medium
    );

    // Save to a temporary file and display
    var tempPath = Path.Combine(FileSystem.CacheDirectory, "generated-qr.png");
    qrCode.SaveAsPng(tempPath);

    GeneratedImageView.Source = ImageSource.FromFile(tempPath);
}
$vbLabelText   $csharpLabel

QRCodeWriter 类支持所有四个 QR 纠错级别(低、中、四分位、高)、自定义尺寸和样式选项,包括前景色/背景色控制。 对于非 QR 码符号,请使用 BarcodeWriter.CreateBarcode() 和相应的 BarcodeEncoding 值。 条形码生成 API 参考文档记录了所有支持的输出格式。

该条码扫描器库的主要功能有哪些?

IronBarcode为.NET MAUI条码扫描项目提供了几个优势,使其区别于 ZXing .NET.MAUI 等开源替代方案:

IronBarcode为.NET MAUI开发提供的功能
能力细节
跨平台支持通过单个NuGet包即可支持 Android、iOS 和 Windows 平台
多个输入源从文件路径、内存流和 PDF 文档进行扫描
格式覆盖可解码 30 多种一维和二维条码,包括 QR 码、Data Matrix 码和 PDF417 码。
条形码生成生成 PNG、位图或流输出格式的二维码和一维条形码
图像校正自动处理旋转、倾斜和低对比度的输入图像
无需原生 SDK 依赖纯.NET库,无需任何平台特定的原生绑定

在.NET MAUI项目中,"不依赖原生 SDK"这一点很重要,因为特定于平台的原生库需要为每个目标单独进行链接步骤。 IronBarcode完全避免了这种复杂性,这意味着同一个NuGet参考可以生成适用于所有三个受支持平台的可用二进制文件,而无需额外的配置。

有关支持的条形码格式的完整列表,请参阅IronBarcode支持的格式文档。 有关生产部署的定价和许可条款,请查看IronBarcode许可页面

生产中条形码扫描的最佳实践是什么?

将条形码扫描器部署到生产环境中,除了基本的读取调用之外,还需要注意一些其他方面。 以下指南针对.NET MAUI条形码应用程序中最常见的故障点。

选择合适的读取速度。 ReadingSpeed.Balanced 可以正确处理大多数实际图像。 预留 ReadingSpeed.ExtraSlow 用于扫描用户无法重新捕获的打印文档或图像。 对于大批量工作流程,请避免使用 ReadingSpeed.ExtraSlow,因为每次扫描所需时间都会大大延长。

按预期类型筛选。如果应用程序仅处理二维码,请设置 ExpectBarcodeTypes = BarcodeEncoding.QRCode。 限制搜索空间可以减少处理时间,并消除背景图形中存在的其他符号体系造成的误报。

仅在需要时使用 ExpectMultipleBarcodes将其设置为 true 始终会导致读取器执行额外的扫描操作。 对于单个条形码输入,保留默认值(false),以便扫描在找到第一个有效代码后立即返回。

优雅地处理空结果。当未检测到条形码时,BarcodeReader.Read() 返回一个空数组,而不是抛出异常。 在访问 First() 之前,请检查 .Any(),并向用户显示明确的消息。 带有指导的重试提示("确保条形码光线充足且居中")比通用错误提示更能改善用户体验。

缓存选项对象。每次扫描都创建一个 BarcodeReaderOptions 实例会增加内存分配。 在类级别构建一次选项,并在多个调用中重复使用。

有关诊断扫描故障和优化性能的更多指导,请参阅IronBarcode故障排除指南条形码阅读器教程

下一步计划是什么?

使用IronBarcode构建.NET MAUI条形码扫描器需要安装一个NuGet包,配置平台权限,然后使用文件路径或流调用 BarcodeReader.Read()。 同一个 API 可以同时支持 Android、iOS 和 Windows 系统,没有针对特定平台的代码分支。

要进一步扩展应用程序的功能,请参考以下资源:

IronBarcode完整功能列表——所有扫描和生成功能的目录 条形码读取器 API 参考-- 完整的方法和属性文档 MAUI条形码阅读器分步教程——涵盖摄像头集成的详细讲解 MAUI 文档扫描仪指南——文档扫描用例

立即开始免费试用,获取开发许可证密钥,或了解生产部署的许可选项

常见问题解答

.NET MAUI是什么?为什么条形码扫描的集成如此困难?

.NET MAUI是一个跨平台 UI 框架,它使用同一套代码库即可支持 Android、iOS 和 Windows 平台。条形码扫描是一项挑战,因为每个平台提供的摄像头和存储 API 都不同。IronBarcode 提供了一个统一的IronBarcode API ,可以自动处理平台差异。

IronBarcode在.NET MAUI应用中支持哪些条形码格式?

IronBarcode支持超过 30 种条码符号体系,包括 QR 码、Code 128、Code 39、EAN-13、EAN-8、UPC-A、UPC-E、Data Matrix、PDF417、Aztec 和 ITF。您可以使用 BarcodeEncoding 枚举按特定格式进行筛选。

IronBarcode能否在.NET MAUI应用程序中读取 PDF 文件中的条形码?

是的。BarcodeReader.ReadPdf() 方法会扫描 PDF 文档的所有页面,并返回一个 BarcodeResult 集合。每个结果都包含条形码值、类型和页码。

IronBarcode是否适用于所有.NET MAUI目标平台?

IronBarcode使用单个NuGet包,即可在.NET MAUI项目中支持 Android、iOS 和 Windows 目标平台。无需特定于平台的原生 SDK 绑定。

如何从一张图片中扫描多个条形码?

在 BarcodeReaderOptions 中设置 ExpectMultipleBarcodes = true,并将选项对象传递给 BarcodeReader.Read()。读取器将进行额外的扫描以检测图像中的所有条形码。

ReadingSpeed.Faster 和 ReadingSpeed.ExtraSlow 有什么区别?

ReadingSpeed.Faster 优先考虑吞吐量,适用于高质量图像。ReadingSpeed.ExtraSlow 则应用更严格的图像校正,适用于对比度低、旋转或部分遮挡的条形码等具有挑战性的输入图像。

IronBarcode能否从 MemoryStream 中读取条形码?

是的。BarcodeReader.Read() 接受一个 System.IO.Stream 参数,其中包括 MemoryStream、FileStream 和网络流。这使得无需写入磁盘即可扫描内存中的图像数据。

如何在.NET MAUI应用程序中使用IronBarcode生成二​​维码?

使用 QRCodeWriter.CreateQrCode() 并指定目标值、尺寸和纠错级别,创建二维码。使用 SaveAsPng() 将结果保存为 PNG 文件,然后使用 ImageSource.FromFile() 将其显示在 MAUI Image 控件中。

在.NET MAUI Android应用中进行条形码扫描需要哪些权限?

在 AndroidManifest.xml 中添加 android.permission.READ_EXTERNAL_STORAGE 和 android.permission.CAMERA 权限。对于 iOS,在 Info.plist 中添加 NSPhotoLibraryUsageDescription 和 NSCameraUsageDescription 键。

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

钢铁支援团队

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