IRONSOFTWAREHOME
IRONBARCODEの使用

MAUI バーコードスキャナー(IronBarcode搭載): ステップバイステップガイド

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

モバイルアプリケーションは、在庫管理、POSシステム、製品追跡において、バーコードスキャンへの依存度を高めている。 .NET MAUIアプリケーションにバーコード検出を統合し、カメラフィードと画像ファイル処理を組み合わせてQRコード、データマトリックス、その他のバーコードフォーマットを検出するMAUIバーコードスキャナーを構築します。 多くのライブラリがカメラプレビューに注力している中、IronBarcodeは、困難な状況においても正確にバーコードを読み取ることに優れています -- 傾斜した角度や不十分な照明、損傷したラベルでも追加設定なしで対応できます。

このガイドでは、 IronBarcodeを使用して.NET MAUIプロジェクトにバーコード スキャンを実装するすべての手順を説明します。 最終的には、1つの画像ファイルから複数のバーコードをスキャンしたり、デバイスのカメラからバーコードをキャプチャしたり、ライブラリを自信を持って独自のクロスプラットフォームプロジェクトに統合したりできるようになります。

MAUIバーコードスキャナーを構築するための前提条件は何ですか?

始める前に、開発環境が整っていることを確認してください。

  • .NET MAUIワークロードがインストールされたVisual Studio 2022 (v17.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のオフライン処理モデルは、バーコードデータがデバイスから外部に持ち出されないことを意味し、規制対象業界のアプリケーションにとって重要な意味を持つ。

サポートされているバーコードフォーマット

IronBarcodeは、以下を含む幅広いフォーマットを読み取ります。

IronBarcodeがサポートするバーコード形式
フォーマットカテゴリフォーマット一般的な使用例
1D線形コード128、コード39、EAN-13、UPC-A、ITF小売、物流、ヘルスケア
2次元行列QRコード、データマトリックス、アステカ文字、PDF417モバイル決済、チケット販売、製造業
郵便USPS、ロイヤルメール、ドイツポスト配送および郵便サービス
専門MaxiCode、GS1、MicroPDF417サプライチェーン、輸送、小包

MAUIバーコードスキャンプロジェクトの設定方法を教えてください

Visual Studio 2022で新しい.NET MAUIアプリプロジェクトを作成します。名前をBarcodeScannerAppとし、ターゲットフレームワークに.NET 10を選択します。 Visual Studioは、Android、iOS、macOS、Windowsそれぞれに対応したプラットフォーム固有のフォルダを含む、標準的なMAUIプロジェクト構造を生成します。

NuGet経由でIronBarcodeをインストールする

NuGetパッケージ マネージャー コンソールを開き、次を実行します。

PM > Install-Package BarCode

代替案として、ソリューションエクスプローラーでプロジェクトを右クリックし、"NuGetパッケージの管理"を選択してIronBarCodeを検索し、最新の安定版をインストールします。 特に.NET MAUIプロジェクトの場合、IronBarcodeのNuGetパッケージには必要なネイティブ依存関係がすべて含まれています。

ライセンスの有効化

インストール後、アプリケーションのライフサイクルの早い段階で、ライセンスキーを使用してIronBarcodeをアクティベートしてください。 最適な場所は、アプリビルダーが実行される前のMauiProgram.csです:

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

無料トライアルライセンスキーをIron Softwareのウェブサイトから取得します。トライアルキーを使用すると、開発中にすべての機能を時間制限なしで評価できますが、出力にはフルライセンスを適用するまでトライアル透かしが含まれる可能性があります。

AndroidとiOSでカメラの権限を設定するにはどうすればいいですか?

プラットフォーム固有のカメラ権限はバーコードスキャン機能に不可欠です。 各プラットフォームはそのmanifestファイルに具体的な設定が必要で、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では、プライバシーに関わるすべての権限について、人間が理解できる説明が求められます。 この説明文が欠落しているか曖昧な場合、AppleのApp Storeの審査プロセスでアプリは却下されます。 このテキストは、アプリが初めてカメラへのアクセスを要求する際にユーザーに表示されるシステム権限ダイアログに表示されます。

iPadOSの場合、ユーザーが保存した写真からバーコードをスキャンできるようにする予定がある場合はNSPhotoLibraryUsageDescriptionの追加も検討してください。

WindowsとmacOS

Windowsデスクトップおよび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

このレイアウトでは、カメラで新しい写真を撮影する操作と、ギャラリーから既存の画像を選択する操作の2つのスキャンパスが提供されます。 これは、ユーザーが事前にバーコードを撮影したり、電子メールで画像を受信したりするワークフローにおいて重要となる。 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に指示します。これは1つの荷札に10以上のバーコードが含まれる可能性がある倉庫の作業フローには必須です。

読書速度オプション

QuickScanの4つのレベルを提供します。 バーコードが綺麗で明るく照らされている大量シナリオの場合は、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をスローします。 このケースを処理するには、ユーザーをSettingsディレクトリに誘導します。これはAppInfo.ShowSettingsUI()で行うことができます。

App Storeに送信する前にInfo.plistに存在することを確認します。 プライバシーに関する文字列が欠落している場合、審査チームからの詳細な説明なしに自動的に却下されます。 カメラへのアクセスに関するAppleのヒューマンインターフェースガイドラインを参照して、アクセス許可要求のタイミングとメッセージングに関するベストプラクティスを確認してください。

次のステップは何ですか?

IronBarcodeで動作するMAUIバーコードスキャナーが使えるようになったので、アプリケーションの要件に応じていくつかの選択肢があります。

-バーコードの生成-- IronBarcodeには、文字列データからQRコード、Code 128ラベル、その他の形式のバーコードを作成するためのバーコード生成APIが含まれています。

  • バッチスキャン -- 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に精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

...
詳しく読む

関連する記事

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

世界中の数百万人のエンジニアから信頼されています。

ライセンスはより安く
義務のない相談を受ける
下記のフォームを記入するか、sales@ironsoftware.comにメールしてください。
あなたの詳細は常に守秘されます。
世界中の数百万人のエンジニアから信頼されています。
ライセンスはより安く
あなたの無料30日間の試用キーをすぐに入手。
クレジットカードやアカウントの作成は不要です。