Zum Fußzeileninhalt springen
IRONBARCODE VERWENDEN

Wie entwickelt man einen .NET MAUI Barcode-Scanner in C#?

Mit IronBarcode können Sie Barcodes direkt aus Bilddateien innerhalb einer .NET MAUI Anwendung scannen – ohne Kamerastream, ohne Treiberkonfiguration, ohne plattformspezifische Berechtigungsschleifen.

Mit einem einzigen Methodenaufruf können Sie Barcodes aus JPEG-, PNG-, GIF-, TIFF- und BMP-Dateien scannen. Derselbe Code ist ohne Änderungen für Windows, Android und iOS geeignet. Starten Sie mit einer kostenlosen Testversion und folgen Sie den unten stehenden Codebeispielen.

Wie erstellt man ein .NET MAUI Projekt zum Scannen von Barcodes?

Das Einrichten eines .NET MAUI Projekts in Visual Studio ist unkompliziert. Starten Sie Visual Studio 2022 oder höher, wählen Sie "Neues Projekt erstellen" , wählen Sie die Vorlage ".NET MAUI App" , geben Sie Ihren Projektnamen ein und wählen Sie Ihre Zielplattformen aus. Dieses Tutorial konzentriert sich auf die Bereitstellung unter Windows, das gleiche Projekt läuft aber auch unter Android und iOS. .NET MAUI ist Microsofts plattformübergreifendes Framework zum Erstellen nativer mobiler und Desktop-Apps mit C# und XAML aus einer einzigen gemeinsamen Codebasis.

Im Gegensatz zu kamerabasierten Lösungen wie ZXing .NET.MAUI , die eine CameraView Steuerungseinrichtung und MauiProgram.cs Registrierung erfordern, benötigt IronBarcode keine spezielle Konfiguration. Ihr MauiProgram.cs bleibt im Standardvorlagenzustand. Dadurch bleibt Ihr Startcode frei von Drittanbieter-Handler-Registrierungen und die Angriffsfläche für Initialisierungsfehler beim Start wird verringert.

Um IronBarcode zu installieren, führen Sie folgenden Befehl in der Paket-Manager-Konsole aus:

Install-Package BarCode
Install-Package BarCode
SHELL

Dieses Komplettpaket bietet Ihnen Barcode-Scanning, QR-Code-Erkennung, Multi-Barcode-Erkennung und Barcode-Generierung. Es sind keine zusätzlichen Abhängigkeiten erforderlich.

Um IronBarcode in der Produktion zu aktivieren, geben Sie Ihren Lizenzschlüssel in App.xaml.cs oder MauiProgram.cs ein:

IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY";
IronBarCode.License.LicenseKey = "YOUR_IRONBARCODE_LICENSE_KEY";
$vbLabelText   $csharpLabel

Sie können einen Lizenzschlüssel auf derIronBarcode -Lizenzseite erhalten oder mit einer kostenlosen Testlizenz beginnen.

Wie unterscheiden sich die Berechtigungen für bildbasiertes Scannen?

Herkömmliche kamerabasierte Barcode-Scanner benötigen explizite Berechtigungen in den Plattformmanifesten. Auf Android fügen Sie zu AndroidManifest.xml hinzu:

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

Auf iOS deklariert man NSCameraUsageDescription in Info.plist. Die Behandlung verweigerter Berechtigungen zur Laufzeit birgt zusätzliche Fehlerquellen, die leicht übersehen werden können.

Da IronBarcode aus einem Dateistream und nicht aus einer Kameravorschau liest, benötigen Sie lediglich Zugriff auf das Dateisystem. Unter Windows wird dies automatisch gewährt. Auf Android und iOS übernimmt FilePicker die Benutzereinwilligung, wenn der Benutzer ein Bild auswählt – es sind keine manuellen Berechtigungsanfragen erforderlich.

Welche XAML-Schnittstelle eignet sich am besten für einen MAUI-Barcodescanner?

Eine minimalistische Benutzeroberfläche – bestehend aus einer Schaltfläche zur Bildauswahl, einem Bildanzeigebereich und einer Ergebnisbezeichnung – deckt die meisten Barcode-Scan-Szenarien ab. Das folgende XAML erstellt dieses Layout für eine .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>
XML

Das Layout bietet eine Schaltfläche zum Aufrufen der Dateiauswahl, einen Anzeigebereich für das ausgewählte Bild und eine Beschriftung für die dekodierten Barcode-Werte. Es wird auf allen .NET MAUI Zielplattformen ohne plattformspezifische Anpassungen korrekt dargestellt.

Für Produktionsanwendungen sollten Sie ResultsLabel durch CollectionView ersetzen, um mehrere Barcode-Ergebnisse in einer scrollbaren Liste anzuzeigen, insbesondere beim Scannen von Dokumenten, die mehr als einen Barcode enthalten.

Wie scannt man Barcodes aus Bilddateien in .NET MAUI?

Der Code-Behind in MainPage.xaml.cs übernimmt die Bildauswahl und das Einlesen des Barcodes. BarcodeReader.Read akzeptiert einen Dateipfad und gibt eine BarcodeResults Sammlung zurück. Jeder Artikel in der Sammlung enthält den Barcode Value, BarcodeType und die Positionskoordinaten.

Hier ist die vollständige Implementierung:

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}";
        }
    }
}
$vbLabelText   $csharpLabel

BarcodeReader.Read verarbeitet die Datei unter dem angegebenen Pfad, erkennt automatisch alle vorhandenen Barcode-Symbologien und gibt die Ergebnisse sofort zurück. Das Verfahren unterstützt alle gängigen 1D- und 2D-Barcodeformate, einschließlich Code 128, Code 39, QR-Code, Data Matrix, PDF417 und EAN-13.

 .NET MAUI Barcode-Scan in Windows-Apps mit einer leistungsstarken Barcode-Scanner-Bibliothek: Bild 1 - Ausgabe des gescannten Barcodes

Der Aufruf FilePicker.PickAsync beschränkt die Dateiauswahl auf Bildtypen, sodass Benutzer nicht versehentlich Nicht-Bilddateien auswählen können. Wenn result null ist, hat der Benutzer abgebrochen -- die if (result != null)-Schutzfunktion behandelt dies stillschweigend.

Wie zeigt man Scan-Ergebnisse in einem Dialogfeld an?

Für kurze Bestätigungsmeldungen bietet DisplayAlert einen modalen Dialog, ohne dass zusätzliche UI-Elemente erforderlich sind:

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");
    }
}
$vbLabelText   $csharpLabel

Dieses Muster eignet sich gut für einfache Bestätigungsabläufe. Für Anwendungen, die auf die dekodierten Werte reagieren müssen – beispielsweise das Nachschlagen eines Produkts anhand seines Barcodes in einem Barcode-Inventarverwaltungssystem – übergeben Sie die Sammlung barcodes direkt vom Handler OnSelectImage an Ihre Geschäftslogikschicht.

Wie scannt man mehrere Barcodes und optimiert die Erkennungsgeschwindigkeit?

Wenn ein Bild mehrere Barcodes enthält, erkennt IronBarcode diese standardmäßig alle. Für eine bessere Performance, wenn Sie wissen, welche Formate zu erwarten sind, konfigurieren Sie BarcodeReaderOptions, bevor Sie BarcodeReader.Read aufrufen:

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}");
}
$vbLabelText   $csharpLabel

 .NET MAUI Barcode-Scan in Windows-Apps mit einer leistungsstarken Barcode-Scanner-Bibliothek: Bild 2 – Ausgabe beim Scannen mehrerer Barcodes

Die Eigenschaft ExpectBarcodeTypes beschränkt die Erkennungs-Engine auf die angegebenen Symbologien. Die Einstellung Speed auf ReadingSpeed.Faster eignet sich für kontrastreiche, unverzerrte Bilder. ReadingSpeed.Detailed wendet zusätzliche Bildkorrekturdurchgänge an und verarbeitet Rotation, Verzerrung und Eingaben mit niedriger Auflösung, was jedoch einen höheren Verarbeitungsaufwand bedeutet.

ExpectMultipleBarcodes = true weist den Leser an, nach dem ersten Treffer mit dem Scannen fortzufahren, anstatt frühzeitig zurückzukehren. Bei Szenarien mit nur einem Barcode spart das Weglassen dieser Option einige Millisekunden bei jedem Scan.

Durch diese Konfiguration eignet sich der Scanner für eine Reihe von Anwendungen: eine Einzelhandels-App zum Einlesen von Produkt-Barcodes, ein Lagertool zur Verarbeitung gedruckter Barcode-Etiketten auf Versandfotos oder ein Dokumenten-Workflow zum Extrahieren von QR-Codes aus hochgeladenen Rechnungen.

Wie gehen Sie mit schwierigen oder qualitativ minderwertigen Bildern um?

Produktionsbilder sind selten makellos. Lagerfotos, die unter grellem Licht aufgenommen wurden, Screenshots aus E-Mail-Clients und gescannte Dokumente weisen alle Rauschen, Kompressionsartefakte und geometrische Verzerrungen auf. IronBarcode stellt ImageFilterCollection zur Verfügung, um Bilder vor der Dekodierung vorzuverarbeiten:

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);
$vbLabelText   $csharpLabel

SharpenFilter stellt die Kantendefinition aus komprimierten oder unscharfen Aufnahmen wieder her. ContrastFilter hilft bei ungleichmäßiger Beleuchtung. DenoiseFilter reduziert Speckle bei Scans mit niedriger Auflösung. Durch die Kombination dieser Filter mit ReadingSpeed.Detailed werden die Leserate bei schwierigen Inhalten maximiert.

Bei .NET MAUI Apps, die vom Benutzer hochgeladene Bilder aus verschiedenen Quellen akzeptieren, verbessert die Anwendung eines standardmäßig festgelegten konservativen Filters und die Eskalation zu einer aggressiveren Korrektur bei einem zweiten Wiederholungsversuch das Benutzererlebnis, ohne im Normalfall eine sichtbare Latenz zu verursachen. Sie können auch einen Uri oder byte[] direkt an BarcodeReader.Read übergeben, was nützlich ist, wenn das Bild aus einer Netzwerkantwort und nicht aus dem Dateisystem stammt. Weitere Beispiele für Eingabequellen finden Sie in den Anleitungen von IronBarcode .

Warum eignet sich bildbasiertes Scannen for .NET MAUI Anwendungen?

Das Scannen der Live-Kamera über ein CameraView Steuerelement erfordert plattformspezifische Berechtigungen, Lebenszyklusmanagement für die Kameravorschau und die Behandlung von Fokusereignissen. Auf iOS bedeutet dies auch die Konfiguration von AVCaptureSession; auf Android, CameraX. Jede Plattform birgt ihre eigenen Fehlerquellen.

Bildbasiertes Scannen beseitigt diese ganze Problematik. Die IronBarcode -API-Referenz zeigt, dass BarcodeReader.Read einen Dateipfad, ein Stream, ein Bitmap oder ein byte[] akzeptiert – also jede beliebige Darstellung, die Ihre MAUI-App erzeugen kann. Dies bedeutet, dass die gleiche Scanlogik funktioniert, unabhängig davon, ob das Bild von FilePicker, einem Netzwerk-Download, einer in Bitmap gerenderten PDF-Seite oder einem E-Mail-Anhang stammt.

Der Batterieverbrauch ist geringer, da die Kamerahardware ausgeschaltet bleibt. Bei der Live-Vorschau gibt es kein Flimmern der Benutzeroberfläche, und es ist nicht erforderlich, Kamera-Lebenszyklusereignisse beim Anhalten und Fortsetzen der App zu verwalten. Auf Tablets und Desktop-Computern – wo ein Live-Kamerasucher selten sinnvoll ist – ist die bildbasierte Dekodierung die natürliche Standardeinstellung und kein Kompromiss. Benutzer können Dateien aus Cloud-Speichern, lokalen Ordnern oder der Kamerarolle mit demselben FilePicker-Aufruf öffnen, unabhängig vom Gerätetyp.

Bei Arbeitsabläufen, bei denen Benutzer Barcode-Etiketten fotografieren und hochladen – was bei ASP.NET Barcode-Scanner-Webanwendungen üblich ist – funktioniert der gleiche BarcodeReader.Read-Aufruf sowohl auf dem mobilen Client als auch auf dem Server, wodurch die Notwendigkeit entfällt, zwei Scan-Implementierungen zu pflegen.

Wie schneidet IronBarcode im Vergleich zu ZXing .NET.MAUI ab?

ZXing .NET.MAUI zielt auf Live-Kamera-Scanning ab und funktioniert gut, wenn Echtzeit-Sucher-Feedback eine Produktanforderung ist. Es erfordert die Integration von CameraView, die Registrierung des Plattform-Handlers und Anfragen nach Laufzeitberechtigungen.

IronBarcode zielt auf dateibasierte und streambasierte Dekodierung ab, was den Großteil der Dokumenten-Workflows in Enterprise abdeckt. Es unterstützt eine breitere Palette von Symbologien, darunter PDF417 , Data Matrix und Code 128 , und bietet eine Bildfilter-Vorverarbeitung, die ZXing nicht bietet. Für Anwendungen, bei denen Benutzer Bilder aufnehmen oder hochladen, anstatt Artikel live zu scannen, ist IronBarcode die direktere Lösung.

Wenn Ihre App neben der dateibasierten Dekodierung auch das Scannen mit der Live-Kamera benötigt, können Sie beide Bibliotheken kombinieren: ZXing .NET.MAUI für den Sucher-Workflow und IronBarcode für die Stapelverarbeitung von Dateien.

Was sind Ihre nächsten Schritte?

Die Entwicklung eines .NET MAUI Barcode-Scanners mit IronBarcode erfordert weniger als 30 Zeilen C#-Code. Durch die Verwendung von Bilddateien bleibt Ihre MAUI-Codebasis frei von Kamera-Berechtigungslogik und plattformspezifischer Initialisierung, und der gleiche Scan-Aufruf läuft auf Windows, Android und iOS identisch ab.

Die IronBarcode API-Dokumentation behandelt zusätzliche Funktionen: das Lesen von Barcodes aus PDF-Dokumenten, die Stapelverarbeitung mehrerer Bilder, das Schreiben benutzerdefinierter Bildfilter und das Generieren von Barcodes während des Lesens. Die Funktionsübersicht listet alle unterstützten Symboliken und Formate auf.

Starten Sie eine kostenlose Testphase , um IronBarcode in Ihrem Projekt zu testen, oder erwerben Sie eine Lizenz, wenn Sie bereit für den Produktiveinsatz sind.

Starten Sie jetzt mit IronBarcode.
green arrow pointer

Häufig gestellte Fragen

Wie erstellt man einen Barcode-Scanner in .NET MAUI ohne Kamera?

Installieren Sie IronBarcode über NuGet (`Install-Package BarCode`) und rufen Sie anschließend `BarcodeReader.Read(filePath)` mit einem Pfad auf, den Sie mit `FilePicker.PickAsync` ermittelt haben. Es sind keine Kameraberechtigungen oder eine `CameraView`-Konfiguration erforderlich.

Kann IronBarcode Barcodes auf Android und iOS in .NET MAUI scannen?

Ja. Derselbe `BarcodeReader.Read`-Aufruf läuft unter Windows, Android und iOS ohne plattformspezifische Codepfade oder Manifeständerungen.

Welche Bildformate unterstützt IronBarcode für das Scannen von Barcodes?

IronBarcode liest Barcodes aus JPEG-, PNG-, GIF-, TIFF- und BMP-Dateien. Es akzeptiert außerdem `Stream`-, `Bitmap`- und `byte[]`-Eingaben, sodass Bilder aus Netzwerkantworten ohne vorheriges Speichern auf der Festplatte verarbeitet werden können.

Wie scannt man mehrere Barcodes aus einem einzigen Bild in .NET MAUI?

Setzen Sie `ExpectMultipleBarcodes = true` in `BarcodeReaderOptions` und übergeben Sie die Optionen an `BarcodeReader.Read`. Der Reader gibt alle erkannten Barcodes in einer einzigen `BarcodeResults`-Sammlung zurück.

Worin besteht der Unterschied zwischen IronBarcode und ZXing .NET.MAUI?

ZXing .NET.MAUI zielt auf Live-Kamera-Scanning über ein `CameraView`-Steuerelement ab. IronBarcode zielt auf datei- und streambasierte Dekodierung ab, unterstützt mehr Symbologien (einschließlich PDF417 und Data Matrix) und bietet Bildfilter-Vorverarbeitung für Eingaben mit geringer Qualität.

Wie lässt sich die Barcode-Erkennung auf unscharfen oder qualitativ minderwertigen Bildern verbessern?

Fügen Sie den `BarcodeReaderOptions` eine `ImageFilterCollection` mit `SharpenFilter`, `ContrastFilter` und `DenoiseFilter` hinzu und setzen Sie `Speed ​​= ReadingSpeed.Detailed`. Dadurch werden Bildkorrekturen vor dem Dekodierungsvorgang angewendet.

Welche Barcode-Formate unterstützt IronBarcode in .NET MAUI?

IronBarcode unterstützt alle gängigen 1D- und 2D-Symbologien: Code 128, Code 39, QR-Code, Data Matrix, PDF417, EAN-13, EAN-8, UPC-A, UPC-E, Aztec und weitere. Die vollständige Liste finden Sie auf der IronBarcode -Funktionsseite.

Jordi Bardia
Software Ingenieur
Jordi ist am besten in Python, C# und C++ versiert. Wenn er nicht bei Iron Software seine Fähigkeiten einsetzt, programmiert er Spiele. Mit Verantwortung für Produkttests, Produktentwicklung und -forschung trägt Jordi mit immensem Wert zur kontinuierlichen Produktverbesserung bei. Die abwechslungsreiche Erfahrung hält ihn gefordert und engagiert, ...
Weiterlesen

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an