C# で.NET MAUIバーコード スキャナーを構築するにはどうすればよいでしょうか?
IronBarcodeを使用すると、 .NET MAUIアプリケーション内で画像ファイルから直接バーコードをスキャンできます。カメラストリーム、ドライバの設定、プラットフォーム固有の権限ループは不要です。
JPEG、PNG、GIF、TIFF、BMPファイルからバーコードをスキャンするには、単一のメソッド呼び出しで済みます。 同じコードを修正することなく、Windows、Android、iOSに対応させることができます。 無料トライアルを開始して、以下のコード例に沿って進めてみてください。
バーコードスキャン用 for .NET MAUIプロジェクトを作成するにはどうすればよいですか?
Visual Studioで.NET MAUIプロジェクトを設定するのは簡単です。 Visual Studio 2022以降を起動し、 "新しいプロジェクトの作成"を選択し、 ".NET MAUI App"テンプレートを選択して、プロジェクト名を入力し、ターゲットプラットフォームを選択します。 このチュートリアルではWindowsへの展開に焦点を当てていますが、同じプロジェクトはAndroidとiOSでも動作します。 .NET MAUIは、Microsoftが提供するクロスプラットフォームフレームワークで、単一の共有コードベースからC#とXAMLを使用してネイティブのモバイルアプリとデスクトップアプリを構築できます。
ZXing .NET.MAUIのようなカメラベースのソリューションは CameraView コントロール設定と MauiProgram.cs 登録が必要ですが、 IronBarcode は特別な設定を必要としません。 MauiProgram.cs はデフォルトのテンプレート状態のままです。 これにより、起動コードからサードパーティのハンドラー登録が排除され、起動時の初期化エラーが発生する可能性が低減されます。
IronBarcodeをインストールするには、パッケージマネージャーコンソールで次のコマンドを実行してください。
Install-Package BarCode
Install-Package BarCode
この単一パッケージには、バーコードスキャン、QRコード認識、複数バーコード検出、およびバーコード生成機能が含まれています。 追加の依存関係は必要ありません。
IronBarcodeを本番環境で有効化するには、ライセンスキーをMauiProgram.csに設定してください。
IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY";
IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY"
IronBarcodeのライセンスページからキーを取得するか、無料トライアルライセンスから始めることができます。
画像ベースのスキャンでは、権限はどのように異なりますか?
従来のカメラ式バーコードスキャナーは、プラットフォームマニフェストに明示的な権限設定を必要とします。 Android では、AndroidManifest.xml に以下を追加します。
<uses-permission android:name="android.permission.CAMERA" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
iOS では、NSCameraUsageDescription を Info.plist で宣言します。 実行時に拒否された権限を処理すると、見落としやすいエラー経路が追加される。
IronBarcodeはカメラのプレビューではなくファイルストリームから読み込むため、ファイルシステムへのアクセス権限のみが必要です。 Windowsではこれは自動的に許可されます。 Android および iOS では、FilePicker がユーザーが画像を選択する際にユーザーの同意を処理します。手動での許可要求は必要ありません。
MAUIバーコードスキャナーに最適なXAMLインターフェースはどれですか?
画像選択ボタン、画像表示領域、結果ラベルといった最小限のインターフェースで、ほとんどのバーコードスキャンシナリオに対応できます。 次の XAML は、 .NET MAUIのレイアウトを作成します。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">
<ScrollView>
<VerticalStackLayout Spacing="20" Padding="30">
<Label Text="MAUI Barcode Scanner"
FontSize="24"
HorizontalOptions="Center" />
<Button x:Name="SelectImageBtn"
Text="Select Image File"
Clicked="OnSelectImage" />
<Image x:Name="SelectedImageDisplay"
HeightRequest="250" />
<Label x:Name="ResultsLabel"
Text="Barcode results will appear here" />
</VerticalStackLayout>
</ScrollView>
</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">
<ScrollView>
<VerticalStackLayout Spacing="20" Padding="30">
<Label Text="MAUI Barcode Scanner"
FontSize="24"
HorizontalOptions="Center" />
<Button x:Name="SelectImageBtn"
Text="Select Image File"
Clicked="OnSelectImage" />
<Image x:Name="SelectedImageDisplay"
HeightRequest="250" />
<Label x:Name="ResultsLabel"
Text="Barcode results will appear here" />
</VerticalStackLayout>
</ScrollView>
</ContentPage>
このレイアウトには、ファイル選択ツールを起動するボタン、選択した画像を表示する領域、およびデコードされたバーコード値を表示するラベルが配置されています。 プラットフォーム固有の調整を行うことなく、すべて for .NET MAUIターゲットプラットフォームで正しくレンダリングされます。
実運用アプリケーションでは、特に複数のバーコードを含むドキュメントをスキャンする場合に、スクロール可能なリストに複数のバーコード結果を表示するために、ResultsLabel を CollectionView に置き換えることを検討してください。
.NET MAUIで画像ファイルからバーコードをスキャンするにはどうすればよいですか?
MainPage.xaml.cs のコードビハインドは、画像の選択とバーコードの読み取りを処理します。 BarcodeReader.Read はファイルパスを受け取り、BarcodeResults コレクションを返します。 コレクション内の各アイテムには、バーコード BarcodeType、および位置座標が表示されます。
以下に完全な実装例を示します。
using IronBarCode;
namespace BarcodeScanner;
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private async void OnSelectImage(object sender, EventArgs e)
{
try
{
// Open the system file picker filtered to image types
var result = await FilePicker.PickAsync(new PickOptions
{
FileTypes = FilePickerFileType.Images,
PickerTitle = "Select a barcode image"
});
if (result != null)
{
// Display the selected image in the UI
var stream = await result.OpenReadAsync();
SelectedImageDisplay.Source = ImageSource.FromStream(() => stream);
// Decode all barcodes found in the image
var barcodes = BarcodeReader.Read(result.FullPath);
if (barcodes.Count > 0)
{
// Build a display string listing each barcode type and value
string output = string.Join("\n",
barcodes.Select(b => $"{b.BarcodeType}: {b.Value}"));
ResultsLabel.Text = output;
}
else
{
ResultsLabel.Text = "No barcodes detected in image";
}
}
}
catch (Exception ex)
{
ResultsLabel.Text = $"Error: {ex.Message}";
}
}
}
using IronBarCode;
namespace BarcodeScanner;
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
}
private async void OnSelectImage(object sender, EventArgs e)
{
try
{
// Open the system file picker filtered to image types
var result = await FilePicker.PickAsync(new PickOptions
{
FileTypes = FilePickerFileType.Images,
PickerTitle = "Select a barcode image"
});
if (result != null)
{
// Display the selected image in the UI
var stream = await result.OpenReadAsync();
SelectedImageDisplay.Source = ImageSource.FromStream(() => stream);
// Decode all barcodes found in the image
var barcodes = BarcodeReader.Read(result.FullPath);
if (barcodes.Count > 0)
{
// Build a display string listing each barcode type and value
string output = string.Join("\n",
barcodes.Select(b => $"{b.BarcodeType}: {b.Value}"));
ResultsLabel.Text = output;
}
else
{
ResultsLabel.Text = "No barcodes detected in image";
}
}
}
catch (Exception ex)
{
ResultsLabel.Text = $"Error: {ex.Message}";
}
}
}
Imports IronBarCode
Namespace BarcodeScanner
Public Partial Class MainPage
Inherits ContentPage
Public Sub New()
InitializeComponent()
End Sub
Private Async Sub OnSelectImage(sender As Object, e As EventArgs)
Try
' Open the system file picker filtered to image types
Dim result = Await FilePicker.PickAsync(New PickOptions With {
.FileTypes = FilePickerFileType.Images,
.PickerTitle = "Select a barcode image"
})
If result IsNot Nothing Then
' Display the selected image in the UI
Dim stream = Await result.OpenReadAsync()
SelectedImageDisplay.Source = ImageSource.FromStream(Function() stream)
' Decode all barcodes found in the image
Dim barcodes = BarcodeReader.Read(result.FullPath)
If barcodes.Count > 0 Then
' Build a display string listing each barcode type and value
Dim output As String = String.Join(vbCrLf, barcodes.Select(Function(b) $"{b.BarcodeType}: {b.Value}"))
ResultsLabel.Text = output
Else
ResultsLabel.Text = "No barcodes detected in image"
End If
End If
Catch ex As Exception
ResultsLabel.Text = $"Error: {ex.Message}"
End Try
End Sub
End Class
End Namespace
BarcodeReader.Read は指定されたパスにあるファイルを処理し、存在するすべてのバーコードシンボルを自動的に検出し、結果を即座に返します。 この方式は、Code 128、Code 39、QRコード、データマトリックス、PDF417、EAN-13など、主要な1次元および2次元バーコード形式すべてに対応しています。

FilePicker.PickAsync 呼び出しはピッカーを画像タイプに制限するため、ユーザーが誤って画像以外のファイルを選択することはありません。 result が null の場合、ユーザーがキャンセルしました。if (result != null) ガードがそれを黙って処理します。
スキャン結果をダイアログに表示するにはどうすればよいですか?
簡単な確認メッセージの場合、DisplayAlert は追加の UI 要素を必要とせずにモーダルダイアログを提供します。
private async void ShowScanSummary(BarcodeResults barcodes)
{
if (barcodes.Count > 0)
{
// Inform the user how many barcodes were detected
string message = $"Found {barcodes.Count} barcode(s) in the image.";
await DisplayAlert("Scan Complete", message, "OK");
}
else
{
await DisplayAlert("No Results", "No barcodes were found in the image.", "OK");
}
}
private async void ShowScanSummary(BarcodeResults barcodes)
{
if (barcodes.Count > 0)
{
// Inform the user how many barcodes were detected
string message = $"Found {barcodes.Count} barcode(s) in the image.";
await DisplayAlert("Scan Complete", message, "OK");
}
else
{
await DisplayAlert("No Results", "No barcodes were found in the image.", "OK");
}
}
Private Async Sub ShowScanSummary(barcodes As BarcodeResults)
If barcodes.Count > 0 Then
' Inform the user how many barcodes were detected
Dim message As String = $"Found {barcodes.Count} barcode(s) in the image."
Await DisplayAlert("Scan Complete", message, "OK")
Else
Await DisplayAlert("No Results", "No barcodes were found in the image.", "OK")
End If
End Sub
このパターンは、シンプルな確認フローに適しています。 デコードされた値に基づいてアクションを実行する必要があるアプリ(たとえば、 バーコード在庫管理システムでバーコードを使用して製品を検索する場合)の場合は、OnSelectImage ハンドラーから barcodes コレクションをビジネスロジック層に直接渡します。
複数のバーコードをスキャンして検出速度を調整するにはどうすればよいですか?
画像に複数のバーコードが含まれている場合、 IronBarcodeはデフォルトでそれらすべてを検出します。 期待するフォーマットがわかっている場合は、BarcodeReader.Read を呼び出す前に BarcodeReaderOptions を設定してパフォーマンスを向上させてください。
using IronBarCode;
// Target only QR codes and Code 128 for faster detection
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;
// Target only QR codes and Code 128 for faster detection
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}");
}
Imports IronBarCode
' Target only QR codes and Code 128 for faster detection
Dim options As New BarcodeReaderOptions With {
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128,
.Speed = ReadingSpeed.Balanced
}
Dim barcodes = BarcodeReader.Read(imagePath, options)
For Each barcode In barcodes
Console.WriteLine($"Type: {barcode.BarcodeType} | Value: {barcode.Value}")
Next

ExpectBarcodeTypes プロパティは、検出エンジンを指定されたシンボル体系に絞り込みます。 Speed を ReadingSpeed.Faster に設定すると、高コントラストで歪みのない画像に適しています。 ReadingSpeed.Detailed は、追加の画像補正パスを適用し、回転、歪み、低解像度の入力を処理しますが、その代償として処理時間が長くなります。
ExpectMultipleBarcodes = true は、最初の一致の後もスキャンを続けるようにリーダーに指示し、途中で戻ることを防ぎます。 単一バーコードの場合、このオプションを省略すると、スキャンごとに数ミリ秒短縮されます。
この構成により、このスキャナーはさまざまな用途で実用的になります。例えば、小売アプリで製品のバーコードを読み取ったり、倉庫ツールで出荷写真に印刷されたバーコードラベルを処理したり、ドキュメントワークフローでアップロードされた請求書からQRコードを抽出したりすることができます。
難易度の高い画像や低品質の画像はどのように処理しますか?
制作現場で使われる画像は、完璧な状態であることは稀です。強い照明の下で撮影された倉庫の写真、メールクライアントのスクリーンショット、スキャンされた文書などは、いずれもノイズ、圧縮による劣化、形状の歪みなどを引き起こします。 IronBarcodeは、デコード前に画像を前処理するためにImageFilterCollectionを公開します。
using IronBarCode;
using IronSoftware.Drawing;
// Apply corrections for a low-quality warehouse photo
var options = new BarcodeReaderOptions
{
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter(1.2f),
new DenoiseFilter()
},
Speed = ReadingSpeed.Detailed
};
var barcodes = BarcodeReader.Read(imagePath, options);
using IronBarCode;
using IronSoftware.Drawing;
// Apply corrections for a low-quality warehouse photo
var options = new BarcodeReaderOptions
{
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter(1.2f),
new DenoiseFilter()
},
Speed = ReadingSpeed.Detailed
};
var barcodes = BarcodeReader.Read(imagePath, options);
Imports IronBarCode
Imports IronSoftware.Drawing
' Apply corrections for a low-quality warehouse photo
Dim options As New BarcodeReaderOptions With {
.ImageFilters = New ImageFilterCollection From {
New SharpenFilter(),
New ContrastFilter(1.2F),
New DenoiseFilter()
},
.Speed = ReadingSpeed.Detailed
}
Dim barcodes = BarcodeReader.Read(imagePath, options)
SharpenFilter 圧縮された画像やピントの合っていない画像からエッジの定義を復元します。 ContrastFilter 照明が不均一な場合に役立ちます。 DenoiseFilter 低解像度スキャンによるスペックルノイズを低減します。 これらのフィルターをReadingSpeed.Detailedと組み合わせることで、難解な資料の読解率を最大化できます。
さまざまなソースからユーザーがアップロードした画像を受け入れる.NET MAUIアプリの場合、デフォルトで保守的なフィルタセットを適用し、2回目の再試行でより積極的な補正にエスカレートすることで、一般的なケースでは目に見える遅延を増やすことなくユーザーエクスペリエンスを向上させることができます。 また、Uri または byte[] を BarcodeReader.Read に直接渡すこともできます。これは、イメージがファイルシステムからではなくネットワーク応答から到着する場合に便利です。 その他の入力ソースの例については、 IronBarcodeの操作ガイドを参照してください。
画像ベースのスキャンが.NET MAUIアプリケーションに適している理由とは?
CameraView コントロールを介したライブ カメラ スキャンには、プラットフォーム固有の権限付与、カメラ プレビューのライフサイクル管理、およびフォーカス イベントの処理が必要です。 iOS では、これは AVCaptureSession の設定も意味します。 Android では、CameraX です。 各プラットフォームにはそれぞれ固有の障害モードが存在する。
画像ベースのスキャンは、そういった懸念事項をすべて解消します。 IronBarcode API リファレンスによると、BarcodeReader.Read はファイル パス、Bitmap、または byte[] を受け入れます。これは、MAUI アプリが生成できる任意の表現です。 これは、画像がFilePickerから取得されたもの、ネットワークからダウンロードされたもの、ビットマップにレンダリングされたPDFページ、または電子メールの添付ファイルであるかどうかにかかわらず、同じスキャンロジックが機能することを意味します。
カメラのハードウェアがオフになっているため、バッテリー消費量が少なくなります。 ライブプレビューによるUIのちらつきはなく、アプリの一時停止と再開にわたってカメラのライフサイクルイベントを管理する必要もありません。 タブレットやデスクトップなど、ライブカメラのビューファインダーが適さないフォームファクターでは、画像ベースのデコードが妥協ではなく、自然なデフォルトとなります。デバイスの種類に関係なく、ユーザーはクラウドストレージ、ローカルフォルダ、カメラロールから同じ FilePicker コールを使用してファイルを開くことができます。
ユーザーがバーコードラベルを撮影してアップロードするワークフロー( ASP.NETバーコードスキャナー Web アプリケーションでよく見られる)では、同じ BarcodeReader.Read 呼び出しがモバイルクライアントとサーバーの両方で機能するため、2 つのスキャン実装を維持する必要がなくなります。
IronBarcodeはZXing .NET.MAUIと比べてどうですか?
ZXing .NET.MAUIはライブカメラスキャンを対象としており、リアルタイムのビューファインダーフィードバックが製品要件である場合にうまく機能します。 これには、統合、プラットフォーム ハンドラーの登録、およびランタイム権限要求が必要です。
IronBarcodeは、ファイルベースおよびストリームベースのデコードを対象としており、これはEnterprise文書ワークフローの大部分をカバーしています。 PDF417 、 データマトリックス、 コード128など、より幅広いシンボル体系をサポートし、ZXingでは提供されていない画像フィルタの前処理機能も備えています。 ユーザーがアイテムをリアルタイムでスキャンするのではなく、画像をキャプチャまたはアップロードするアプリケーションには、 IronBarcodeがより適しています。
アプリでファイルベースのデコードに加えてライブカメラスキャンが必要な場合は、両方のライブラリを組み合わせることができます。ビューファインダーのワークフローにはZXing .NET.MAUIを、バッチファイル処理にはIronBarcodeを使用します。
次のステップは何ですか?
IronBarcodeを使って.NET MAUIバーコードスキャナーを構築するには、30行未満のC#コードで済みます。 画像ファイル方式を採用することで、MAUIのコードベースからカメラのアクセス許可ロジックやプラットフォーム固有の初期化処理を排除でき、同じスキャン呼び出しがWindows、Android、iOSで全く同じように実行されます。
IronBarcode APIのドキュメントには、PDFドキュメントからのバーコードの読み取り、複数の画像のバッチ処理、カスタム画像フィルタの作成、読み取りと同時にバーコードを生成するなど、その他の機能についても記載されています。 機能概要には、サポートされているすべてのシンボルとフォーマットが一覧表示されます。
IronBarcodeをプロジェクトで試用するには無料トライアルを開始するか、本番環境への導入準備が整ったらライセンスを購入してください。
よくある質問
カメラなしで.NET MAUIでバーコード スキャナーを作成するにはどうすればよいですか?
NuGet経由でIronBarcodeをインストールし (` Install-Package BarCode`)、`FilePicker.PickAsync` から取得したパスを指定して `BarcodeReader.Read(filePath)` を呼び出します。カメラの権限や `CameraView` の設定は必要ありません。
IronBarcode は.NET MAUIで Android および iOS 上のバーコードをスキャンできますか?
はい。プラットフォーム固有のコードパスやマニフェストの変更なしに、同じ `BarcodeReader.Read` 呼び出しが Windows、Android、iOS で実行されます。
IronBarcode はバーコードスキャンにどのような画像形式をサポートしていますか?
IronBarcodeは、JPEG、PNG、GIF、TIFF、BMPファイルからバーコードを読み取ります。また、`Stream`、`Bitmap`、`byte[]`入力も受け入れるため、ネットワークレスポンスから取得した画像は、ディスクへの書き込みを必要とせずに読み取ることができます。
.NET MAUIで単一の画像から複数のバーコードをスキャンするにはどうすればよいですか?
`BarcodeReaderOptions` で `ExpectMultipleBarcodes = true` を設定し、オプションを `BarcodeReader.Read` に渡します。リーダーは検出されたすべてのバーコードを単一の `BarcodeResults` コレクションで返します。
IronBarcodeと ZXing .NET.MAUI の違いは何ですか?
ZXing .NET.MAUIは、`CameraView`コントロールを介してライブカメラスキャンを実行します。IronBarcodeはファイルベースおよびストリームベースのデコードをサポートし、より多くのシンボル体系(PDF417やデータマトリックスを含む)をサポートし、低品質の入力に対する画像フィルタ前処理を提供します。
ぼやけた画像や低品質の画像でのバーコード検出を改善するにはどうすればよいですか?
`BarcodeReaderOptions` に `ImageFilterCollection` を追加し、`SharpenFilter`、`ContrastFilter`、`DenoiseFilter` を設定し、`Speed = ReadingSpeed.Detailed` を設定します。これにより、デコードパスの前に画像補正が適用されます。
IronBarcode は.NET MAUIでどのようなバーコード形式をサポートしていますか?
IronBarcodeは、Code 128、Code 39、QRコード、データマトリックス、PDF417、EAN-13、EAN-8、UPC-A、UPC-E、Aztecなど、主要な1Dおよび2Dシンボルをすべてサポートしています。全リストはIronBarcodeの機能ページをご覧ください。



