.NET MAUI QR Code Scanner

Introduction

.NET MAUI (.NET Multi-platform App UI) is a cross-platform framework for building native mobile and desktop applications from a single C# codebase. A single project can target Android, iOS, macOS, and Windows, sharing UI layouts and business logic across all platforms. MAUI's integration with the .NET ecosystem means developers can reach mobile users without abandoning familiar tooling or languages.

In this article, we'll explain how to build a native QR code scanner in a .NET MAUI application using IronQR to decode QR codes selected from the device's photo library.

IronQR: C# QR Code Library

To read QR codes in the application, we'll use the IronQR .NET library. It provides a straightforward API for detecting and decoding QR codes from any image source, including files selected on a mobile device. IronQR runs on all MAUI target platforms and requires no barcode domain knowledge to integrate.

IronQR can decode standard QR codes, Micro QR codes, and rMQR codes, and accepts image input as files, streams, or bitmaps. It can be installed in seconds via the NuGet Package Manager.

Steps to Build a QR Code Scanner in .NET MAUI

Follow these steps to add QR code scanning to a .NET MAUI application.

Prerequisites

  1. Visual Studio 2022 with the .NET MAUI workload installed
  2. A .NET MAUI project targeting Android or iOS

Install IronQR

Install the IronQR library using the NuGet Package Manager Console in Visual Studio. Navigate to Tools > NuGet Package Manager > Package Manager Console and run:

Install-Package IronQR

Alternatively, search for IronQR on NuGet and install the latest version.

Front-End Design

The scanner UI consists of a button to trigger image selection, an image view to preview the selected QR code, and a label to display the decoded result.

Replace the content of MainPage.xaml with the following:

<?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="MauiQrScanner.MainPage">

    <ScrollView>
        <VerticalStackLayout
            Spacing="25"
            Padding="30,0"
            VerticalOptions="Center">

            <Button
                x:Name="scanButton"
                Text="Select QR Code Image"
                SemanticProperties.Hint="Select Image"
                Clicked="OnScanButtonClicked"
                HorizontalOptions="Center" />

            <Image
                x:Name="qrImage"
                SemanticProperties.Description="Selected QR Code"
                HeightRequest="200"
                HorizontalOptions="Center" />

            <Label
                x:Name="resultLabel"
                Text="Scanned Text: "
                HorizontalOptions="Center"
                VerticalOptions="Center" />

        </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="MauiQrScanner.MainPage">

    <ScrollView>
        <VerticalStackLayout
            Spacing="25"
            Padding="30,0"
            VerticalOptions="Center">

            <Button
                x:Name="scanButton"
                Text="Select QR Code Image"
                SemanticProperties.Hint="Select Image"
                Clicked="OnScanButtonClicked"
                HorizontalOptions="Center" />

            <Image
                x:Name="qrImage"
                SemanticProperties.Description="Selected QR Code"
                HeightRequest="200"
                HorizontalOptions="Center" />

            <Label
                x:Name="resultLabel"
                Text="Scanned Text: "
                HorizontalOptions="Center"
                VerticalOptions="Center" />

        </VerticalStackLayout>
    </ScrollView>

</ContentPage>
XML

Sample Input

Use the QR code below as a test image. Save it to your device, then select it through the app's file picker. The decoded value should display as https://ironsoftware.com.

Sample QR code encoding https://ironsoftware.com for testing the .NET MAUI QR scanner

Sample QR code — encodes https://ironsoftware.com

QR Code Scanning with IronQR

When the scan button is tapped, FilePicker opens the device's image library. After the user selects a photo, the full path is loaded into an AnyBitmap, which is passed to QrReader.Read(). The decoded value from the first detected QR code is displayed in the result label.

Add the following method to MainPage.xaml.cs:

using IronQr;
using IronSoftware.Drawing;

private async void OnScanButtonClicked(object sender, EventArgs e)
{
    // Start scanning QR codes
    var images = await FilePicker.Default.PickAsync(new PickOptions
    {
        PickerTitle = "Pick image",
        FileTypes = FilePickerFileType.Images
    });
    var imageSource = images.FullPath.ToString();

    var inputBmp = AnyBitmap.FromFile(imageSource);

    // Load the asset into QrImageInput
    QrImageInput imageInput = new QrImageInput(inputBmp);

    // Create a QR Reader object
    QrReader reader = new QrReader();

    // Read the input and get all embedded QR Codes
    IEnumerable<QrResult> results = reader.Read(imageInput);

    // Display the first result
    resultLabel.Text = "Scanned Text: " + results.First().Value;
}
using IronQr;
using IronSoftware.Drawing;

private async void OnScanButtonClicked(object sender, EventArgs e)
{
    // Start scanning QR codes
    var images = await FilePicker.Default.PickAsync(new PickOptions
    {
        PickerTitle = "Pick image",
        FileTypes = FilePickerFileType.Images
    });
    var imageSource = images.FullPath.ToString();

    var inputBmp = AnyBitmap.FromFile(imageSource);

    // Load the asset into QrImageInput
    QrImageInput imageInput = new QrImageInput(inputBmp);

    // Create a QR Reader object
    QrReader reader = new QrReader();

    // Read the input and get all embedded QR Codes
    IEnumerable<QrResult> results = reader.Read(imageInput);

    // Display the first result
    resultLabel.Text = "Scanned Text: " + results.First().Value;
}
Imports IronQr
Imports IronSoftware.Drawing

Private Async Sub OnScanButtonClicked(sender As Object, e As EventArgs)
    ' Start scanning QR codes
    Dim images = Await FilePicker.Default.PickAsync(New PickOptions With {
        .PickerTitle = "Pick image",
        .FileTypes = FilePickerFileType.Images
    })
    Dim imageSource = images.FullPath.ToString()

    Dim inputBmp = AnyBitmap.FromFile(imageSource)

    ' Load the asset into QrImageInput
    Dim imageInput As New QrImageInput(inputBmp)

    ' Create a QR Reader object
    Dim reader As New QrReader()

    ' Read the input and get all embedded QR Codes
    Dim results As IEnumerable(Of QrResult) = reader.Read(imageInput)

    ' Display the first result
    resultLabel.Text = "Scanned Text: " & results.First().Value
End Sub
$vbLabelText   $csharpLabel

FilePicker.Default.PickAsync is provided by the MAUI platform abstraction layer and works on Android, iOS, and Windows without any platform-specific code. AnyBitmap.FromFile handles image decoding, and QrReader.Read returns an IEnumerable<QrResult> with one entry per QR code found in the image.

Output

Selecting a QR code image triggers the scan. The decoded value appears in the result label below the image preview.

.NET MAUI QR Code Scanner using IronQR — app selecting a QR code image and displaying the decoded value

QR code selected and decoded value displayed in the result label

Download the Project

Click here to download the complete MauiQrScanner project.

Conclusion

In this article, we demonstrated how to build a native QR code scanner in a .NET MAUI application using IronQR. The FilePicker API provides platform-native image selection on Android, iOS, and Windows, while IronQR's QrReader.Read handles the decoding in a single call. The same approach scales to multiple QR codes per image by iterating over the full results collection instead of calling .First().

IronQR requires a license for development and commercial use. Licensing details are available here.

For a deeper look at reading QR code properties beyond the value, see the Read QR Code Value and Read QR Code Type guides.

Curtis Chau
Technical Writer

Curtis Chau holds a Bachelor’s degree in Computer Science (Carleton University) and specializes in front-end development with expertise in Node.js, TypeScript, JavaScript, and React. Passionate about crafting intuitive and aesthetically pleasing user interfaces, Curtis enjoys working with modern frameworks and creating well-structured, visually appealing manuals.

...

Read More
Ready to Get Started?
Nuget Downloads 60,166 | Version: 2026.3 just released
Still Scrolling Icon

Still Scrolling?

Want proof fast? PM > Install-Package IronQR
run a sample watch your URL become a QR code.