푸터 콘텐츠로 바로가기
IRONBARCODE 사용

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 앱 템플릿을 선택하고 프로젝트 이름을 입력하며 대상 플랫폼을 선택하십시오. 이 튜토리얼은 Windows 배포에 중점을 두나 동일한 프로젝트는 Android와 iOS에서 실행됩니다. .NET MAUI는 C#과 XAML을 사용해 단일 공유 코드베이스에서 네이티브 모바일 및 데스크탑 애플리케이션을 빌드하기 위한 마이크로소프트의 크로스 플랫폼 프레임워크입니다.

카메라 기반 솔루션과 달리, ZXing.Net.MAUI와 같이 CameraView 제어 설정과 MauiProgram.cs 등록이 필요한 경우, IronBarcode는 특별한 구성 없이 사용할 수 있습니다. 당신의 MauiProgram.cs는 기본 템플릿 상태를 유지합니다. 이로 인해 시작 코드가 타사 핸들러 등록에서 자유로워지고 실행 시 초기화 오류의 표면적을 줄입니다.

IronBarcode를 설치하려면 패키지 관리자 콘솔에서 이 명령을 실행하세요:

Install-Package BarCode
Install-Package BarCode
SHELL

이 단일 패키지는 바코드 스캔, QR 코드 인식, 다중 바코드 감지 및 바코드 생성을 제공합니다. 추가 종속성은 필요하지 않습니다.

IronBarcode를 프로덕션에서 활성화하려면, 라이선스 키를 App.xaml.cs 또는 MauiProgram.cs에 설정하십시오:

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

IronBarcode 라이선스 페이지에서 키를 얻거나 무료 체험 라이선스로 시작할 수 있습니다.

이미지 기반 스캔의 권한은 어떻게 다릅니까?

전통적인 카메라 기반 바코드 스캐너는 플랫폼 매니페스트에서 명시적인 권한을 요구합니다. 안드로이드에서는, AndroidManifest.xml에 추가합니다:

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

iOS에서는, NSCameraUsageDescriptionInfo.plist에 선언합니다. 실행 중에 거부된 권한을 처리하면 놓치기 쉬운 오류 경로가 추가됩니다.

IronBarcode는 카메라 미리보기가 아닌 파일 스트림에서 읽기 때문에 파일 시스템 접근만 필요합니다. Windows에서는 자동으로 허용됩니다. 안드로이드와 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>
XML

이 레이아웃은 파일 선택기를 실행하는 버튼, 선택된 이미지를 표시하는 영역, 해독된 바코드 값을 위한 레이블을 제공합니다. 모든 .NET MAUI 대상 플랫폼에서 플랫폼 특정 조정 없이 올바르게 렌더링됩니다.

프로덕션 앱에서는, ResultsLabelCollectionView로 교체하여 여러 바코드 결과를 스크롤 가능한 목록에 표시할 수 있도록 고려하십시오, 특히 여러 바코드가 포함된 문서를 스캔할 때.

.NET MAUI에서 이미지 파일로부터 바코드를 스캔하는 방법은 무엇입니까?

코드 비하인드에서 MainPage.xaml.cs는 이미지 선택과 바코드 읽기를 처리합니다. BarcodeReader.Read는 파일 경로를 수락하고 BarcodeResults 컬렉션을 반환합니다. 컬렉션의 각 항목은 바코드 Value, 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}";
        }
    }
}
$vbLabelText   $csharpLabel

BarcodeReader.Read는 주어진 경로의 파일을 처리하고, 존재하는 모든 바코드 심볼로지를 자동으로 감지하며, 즉시 결과를 반환합니다. 이 방법은 Code 128, Code 39, QR Code, Data Matrix, PDF417, EAN-13을 포함한 모든 주요 1D 및 2D 바코드 형식을 지원합니다.

.NET MAUI 강력한 바코드 스캐너 라이브러리를 사용하여 Windows 앱에서 바코드 스캔: 이미지 1 - 스캔된 바코드 출력

FilePicker.PickAsync 호출은 선택기를 이미지 유형으로 제한하므로 사용자가 비이미지 파일을 실수로 선택할 수 없습니다. 만약 resultnull라면, 사용자는 취소한 것이며, 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");
    }
}
$vbLabelText   $csharpLabel

이 패턴은 간단한 확인 흐름에 잘 작동합니다. 디코드된 값에 대해 작업해야 하는 앱의 경우 -- 예를 들어, 바코드 인벤토리 관리 시스템에서 제품을 바코드로 조회하는 것처럼 -- barcodes 컬렉션을 OnSelectImage 핸들러에서 직접 비즈니스 로직 레이어에 전달합니다.

여러 바코드를 스캔하고 탐지 속도를 조정하는 방법은 무엇입니까?

이미지에 여러 바코드가 있는 경우 IronBarcode는 기본적으로 모두 감지합니다. 어떤 형식을 기대해야 하는지 알고 있을 때 더 나은 성능을 위해 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}");
}
$vbLabelText   $csharpLabel

.NET MAUI 강력한 바코드 스캐너 라이브러리를 사용하여 Windows 앱에서 바코드 스캔: 이미지 2 - 여러 바코드 스캔 결과

ExpectBarcodeTypes 속성은 감지 엔진을 지정된 심볼로지로 좁힙니다. SpeedReadingSpeed.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);
$vbLabelText   $csharpLabel

SharpenFilter는 압축되거나 초점이 맞지 않은 캡처에서 가장자리 정의를 복구합니다. ContrastFilter는 조명이 고르지 않은 경우에 도움이 됩니다. DenoiseFilter는 저해상도 스캔에서 얼룩을 줄입니다. 이 필터를 ReadingSpeed.Detailed와 결합하면 어려운 자료에 대한 판독 속도가 최대화됩니다.

.NET MAUI 앱이 다양한 소스로부터 사용자 업로드 이미지를 수용하는 경우, 기본적으로 보수적인 필터 세트를 적용하고 두 번째 재시도 시 더 공격적인 수정으로 확장하면 일반적인 경우에 가시적인 지연 없이 사용자 경험이 향상됩니다. 네트워크 응답에서 오는 이미지인 경우 파일 시스템 대신에 Uri 또는 byte[]를 직접 BarcodeReader.Read로 전달할 수도 있습니다. IronBarcode 사용방법 가이드에서 추가 입력 소스 예제를 참조하십시오.

이미지 기반 스캐닝은 왜 .NET MAUI 애플리케이션에 적합한가요?

라이브 카메라 스캔은 CameraView 제어를 통해 플랫폼별 권한 부여, 카메라 미리 보기의 라이프사이클 관리 및 포커스 이벤트 처리가 필요합니다. iOS에서는 이것이 또한 AVCaptureSession 구성을 의미합니다; 안드로이드에서는, CameraX입니다. 각 플랫폼은 자체적인 실패 모드를 추가합니다.

이미지 기반 스캐닝은 이러한 전체 범주의 문제를 제거합니다. IronBarcode API 참조BarcodeReader.Read가 파일 경로, Stream, Bitmap, byte[] -- MAUI 앱이 생성할 수 있는 모든 표현을 수락한다는 것을 보여줍니다. 즉, 이미지가 FilePicker에서 왔든, 네트워크 다운로드, 비트맵으로 렌더링된 PDF 페이지, 이메일 첨부 파일에서 왔든 동일한 스캔 로직이 작동합니다.

배터리 소비가 적습니다, 왜냐하면 카메라 하드웨어가 꺼져 있기 때문입니다. 라이브 미리보기로 인한 UI 깜빡임이 없고, 앱 중단 및 재개 시 카메라 수명 주기 이벤트를 관리할 필요가 없습니다. 태블릿 및 데스크톱 폼 팩터에서는 라이브 카메라 뷰파인더가 거의 적절하지 않을 때, 이미지 기반 디코딩은 절충안이 아니라 자연스러운 기본값입니다. 사용자들은 클라우드 스토리지, 로컬 폴더, 또는 카메라 롤에서 기기 유형에 관계 없이 동일한 FilePicker 호출로 파일을 열 수 있습니다.

사용자가 바코드 레이블을 사진으로 촬영하여 업로드하는 워크플로 -- ASP.NET 바코드 스캐너 웹 애플리케이션에서 흔히 볼 수 있는 -- 모바일 클라이언트와 서버 양쪽에서 같은 BarcodeReader.Read 호출이 작동하여 두 개의 스캔 구현을 유지할 필요를 없앱니다.

IronBarcode는 ZXing.Net.MAUI와 어떻게 비교됩니까?

ZXing.Net.MAUI는 라이브 카메라 스캐닝을 대상으로 하며 실시간 뷰파인더 피드백이 제품 요구 사항일 때 잘 작동합니다. 이는 CameraView 통합, 플랫폼 핸들러 등록, 런타임 권한 요청을 요구합니다.

IronBarcode는 파일 기반 및 스트림 기반 디코딩을 대상으로 하며, 이는 대부분의 Enterprise 문서 워크플로우를 커버합니다. PDF417, 데이터 매트릭스, 코드 128을 포함한 더 넓은 범위의 심볼로지를 지원하며, ZXing이 노출하지 않는 이미지 필터 전처리를 제공합니다. 사용자가 라이브 항목 스캔 대신 이미지를 캡처하거나 업로드하는 애플리케이션의 경우 IronBarcode가 더 직접적으로 적합합니다.

만약 여러분의 앱이 파일 기반 디코딩 외에 라이브 카메라 스캐닝이 필요하다면, 두 라이브러리를 모두 사용할 수 있습니다: ZXing.Net.MAUI는 뷰파인더 워크플로우를 위한 것이고, IronBarcode는 배치 파일 처리를 위한 것입니다.

다음 단계는 무엇입니까?

IronBarcode로 .NET MAUI 바코드 스캐너를 빌드하는 데에는 30줄 미만의 C# 코드가 필요합니다. 이미지 파일 접근 방식은 MAUI 코드베이스를 카메라 권한 로직과 플랫폼별 초기화 없이 유지하며, 동일한 스캐닝 호출이 Windows, Android, iOS에서 동일하게 작동합니다.

IronBarcode API 문서는 추가 기능을 다룹니다: PDF 문서에서 바코드 읽기, 여러 이미지의 배치 처리, 사용자 정의 이미지 필터 작성, 생성과 읽기를 동시에 수행하는 바코드 생성. 기능 개요는 지원되는 모든 심볼로지와 형식을 나열합니다.

무료 체험판 시작하기에서 IronBarcode를 프로젝트에서 테스트하거나, 프로덕션 배포 준비가 되었을 때 라이센스 구매하기를 참조하십시오.

지금 바로 IronBarcode으로 시작하세요.
green arrow pointer

자주 묻는 질문

카메라 없이 .NET MAUI 에서 바코드 스캐너를 어떻게 만들 수 있나요?

NuGet 통해 IronBarcode 설치한 다음(` Install-Package BarCode`), `FilePicker.PickAsync`에서 얻은 파일 경로를 사용하여 `BarcodeReader.Read(filePath)`를 호출하세요. 카메라 권한이나 `CameraView` 설정은 필요하지 않습니다.

IronBarcode .NET MAUI 환경에서 안드로이드 및 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 및 Data Matrix 포함)을 지원하고, 저품질 입력에 대한 이미지 필터 전처리 기능을 제공합니다.

흐릿하거나 저화질 이미지에서 바코드 감지 성능을 향상시키는 방법은 무엇인가요?

`BarcodeReaderOptions`에 `SharpenFilter`, `ContrastFilter`, `DenoiseFilter`를 포함하는 `ImageFilterCollection`을 추가하고 `Speed ​​= ReadingSpeed.Detailed`로 설정합니다. 이렇게 하면 디코딩 과정 전에 이미지 보정이 적용됩니다.

IronBarcode .NET MAUI 에서 어떤 바코드 형식을 지원합니까?

IronBarcode Code 128, Code 39, QR 코드, Data Matrix, PDF417, EAN-13, EAN-8, UPC-A, UPC-E, Aztec 등 모든 주요 1D 및 2D 심볼을 지원합니다. 전체 목록은 IronBarcode 기능 페이지에서 확인할 수 있습니다.

커티스 차우
기술 문서 작성자

커티스 차우는 칼턴 대학교에서 컴퓨터 과학 학사 학위를 취득했으며, Node.js, TypeScript, JavaScript, React를 전문으로 하는 프론트엔드 개발자입니다. 직관적이고 미적으로 뛰어난 사용자 인터페이스를 만드는 데 열정을 가진 그는 최신 프레임워크를 활용하고, 잘 구성되고 시각적으로 매력적인 매뉴얼을 제작하는 것을 즐깁니다.

커티스는 개발 분야 외에도 사물 인터넷(IoT)에 깊은 관심을 가지고 있으며, 하드웨어와 소프트웨어를 통합하는 혁신적인 방법을 연구합니다. 여가 시간에는 게임을 즐기거나 디스코드 봇을 만들면서 기술에 대한 애정과 창의성을 결합합니다.

Iron Support Team

We're online 24 hours, 5 days a week.
Chat
Email
Call Me