MAUI 바코드 스캐너와 IronBarcode 사용법: 단계별 가이드
모바일 애플리케이션은 점점 더 재고 관리, 판매 시점 시스템, 제품 추적을 위해 바코드 스캔에 의존하고 있습니다. MAUI 바코드 스캐너를 구축하면 .NET MAUI 애플리케이션에 바코드 감지를 직접 통합할 수 있으며, 이는 카메라 피드와 이미지 파일 처리를 결합하여 QR 코드, 데이터 매트릭스 및 기타 바코드 형식을 감지합니다. 많은 라이브러리가 카메라 프리뷰에 집중하는 반면, IronBarcode는 까다로운 조건에서도 바코드를 정확하게 읽는 데 탁월합니다. 기울어진 각도, 불량한 조명, 손상된 라벨 등도 추가 구성 없이 처리합니다.
이 가이드는 IronBarcode를 사용하여 .NET MAUI 프로젝트에서 바코드 스캔을 구현하는 각 단계를 안내합니다. 마지막으로 단일 이미지 파일에서 여러 바코드를 스캔하고, 기기 카메라에서 바코드를 캡처하며, 자신의 크로스 플랫폼 프로젝트에 라이브러리를 자신 있게 통합할 수 있게 됩니다.
MAUI 바코드 스캐너를 구축하기 위한 사전 요구 사항은 무엇입니까?
시작하기 전에 개발 환경을 정비하십시오:
- Visual Studio 2022 (v17.8 이상) 및 .NET MAUI 워크로드 설치
- .NET 10 SDK -- 공식 .NET 사이트에서 다운로드
- 기본 C# 지식 -- async/await 패턴에 대한 친숙함이 도움이 됩니다
- 카메라 테스트를 위한 물리적 기기 또는 에뮬레이터 구성
- IronBarcode 라이선스 -- 평가용 무료 체험판을 사용할 수 있습니다
프로젝트를 생성하기 전에 Visual Studio에 MAUI 워크로드가 설치되어 있는지 확인하면 나중에 문제 해결 시간을 크게 절약할 수 있습니다. Visual Studio 설치 관리자에서 "개별 구성 요소" 아래에서 ".NET Multi-platform App UI development"를 검색하여 이를 확인할 수 있습니다.
IronBarcode가 MAUI와 어떻게 맞물리는지 이해하기
.NET MAUI는 Android, iOS, macOS 및 Windows를 대상으로 하는 단일 코드베이스를 제공합니다. 이 환경에서 바코드 스캐닝의 도전 과제는 각 플랫폼이 카메라 접근을 다르게 처리한다는 것입니다. IronBarcode는 이미지 처리 레이어에서 작동하여 이 문제를 해결합니다. MAUI의 MediaPicker로 이미지를 캡처한 후 바이트를 IronBarcode에 전달하여 분석합니다.
이러한 역할의 분리는 코드의 정리를 돕고 플랫폼별 바코드 SDK를 피할 수 있습니다. 또한 IronBarcode의 오프라인 처리 모델은 바코드 데이터가 장치를 떠나지 않음을 의미하여 규제가 있는 산업의 애플리케이션에 중요합니다.
지원되는 바코드 형식
IronBarcode 다음과 같은 다양한 형식을 읽습니다.
| 형식 카테고리 | 형식 | 일반적인 사용 사례 |
|---|---|---|
| 1D 선형 | 코드 128, 코드 39, EAN-13, UPC-A, ITF | 소매, 물류, 의료 |
| 2D 매트릭스 | QR 코드, 데이터 매트릭스, 아즈텍, PDF417 | 모바일 결제, 티켓 발권, 제조 |
| 우편 | USPS, 로열 메일, 독일 우편 | 배송 및 우편 서비스 |
| 특수 | 맥시코드, GS1, 마이크로PDF417 | 공급망, 운송, 소포 |
MAUI 바코드 스캔 프로젝트를 어떻게 설정합니까?
Visual Studio 2022에서 새 .NET MAUI App 프로젝트를 생성합니다. 이름을 BarcodeScannerApp으로 지정하고 대상 프레임워크로 .NET 10을 선택합니다. Visual Studio는 Android, iOS, macOS 및 Windows에 대한 플랫폼별 폴더가 있는 표준 MAUI 프로젝트 구조를 생성합니다.
NuGet을 통한 IronBarcode 설치
NuGet 패키지 관리자 콘솔을 열고 다음을 실행합니다:
Install-Package BarCode
또는 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "NuGet 패키지 관리"를 선택한 다음 IronBarCode을 검색하여 최신 안정 버전을 설치합니다. 특히 .NET MAUI 프로젝트에 대해 IronBarcode의 NuGet 패키지에는 모든 필수적인 네이티브 종속성이 포함되어 있습니다.
라이선스 활성화
설치 후 애플리케이션 라이프사이클 초기에 라이선스 키로 IronBarcode를 활성화하십시오. 앱 빌더가 실행되기 전 MauiProgram.cs가 가장 좋은 위치입니다:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Iron Software 웹사이트에서 무료 체험판 라이선스 키를 받으세요. 체험판 키를 사용하면 개발 중 모든 기능을 시간 제한 없이 평가할 수 있습니다. 단, 전체 라이선스를 적용하기 전까지는 출력에 체험판 워터마크가 포함될 수 있습니다.
Android 및 iOS의 카메라 권한을 어떻게 구성합니까?
플랫폼별 카메라 권한은 바코드 스캐닝 기능에 필수적입니다. 각 플랫폼은 MediaPicker.CapturePhotoAsync()가 성공하기 전에 매니페스트 파일에서 특정 구성이 필요합니다.
안드로이드 권한
카메라 액세스를 선언하기 위해 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" />
<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" />
android.permission.CAMERA 항목은 사용자에게 런타임 권한을 요청합니다. uses-feature 선언은 Google Play Store에 앱에 카메라 하드웨어와 자동 초점 기능이 필요함을 알립니다. 이러한 사항이 없으면 안드로이드 기기는 권한 요청을 허가할 수 있지만 여전히 내부적으로 카메라 접근을 차단할 수 있습니다.
Android 13 이상(API 레벨 33+)의 경우, MainActivity.cs에서 ActivityCompat.RequestPermissions를 사용하여 세부적인 미디어 권한을 처리해야 할 수도 있습니다. MAUI MediaPicker 추상화는 거의 모든 것을 자동으로 처리하지만, 출시 전에 물리적 장치에서 테스트하는 것이 좋습니다.
iOS 권한
Platforms/iOS/Info.plist를 수정하여 카메라 사용 설명을 포함시킵니다:
<key>NSCameraUsageDescription</key>
<string>This app requires camera access to scan barcodes</string>
<key>NSCameraUsageDescription</key>
<string>This app requires camera access to scan barcodes</string>
iOS는 개인정보 보호에 민감한 모든 권한에 대해 사람이 읽을 수 있는 설명을 요구합니다. Apple의 App Store 검토 프로세스는 이 설명이 없거나 모호하면 앱을 거부할 것입니다. 이 텍스트는 사용자에게 처음으로 앱이 카메라 액세스를 요청할 때 표시되는 시스템 권한 대화 상자에 나타납니다.
iPadOS의 경우, 사용자가 라이브 카메라 외에도 저장된 사진에서 바코드를 스캔할 수 있도록 할 계획이라면 NSPhotoLibraryUsageDescription을 추가하는 것도 고려해보세요.
Windows 및 macOS
Windows Desktop 및 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 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>
이 레이아웃은 두 개의 스캔 경로를 제공합니다: 카메라로 새로운 사진을 촬영하거나 갤러리에서 기존 이미지를 선택합니다. 이는 사용자가 미리 바코드를 사진 찍거나 이메일을 통해 이미지를 받을 경우에 유용합니다. FormatLabel는 디버깅 및 사용자 확인 중에 감지된 바코드 형식을 디코딩된 값과 함께 표시합니다.
스캔 상태 피드백 추가
정교한 경험을 위해 처리 중일 때 표시되는 ActivityIndicator로 스캔 버튼을 감싸는 것을 고려해보세요. IronBarcode의 비동기 API 덕분에 IsRunning = true 설정 후 BarcodeReader.ReadAsync를 호출하고 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");
}
}
}
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");
}
}
}
Imports IronBarCode
Imports IronSoftware.Drawing
Namespace BarcodeScannerApp
Public Partial Class MainPage
Inherits ContentPage
Public Sub New()
InitializeComponent()
End Sub
Private Async Sub OnScanClicked(sender As Object, e As EventArgs)
Await ScanFromSource(Function() MediaPicker.Default.CapturePhotoAsync())
End Sub
Private Async Sub OnPickFromGalleryClicked(sender As Object, e As EventArgs)
Await ScanFromSource(Function() MediaPicker.Default.PickPhotoAsync())
End Sub
Private Async Function ScanFromSource(sourceFunc As Func(Of Task(Of FileResult?))) As Task
Try
Dim photo = Await sourceFunc()
If photo Is Nothing Then Return
Using stream = Await photo.OpenReadAsync()
Using memoryStream = New MemoryStream()
Await stream.CopyToAsync(memoryStream)
Dim imageBytes = memoryStream.ToArray()
' Show the captured image in the UI
CapturedImage.Source = ImageSource.FromStream(Function() New MemoryStream(imageBytes))
' Process with IronBarcode
Dim bitmap = AnyBitmap.FromBytes(imageBytes)
Dim options = New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = False
}
Dim results = Await BarcodeReader.ReadAsync(bitmap, options)
If results.Any() Then
Dim first = results.First()
ResultLabel.Text = $"Value: {first.Value}"
FormatLabel.Text = $"Format: {first.BarcodeType}"
Else
ResultLabel.Text = "No barcode detected"
FormatLabel.Text = String.Empty
End If
End Using
End Using
Catch ex As FeatureNotSupportedException
Await DisplayAlert("Unsupported", "Camera is not available on this device.", "OK")
Catch ex As PermissionException
Await DisplayAlert("Permission Required", "Please grant camera permission in Settings.", "OK")
Catch ex As Exception
Await DisplayAlert("Error", $"Scanning failed: {ex.Message}", "OK")
End Try
End Function
End Class
End Namespace
이 구현은 카메라와 갤러리 경로 간에 이미지 처리 로직을 중복하지 않도록 공유 ScanFromSource 도우미 메서드를 사용합니다. AnyBitmap.FromBytes 메서드는 JPEG, PNG, WebP 및 기타 일반적인 이미지 형식을 자동으로 처리합니다. 수동 형식 감지가 필요 없습니다.
결과 객체는 디코딩된 문자열인 first.Value, 형식 열거형인 first.BarcodeType, 감지된 바코드 영역의 크롭된 이미지인 first.BarcodeImage 등 여러 속성을 제공합니다. BarcodeResult 클래스 문서에서 전체 목록을 참조하세요.
스캔 구현 테스트
코드를 준비한 후 표준 바코드를 대상으로 테스트할 수 있습니다:

스캔 후 디코딩된 값이 화면에 나타납니다:

고급 스캐닝 옵션은 어떻게 구성하나요?
IronBarcode는 특정 사용 사례에 맞춰 감지 동작을 세밀하게 조정할 수 있도록 하는 BarcodeReaderOptions 객체를 노출합니다. 이러한 옵션을 이해하면 애플리케이션 필요에 따라 속도와 정확성 간의 균형을 맞출 수 있습니다.
특정 바코드 유형 대상으로 삼기
예상되는 바코드 유형을 명확히 지정하면 IronBarcode가 필요하지 않은 형식 검사를 건너뛰기 때문에 처리 시간이 크게 줄어듭니다:
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};
var results = await BarcodeReader.ReadAsync(bitmap, options);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
ExpectBarcodeTypes = BarcodeEncoding.QRCode | BarcodeEncoding.Code128
};
var results = await BarcodeReader.ReadAsync(bitmap, options);
Imports System.Threading.Tasks
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True,
.ExpectBarcodeTypes = BarcodeEncoding.QRCode Or BarcodeEncoding.Code128
}
Dim results = Await BarcodeReader.ReadAsync(bitmap, options)

ExpectMultipleBarcodes = true을 설정하면 IronBarcode가 첫 번째 결과를 찾은 후에도 스캔을 계속하게 되며, 이는 낱장 표에 여러 바코드가 포함될 수 있는 창고 작업 흐름에 필수적입니다.
읽기 속도 옵션
ReadingSpeed 열거형은 네 가지 수준을 제공합니다: ExtremeDetail, Detailed, Balanced, QuickScan. 깨끗하고 잘 조명된 바코드가 있는 대량 시나리오에서는 QuickScan를 사용하세요. 저해상도 카메라 캡처에서 스캔하거나 일부 손상된 라벨을 스캔할 때는 Detailed 또는 ExtremeDetail로 전환하세요.
이미지 보정 필터 및 신뢰도 임계값을 포함하여 BarcodeReaderOptions를 조정하는 방법 에 대한 자세한 내용은 설명서의 예제를 참조하십시오.
이미지 보정 및 전처리
IronBarcode는 회전된, 비틀어진 또는 조명이 좋지 않은 바코드를 자동으로 처리하는 내장 이미지 보정을 포함합니다. 또한 BarcodeReaderOptions.ImageFilters를 통해 사전 처리 필터를 수동으로 적용할 수 있습니다:
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Detailed,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter(1.2f)
}
};
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Detailed,
ImageFilters = new ImageFilterCollection
{
new SharpenFilter(),
new ContrastFilter(1.2f)
}
};
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Detailed,
.ImageFilters = New ImageFilterCollection From {
New SharpenFilter(),
New ContrastFilter(1.2F)
}
}
전처리 필터는 특히 낮은 품질의 카메라 센서를 가진 오래된 Android 디바이스를 대상으로 하거나, 사용자들이 창고나 실외 환경과 같은 최적이 아닌 조명 조건에서 바코드를 사진 찍는 경우에 유용합니다.
일반 문제 해결 시나리오는 어떻게 처리하나요?
잘 구성된 MAUI 바코드 스캐너일지라도 장치별 동작, 이미지 품질 문제 또는 플랫폼 제약으로 인해 문제가 발생할 수 있습니다.
카메라가 열리지 않음
카메라 실행에 실패하는 경우 AndroidManifest.xml와 Info.plist에 권한이 올바르게 선언되어 있는지 확인하세요. 그런 다음, 핫 리로드가 아닌 클린 빌드에서 앱을 다시 배포하세요. Android에서는 테스트 디바이스가 비표준 카메라 구성을 사용하는지 여부도 확인하세요 -- 여러 개의 카메라가 있는 일부 장치는 명시적 렌즈 선택이 필요합니다.
시뮬레이터에서는 MediaPicker.CapturePhotoAsync()가 지원되지 않습니다. 물리적 장치에서 항상 카메라 기능을 테스트하세요. 에뮬레이터는 갤러리 선택용으로 PickPhotoAsync를 지원하므로 미리 로드된 이미지로 기본 UI 테스트를 수행할 수 있습니다.
낮은 스캔 정확도
IronBarcode가 결과를 반환하지 않거나 잘못된 값을 반환할 경우, 다음 조정을 시도하십시오:
Speed를ReadingSpeed.Detailed또는ExtremeDetail로 증가시키세요- 이미지 필터 파이프라인에
SharpenFilter및ContrastFilter를 추가하세요 - 캡처한 이미지 해상도가 최소 720p인지 확인하십시오. 낮은 해상도는 Data Matrix와 같은 밀집 형식의 감지를 놓치기 쉽습니다.
- 바코드 유형이
ExpectBarcodeTypes마스크에 포함되어 있는지 확인하세요
IronBarcode 문제 해결 가이드는 형식 관련 문제에 대한 추가 진단 단계를 다룹니다.
메모리 관리
대형 카메라 이미지는 MemoryStream에 로드될 때 상당한 메모리를 소비합니다. 모든 스트림 객체에 대해 항상 using 문을 사용하여 폐기를 보장하세요. 사용자가 여러 항목을 순차적으로 스캔하는 지속적인 스캔 워크플로에서는 가비지 수집기를 기다리는 대신 처리 후 bitmap.Dispose()를 명시적으로 호출하세요.
제한된 힙 공간이 있는 Android 장치에서는 IronBarcode에 이미지를 전달하기 전에 이미지를 다운샘플링하는 것을 고려하십시오, 스캔하려는 바코드가 깔끔하고 높은 대비를 가지며 정확한 디코딩에 전체 해상도가 필요하지 않은 경우입니다.
플랫폼 특정 iOS 동작
iOS에서는 앱이 처음 카메라 사용 권한을 요청할 때 시스템에서 일회성 대화상자를 표시합니다. 사용자가 이를 거부하면, CapturePhotoAsync에 대한 후속 호출에서 PermissionException이(가) 발생합니다. 이 경우 AppInfo.ShowSettingsUI()을 사용하여 사용자를 설정으로 안내하세요.
App Store에 제출하기 전에 NSCameraUsageDescription가 Info.plist에 있는지 확인하세요. 개인정보 문자열이 누락되면 검토 팀에서 자세한 설명 없이 자동으로 거부됩니다. 카메라 접근에 대한 권장 사항은 Apple Human Interface Guidelines를 참조하십시오.
다음 단계는 무엇입니까?
이제 IronBarcode와 함께 작동하는 MAUI 바코드 스캐너가 있으므로, 애플리케이션 요구 사항에 따라 여러 경로가 있습니다:
- 바코드 생성 -- IronBarcode 문자열 데이터를 기반으로 QR 코드, Code 128 라벨 및 기타 형식의 바코드를 생성하는 API를 제공합니다.
- 배치 스캔 --
BarcodeReader.ReadAsync와ExpectMultipleBarcodes = true를 사용하여 여러 이미지 파일을 루프에서 처리합니다; 배치 스캔 예제를 참조하십시오 - PDF 바코드 추출 -- IronBarcode는 동일한
BarcodeReader클래스를 사용하여 PDF 문서에 내장된 바코드를 읽을 수 있습니다; PDF 바코드 판독 관련 문서를 살펴보세요. - 스타일링 및 브랜딩 -- 생성된 바코드의 시각적 출력을 색상, 로고, 주석으로 사용자 정의합니다; 바코드 스타일링 옵션을 참조하세요
- 기타 Iron Software 제품 – MAUI 앱에서 PDF 생성, OCR 또는 스프레드시트 지원도 필요한 경우, 일관된 크로스 플랫폼 기능을 제공하는 전체 Iron Suite를 탐색하십시오
제한 없이 배포할 수 있는 무료 체험판 라이선스로 시작하여 평가 기간 동안 사용하십시오. 제품 라이선싱 옵션 및 대량 가격 정보를 보려면 IronBarcode 가격 페이지를 방문하십시오. IronBarcode 문서 포털과 IronBarcode GitHub 리포지토리는 추가 코드 예제와 커뮤니티 지원을 제공합니다.
자주 묻는 질문
MAUI 바코드 스캐너에 IronBarcode 사용하는 장점은 무엇입니까?
IronBarcode 이미지 레이어에서 바코드를 처리하고, 오프라인에서 작동하며, 30가지 이상의 형식을 지원하고, 추가 설정 없이 기울어진 각도나 열악한 조명과 같은 까다로운 환경에서도 처리할 수 있습니다.
IronBarcode 한 이미지에서 여러 개의 바코드를 감지할 수 있습니까?
예. BarcodeReaderOptions에서 ExpectMultipleBarcodes = true로 설정하고 BarcodeReader.ReadAsync를 호출하세요. IronBarcode 감지된 모든 바코드를 결과 컬렉션에 반환합니다.
MAUI에서 안드로이드 및 iOS 카메라 권한을 어떻게 설정하나요?
Android의 경우 AndroidManifest.xml 파일에 CAMERA uses-permission 및 uses-feature 요소를 추가하세요. iOS의 경우 Info.plist 파일에 사람이 읽기 쉬운 설명이 포함된 NSCameraUsageDescription을 추가하세요.
IronBarcode 오프라인 바코드 스캔을 지원합니까?
네. IronBarcode 외부 서버로 데이터를 전송하지 않고 기기 내에서 이미지를 완전히 처리하므로 개인 정보 보호에 민감한 애플리케이션에 중요합니다.
IronBarcode MAUI에서 어떤 바코드 형식을 지원하나요?
IronBarcode QR 코드, Code 128, Code 39, EAN-13, UPC-A, Data Matrix, PDF417, Aztec, MaxiCode 등 다양한 바코드 형식을 지원합니다. BarcodeEncoding 플래그를 통해 특정 형식을 대상으로 지정할 수 있습니다.
화질이 낮은 이미지의 스캔 정확도를 높이려면 어떻게 해야 할까요?
읽기 속도를 상세 또는 극도로 상세하게 설정하고, 이미지 필터에 선명도 필터와 대비 필터를 추가하고, 캡처된 이미지의 해상도가 최소 720p인지 확인하십시오.
IronBarcode MAUI 앱에서 PDF 파일의 바코드를 읽을 수 있습니까?
예. IronBarcode의 BarcodeReader 클래스는 이미지 파일에 사용되는 것과 동일한 ReadAsync API를 사용하여 PDF 문서에 포함된 바코드를 추출할 수 있습니다.
카메라 접근이 거부되었을 때 발생하는 PermissionException은 어떻게 처리해야 하나요?
try/catch 블록에서 PermissionException을 처리하고 AppInfo.ShowSettingsUI()를 호출하여 사용자가 카메라 접근 권한을 다시 활성화할 수 있도록 기기 설정으로 이동시키세요.




