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 앱 프로젝트를 만드는 것으로 시작하세요. 이름을 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"
IronSoftware 웹사이트에서 무료 체험판 라이선스 키를 받으세요. 체험판 키는 개발 도중 시간 제한 없이 모든 기능을 평가할 수 있도록 하며, 출력에는 전체 라이선스를 적용할 때까지 체험판 워터마크가 포함될 수 있습니다.
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 스토어에 알립니다. 이러한 사항이 없으면 안드로이드 기기는 권한 요청을 허가할 수 있지만 여전히 내부적으로 카메라 접근을 차단할 수 있습니다.
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 블록에서 이를 재설정할 수 있으므로 이 작업이 간단합니다.
바코드 리더 기능은 어떻게 구현하나요?
코드-55080--@@에서 핵심 스캔 로직을 구현하세요. 아래 코드는 적절한 비동기 패턴과 오류 처리를 통해 카메라 캡처 및 갤러리 선택을 모두 처리합니다:
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를 사용하여 MAUI 바코드 스캐너를 만드는 방법: 그림 2 - 테스트 바코드 입력
스캔 후 디코딩된 값이 화면에 나타납니다:
고급 스캐닝 옵션은 어떻게 구성하나요?
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)
IronBarcode를 사용하여 MAUI 바코드 스캐너를 만드는 방법: 그림 4 - 동일한 이미지에서 여러 코드 스캔
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가 결과를 반환하지 않거나 잘못된 값을 반환할 경우, 다음 조정을 시도하십시오:
- @@--코드-55101--@@을 @@--코드-55102--@@ 또는 @@--코드-55103--@@로 늘리세요
- 이미지 필터 파이프라인에
SharpenFilter및ContrastFilter추가하기 - 캡처한 이미지 해상도가 최소 720p인지 확인하십시오. 낮은 해상도는 Data Matrix와 같은 밀집 형식의 감지를 놓치기 쉽습니다.
- 바코드 유형이
ExpectBarcodeTypes마스크에 포함되어 있는지 확인하세요
IronBarcode 문제 해결 가이드는 형식 관련 문제에 대한 추가 진단 단계를 다룹니다.
메모리 관리
대용량 카메라 이미지는 MemoryStream에 로드할 때 상당한 메모리를 소모합니다. 모든 스트림 객체에는 항상 using 문을 사용하여 폐기할 수 있도록 하세요. 사용자가 여러 항목을 순차적으로 스캔하는 연속 스캔 워크플로우의 경우, 가비지 수집기를 기다리지 말고 처리 후 bitmap.Dispose()를 명시적으로 호출하세요.
제한된 힙 공간이 있는 Android 장치에서는 IronBarcode에 이미지를 전달하기 전에 이미지를 다운샘플링하는 것을 고려하십시오, 스캔하려는 바코드가 깔끔하고 높은 대비를 가지며 정확한 디코딩에 전체 해상도가 필요하지 않은 경우입니다.
플랫폼 특정 iOS 동작
iOS에서는 앱이 처음 카메라 사용 권한을 요청할 때 시스템에서 일회성 대화상자를 표시합니다. 사용자가 거부하면 이후 CapturePhotoAsync에 대한 호출은 PermissionException를 반환합니다. 이 경우에는 AppInfo.ShowSettingsUI()를 사용하여 사용자를 설정으로 안내하여 처리하세요.
앱 스토어에 제출하기 전에 @@--코드-55113--@@가 @@--코드-55114--@@에 존재하는지 확인하세요. 개인정보 문자열이 누락되면 검토 팀에서 자세한 설명 없이 자동으로 거부됩니다. 카메라 접근에 대한 권장 사항은 Apple Human Interface Guidelines를 참조하십시오.
다음 단계는 무엇입니까?
이제 IronBarcode와 함께 작동하는 MAUI 바코드 스캐너가 있으므로, 애플리케이션 요구 사항에 따라 여러 경로가 있습니다:
- 바코드 생성 -- IronBarcode 문자열 데이터를 기반으로 QR 코드, Code 128 라벨 및 기타 형식의 바코드를 생성하는 API를 제공합니다.
- 일괄 스캔 -
BarcodeReader.ReadAsync와ExpectMultipleBarcodes = true를 사용하여 여러 이미지 파일을 반복적으로 처리합니다; 배치 스캐닝 예제를 참조하세요 - PDF 바코드 추출 -- IronBarcode는 동일한
BarcodeReader클래스를 사용하여 PDF 문서에 내장된 바코드를 읽을 수 있습니다; PDF 바코드 판독 관련 문서를 살펴보세요. - 스타일링 및 브랜딩 -- 생성된 바코드의 시각적 출력을 색상, 로고, 주석으로 사용자 정의합니다; 바코드 스타일링 옵션을 참조하세요
- 다른 IronSoftware 제품 -- 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()를 호출하여 사용자가 카메라 접근 권한을 다시 활성화할 수 있도록 기기 설정으로 이동시키세요.



