IRONSOFTWAREHOME
USING IRONBARCODE

MAUI 条码扫描器与IronBarcode的分步指南

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

移动应用程序越来越依赖条形码扫描来进行库存管理、销售点系统和产品跟踪。 构建一个MAUI条码扫描器可以让您将条码检测直接集成到您的.NET MAUI应用程序中,将相机馈送与图像文件处理结合起来,以检测二维码、数据矩阵和其他条码格式。 尽管许多库专注于相机预览,IronBarcode在准确读取条码方面表现出色,甚至在具有挑战性的条件下——倾斜角度、光线不足和标签损坏的情况下也能在不做额外配置的情况下处理。

本指南将逐步介绍如何使用IronBarcode在.NET MAUI项目中实现条形码扫描。 到最后,您将能够从单个图像文件中扫描多个条形码,从设备摄像头捕获条形码,并自信地将该库集成到您自己的跨平台项目中。

构建 MAUI 条形码扫描器需要哪些先决条件?

开始之前,请确保您的开发环境已准备就绪:

  • 已安装.NET MAUI工作负载的Visual Studio 2022 (版本 17.8 或更高版本)。
  • .NET 10 SDK -- 从.NET官方网站下载 -具备基本的 C# 知识——熟悉 async/await 模式会有帮助
  • 用于相机测试的物理设备或模拟器 IronBarcode许可证——提供免费试用版供评估。

在创建项目之前确保 Visual Studio 已安装 MAUI 工作负载,可以节省后续大量的故障排除时间。 您可以在 Visual Studio 安装程序的"单个组件"下搜索".NET多平台应用程序 UI 开发"来验证这一点。

了解IronBarcode如何融入 MAUI

.NET MAUI为您提供一个可同时面向 Android、iOS、macOS 和 Windows 的代码库。 在这种环境下进行条形码扫描的挑战在于,每个平台处理摄像头访问的方式都不同。 IronBarcode通过在图像处理层面工作来解决这个问题——您通过MAUI的MediaPicker捕获图像,然后将字节交给IronBarcode进行分析。

这种关注点分离的做法可以保持代码简洁,避免使用特定于平台的条形码 SDK。 IronBarcode 的离线处理模型也意味着条形码数据永远不会离开设备,这对于受监管行业的应用来说非常重要。

支持的 BarCode 格式

IronBarcode可读取多种格式,包括:

IronBarcode支持的条码格式
格式类别格式常见用例
一维线性Code 128、Code 39、EAN-13、UPC-A、ITF零售、物流、医疗保健
二维矩阵二维码、数据矩阵、阿兹特克、PDF417移动支付、票务、制造业
邮政美国邮政、英国皇家邮政、德国邮政运输和邮政服务
专业MaxiCode、GS1、MicroPDF417供应链、运输、包裹

如何设置 MAUI 条形码扫描项目?

首先在Visual Studio 2022中创建一个新的.NET MAUI应用项目。将其命名为BarcodeScannerApp并选择.NET 10作为目标框架。 Visual Studio 会生成标准的 MAUI 项目结构,其中包含 Android、iOS、macOS 和 Windows 等平台特定的文件夹。

通过NuGet安装IronBarcode

打开 NuGet 包管理器控制台并运行:

PM > Install-Package BarCode

或者,在解决方案资源管理器中右键单击您的项目,选择"管理NuGet包",搜索IronBarCode,并安装最新的稳定版本。 专门针对.NET MAUI项目,IronBarcode 的NuGet包包含了所有必要的本机依赖项。

激活您的许可证

安装完成后,请在应用程序生命周期的早期阶段使用您的许可证密钥激活IronBarcode 。 最佳位置是在应用构建器运行之前的MauiProgram.cs中:

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";

从Iron Software网站获取免费试用许可证密钥。试用密钥允许您在开发期间评估所有功能,尽管输出可能会包含试用水印,直到您应用完整许可证。

如何配置安卓和iOS系统的相机权限?

特定平台的相机权限对于条码扫描功能至关重要。 每个平台都需要在其清单文件中进行特定配置,才能使MediaPicker.CapturePhotoAsync()成功。

Android权限

编辑Platforms/Android/AndroidManifest.xml以声明相机访问权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.camera.autofocus" />
XML

android.permission.CAMERA条目请求用户的运行时权限。 uses-feature声明告知Google Play商店您的应用需要相机硬件和自动对焦功能。 如果没有这些,Android 设备可能会授予权限请求,但仍然会在内部阻止相机访问。

对于Android 13及更高版本(API级别33+),您还可能需要在您的ActivityCompat.RequestPermissions处理细化的媒体权限。 MAUI MediaPicker抽象自动处理大多数问题,但推荐在发布前进行物理设备测试。

iOS权限

修改Platforms/iOS/Info.plist以包含相机使用描述:

<key>NSCameraUsageDescription</key>
<string>This app requires camera access to scan barcodes</string>
XML

iOS 要求对每一项涉及隐私的权限都提供易于理解的解释。 如果缺少此描述或描述含糊不清,苹果应用商店的审核流程将拒绝您的应用。 该文本出现在应用程序首次请求访问相机时向用户显示的系统权限对话框中。

对于iPadOS,如果您计划让用户从保存的照片以及实时相机扫描条形码,也可以考虑添加NSPhotoLibraryUsageDescription

Windows 和 macOS

对于 Windows Desktop 和 macOS 目标平台,相机访问权限分别通过应用程序清单文件和授权文件进行管理。 MAUI框架在模板级别处理大多数问题,但请确认在Windows上的Package.appxmanifest包含网络摄像头设备功能。

如何创建条形码扫描器界面?

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="BarcodeScannerApp.MainPage"
             Title="Barcode Scanner">
    <VerticalStackLayout Padding="20" Spacing="20">
        <Label Text="Point the camera at a barcode"
               FontSize="16"
               HorizontalOptions="Center"
               TextColor="#555555" />
        <Image x:Name="CapturedImage"
               HeightRequest="300"
               Aspect="AspectFit"
               BackgroundColor="#F0F0F0" />
        <Label x:Name="ResultLabel"
               Text="Tap Scan to begin"
               FontSize="18"
               HorizontalOptions="Center"
               FontAttributes="Bold" />
        <Label x:Name="FormatLabel"
               Text=""
               FontSize="13"
               HorizontalOptions="Center"
               TextColor="#888888" />
        <Button Text="Scan Barcode"
                Clicked="OnScanClicked"
                BackgroundColor="#007ACC"
                TextColor="White"
                CornerRadius="8"
                HeightRequest="50" />
        <Button Text="Load from Gallery"
                Clicked="OnPickFromGalleryClicked"
                BackgroundColor="#5C5C5C"
                TextColor="White"
                CornerRadius="8"
                HeightRequest="50" />
    </VerticalStackLayout>
</ContentPage>
XML

该布局提供了两种扫描路径:使用相机拍摄新照片和从图库中选择现有图像。 对于用户预先拍摄条形码或通过电子邮件接收图像的工作流程来说,这一点很重要。 FormatLabel显示检测到的条形码格式与解码值,有助于调试和用户验证。

添加扫描状态反馈

为了获得更精美的体验,考虑将扫描按钮包装在ActivityIndicator中,在处理过程中显示。 IronBarcode的异步API使这很简单——您可以在调用finally块中重置它。

如何实现条形码阅读器功能?

MainPage.xaml.cs中实现核心扫描逻辑。 以下代码同时处理相机拍摄和图库选择,并具有适当的异步模式和错误处理:

using IronBarCode;
using IronSoftware.Drawing;

namespace BarcodeScannerApp;

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

    private async void OnScanClicked(object sender, EventArgs e)
    {
        await ScanFromSource(() => MediaPicker.Default.CapturePhotoAsync());
    }

    private async void OnPickFromGalleryClicked(object sender, EventArgs e)
    {
        await ScanFromSource(() => MediaPicker.Default.PickPhotoAsync());
    }

    private async Task ScanFromSource(Func<Task<FileResult?>> sourceFunc)
    {
        try
        {
            var photo = await sourceFunc();
            if (photo is null) return;

            using var stream = await photo.OpenReadAsync();
            using var memoryStream = new MemoryStream();
            await stream.CopyToAsync(memoryStream);
            var imageBytes = memoryStream.ToArray();

            // Show the captured image in the UI
            CapturedImage.Source = ImageSource.FromStream(() =>
                new MemoryStream(imageBytes));

            // Process with IronBarcode
            var bitmap = AnyBitmap.FromBytes(imageBytes);
            var options = new BarcodeReaderOptions
            {
                Speed = ReadingSpeed.Balanced,
                ExpectMultipleBarcodes = false
            };

            var results = await BarcodeReader.ReadAsync(bitmap, options);

            if (results.Any())
            {
                var first = results.First();
                ResultLabel.Text = $"Value: {first.Value}";
                FormatLabel.Text = $"Format: {first.BarcodeType}";
            }
            else
            {
                ResultLabel.Text = "No barcode detected";
                FormatLabel.Text = string.Empty;
            }
        }
        catch (FeatureNotSupportedException)
        {
            await DisplayAlert("Unsupported",
                "Camera is not available on this device.", "OK");
        }
        catch (PermissionException)
        {
            await DisplayAlert("Permission Required",
                "Please grant camera permission in Settings.", "OK");
        }
        catch (Exception ex)
        {
            await DisplayAlert("Error",
                $"Scanning failed: {ex.Message}", "OK");
        }
    }
}

此实现使用共享ScanFromSource助手方法,以避免在相机和图库路径之间重复图像处理逻辑。 AnyBitmap.FromBytes方法自动处理JPEG、PNG、WebP和其他常见图像格式——无需手动检测格式。

结果对象公开了first.BarcodeImage(检测到的条形码区域的裁剪图像)以及其他属性。 请参阅BarcodeResult 类文档以获取完整列表。

测试您的扫描实施

代码编写完成后,就可以使用标准条形码进行测试了:

如何用IronBarcode创建MAUI条码扫描器:图2 - 输入测试条码

扫描后,解码值将显示在屏幕上:

如何用IronBarcode创建MAUI条码扫描器:图3 - 扫描条码值

如何配置高级扫描选项?

IronBarcode公开了一个BarcodeReaderOptions对象,可以让您针对特定使用案例微调检测行为。 了解这些选项有助于您根据应用程序的需求,在速度和准确性之间取得平衡。

针对特定条形码类型

指定所需的条形码类型可以显著缩短处理时间,因为IronBarcode会跳过不需要的格式检查:

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};

var results = await BarcodeReader.ReadAsync(bitmap, options);

如何用IronBarcode创建MAUI条码扫描器:图4 - 从同一图像扫描多个代码

设置ExpectMultipleBarcodes = true指示IronBarcode在找到第一个结果后继续扫描,这对于一个包单可能包含多个条码的仓库工作流至关重要。

阅读速度选项

QuickScan。 对于条形码清晰且光线充足的高容量场景,使用QuickScan。 在低分辨率相机拍摄或标签部分损坏的情况下,切换到ExtremeDetail

有关调整 BarcodeReaderOptions 的更多信息,包括图像校正滤波器和置信度阈值,文档提供了详细的示例。

图像校正和预处理

IronBarcode内置图像校正功能,可自动处理旋转、倾斜或光线不足的条形码。 您还可以通过BarcodeReaderOptions.ImageFilters手动应用预处理滤镜:

var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Detailed,
    ImageFilters = new ImageFilterCollection
    {
        new SharpenFilter(),
        new ContrastFilter(1.2f)
    }
};

当应用程序面向摄像头传感器质量较低的旧款 Android 设备,或者用户可能在仓库或户外环境等光线条件欠佳的情况下拍摄条形码时,预处理滤镜尤其有用。

如何处理常见的故障排除场景?

即使使用配置良好的 MAUI 条形码扫描器,也可能出现因设备特定行为、图像质量问题或平台限制而导致的问题。

相机无法打开

如果相机无法启动,请验证在Info.plist中正确声明了权限。 然后从全新构建版本重新部署应用程序,而不是进行热重载。 在 Android 系统上,还要检查您的测试设备是否使用非标准相机配置——某些具有多个摄像头的设备需要明确选择镜头。

在模拟器上,MediaPicker.CapturePhotoAsync()不受支持。 始终在物理设备上测试相机功能。模拟器确实支持PickPhotoAsync用于画廊选择,您可以用预加载图像进行基本的UI测试。

扫描准确率差

如果IronBarcode没有返回任何结果或返回错误值,请尝试以下调整:

  • ExtremeDetail
  • ContrastFilter添加到图像滤镜管道中
  • 确保采集图像的分辨率至少为 720p;分辨率过低会导致数据矩阵等高密度格式的数据检测出现漏检。
  • 检查条形码类型是否包含在您的ExpectBarcodeTypes遮罩中

IronBarcode故障排除指南涵盖了针对特定格式问题的额外诊断步骤。

内存管理

加载到MemoryStream中的大型摄像机图像消耗大量内存。 始终对所有流对象使用using语句以确保释放。 对于用户连续扫描多个项目的连续扫描工作流程,在处理后明确调用bitmap.Dispose()而不是等待垃圾收集器。

对于堆空间有限的 Android 设备,如果扫描的是清晰、高对比度的条形码,不需要全分辨率即可准确解码,则应考虑在将图像传递给IronBarcode之前对其进行降采样。

平台特定的 iOS 行为

在 iOS 系统中,当你的应用首次请求相机权限时,系统会显示一次性对话框。 如果用户拒绝,后续调用PermissionException。 通过将用户引导到设置来处理这种情况,您可以通过AppInfo.ShowSettingsUI()做到这一点。

在提交到App Store之前,确认Info.plist中。 缺少隐私字符串会导致系统自动拒绝审核,审核团队不会给出详细解释。 请查阅Apple 人机交互指南,了解有关相机访问权限的最佳实践,包括权限请求的时机和消息传递方式。

下一步计划是什么?

现在您已经拥有一个可正常运行的 MAUI 条形码扫描器和IronBarcode,根据您的应用程序需求,有几种方法可供选择:

-生成条形码-- IronBarcode包含一个条形码生成 API ,可根据字符串数据创建二维码、Code 128 标签和其他格式的条形码。

  • 批量扫描——使用ExpectMultipleBarcodes = true在循环中处理多个图像文件; 参见批量扫描示例
  • PDF条码提取——IronBarcode可以使用相同的BarcodeReader类读取嵌入在PDF文档中的条码; 查阅PDF 条形码读取文档 -样式和品牌——使用颜色、徽标和注释自定义生成的条形码的视觉输出; 查看条形码样式选项
  • 其他Iron Software产品 -- 如果您的MAUI应用程序还需要PDF生成、OCR或电子表格支持,请探索完整的Iron Suite以实现一致的跨平台功能

首先申请免费试用许可证,在评估期内可以不受限制地进行部署。 有关生产许可选项和批量定价,请访问IronBarcode定价页面IronBarcode文档门户IronBarcode GitHub存储库提供了更多代码示例和社区支持。

Curtis Chau
技术作家

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

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户