C#에서 스트림을 통해 바코드를 읽는 방법
barKoder SDK에서 IronBarcode로의 마이그레이션
Barkoder는 공식 .NET 패키지 — Plugin.Maui.Barkoder와 Barkoder.Xamarin를 제공하지만, 둘 다 엄격히 모바일 카메라 스캔 구성 요소입니다. MatrixSight 알고리즘, DeBlur 모드, 다중 바코드 감지, DPM 지원 등을 위해 barKoder를 평가하고 파일 입력, PDF 처리, 서버 측 배포, 또는 바코드 생성을 필요로 발견했다면, .NET에서 barKoder는 그 중 어떤 것도 제공하지 않습니다. 이 가이드는 각 요구 사항을 IronBarcode가 어떻게 충족하는지, 모든 시나리오에 대한 작동하는 코드를 포함하여 보여줍니다.
왜 barKoder SDK에서 마이그레이션해야 하는가
barKoder 평가에서 IronBarcode로 이전하는 팀은 일관되게 동일한 촉발 요인을 보고합니다:
모바일 카메라 표면 전용: Barkoder의 .NET 범위는 Plugin.Maui.Barkoder (버전 1.6.8, 2026년 3월) 및 Barkoder.Xamarin (버전 1.3.0)입니다. 두 패키지는 네이티브 iOS / Android SDK를 감싸고 BarkoderView 카메라 컨트롤을 노출합니다. 일반 목적의 Barkoder.NET 라이브러리가 없고, ASP.NET Core 대상이 없으며, 콘솔/워크스테이션/데스크톱 대상이 없으며, Linux 서버 대상도 없습니다.
읽기 전용 아키텍처: Barkoder는 스캔 전용 SDK입니다. 애플리케이션에서 바코드를 생성해야 하는 경우(예: 배송 라벨 인쇄, 포장용 QR 코드 생성, 문서에 코드 삽입 등) Barkoder는 아무런 기능도 제공하지 않습니다. 프로젝트 도중에 생성 요구사항을 발견한 팀은 워크플로의 양쪽 측면을 모두 포괄하는 라이브러리가 필요합니다.
PDF 처리 불가: .NET Enterprise 애플리케이션에서 바코드는 송장, 배송 명세서, 의료 기록, 규정 준수 문서와 같은 PDF 문서에 자주 나타납니다. Barkoder는 이러한 워크플로에 대한 개념이 없습니다. 이 프로그램은 모바일 기기의 실시간 카메라 입력을 위해 설계되었으며 PDF 파일을 처리할 수 없습니다.
서버 측 배포가 필요 없습니다. Barkoder의 처리 모델은 기기 내 모바일 스캔 방식입니다. 이 애플리케이션은 ASP.NET Core, Azure Functions, Docker 컨테이너 또는 AWS Lambda에서 실행될 수 없습니다. 서버 측 바코드 API, 문서 처리 파이프라인 또는 클라우드 함수를 구축하는 팀은 Barkoder를 배포할 수 있는 방법이 없습니다.
파일/스트림 입력 없음: MAUI 앱 내부에서도 BarkoderView는 라이브 카메라 프레임만을 소비합니다. 파일 경로, 바이트 배열 또는 Stream 오버로드가 없으므로 업로드된 이미지 또는 갤러리 사진을 처리하려면 다른 라이브러리가 필요합니다.
근본적인 경계
Barkoder의 MAUI 표면은 카메라에 묶여 있습니다. Plugin.Maui.Barkoder를 사용하는 .NET 개발자는 다음과 같은 코드를 작성합니다:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.SetFlashEnabled(false);
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.SetFlashEnabled(False)
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
End Class
IronBarcode는 동일한 데이터에 대해 파일/스트림/PDF API를 제공합니다:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("scanned-label.png", options);
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("scanned-label.png", options)
For Each result In results
Console.WriteLine($"Format: {result.Format} | Value: {result.Value}")
Next
IronBarcode vs barKoder SDK: 기능 비교
| 기능 | barKoder SDK | IronBarcode |
|---|---|---|
| .NET /C# API | MAUI / Xamarin 카메라 UI 전용 | 전체 .NET 인터페이스 |
| NuGet 패키지 | Plugin.Maui.Barkoder, Barkoder.Xamarin |
BarCode |
| 손상된 바코드 복구 | 매트릭스사이트 / 디블러 | ReadingSpeed.ExtremeDetail + ML |
| 다중 바코드 감지 | 예 | ExpectMultipleBarcodes = true |
| 데이터매트릭스 / DPM | 예 (읽기 전용) | 예 — 읽고 생성합니다. |
| QR 코드 | 예 (읽기 전용) | 예 — 읽고 생성합니다. |
| PDF417 | 예 | 예 |
| 아즈텍 | 예 | 예 |
| 코드128, 코드39, EAN | 예 | 예 — 50개 이상의 형식 |
| 바코드 생성 | None | 전체 — 모든 형식 |
| PDF 처리 | None | 내부 지원 |
| 파일 / 스트림 / byte[] 입력 | 없음 — 카메라 프레임만 | 예 |
| ASP.NET Core | None | 전체 |
| Docker/리눅스 | None | 전체 |
| Azure Functions | None | 전체 |
| AWS Lambda | None | 전체 |
| 오프라인 / 에어갭 | 기기 내에서 | 완전 현지 |
| 비동기/대기 | 콜백 기반 | 전체 |
| 의존성 주입 | None | 완전한 .NET DI |
| MAUI를 통한 iOS | Plugin.Maui.Barkoder (카메라 UI) |
프로그램적 (파일 / 스트림) |
| MAUI를 통한 안드로이드 | Plugin.Maui.Barkoder (카메라 UI) |
프로그램적 (파일 / 스트림) |
| 가격 | 연간 구독 | 749달러부터 영구적으로 |
빠른 시작: barKoder SDK에서 IronBarcode로 마이그레이션
1단계: NuGet 패키지 교체
IronBarcode 설치하세요:
dotnet add package BarCode
프로젝트에서 Plugin.Maui.Barkoder 또는 Barkoder.Xamarin를 비카메라 워크플로에만 사용하는 경우(또는 파일/PDF 처리로 완전히 이동하는 경우) 제거하십시오:
dotnet remove package Plugin.Maui.Barkoder
dotnet remove package Plugin.Maui.Barkoder
앱에 여전히 라이브 카메라 UI가 필요한 경우 Plugin.Maui.Barkoder를 유지하고, 파일/PDF/생성을 위해 IronBarcode를 함께 추가하십시오.
단계 2: 네임스페이스 업데이트
더 이상 필요하지 않은 바코더 네임스페이스를 제거하고IronBarcode네임스페이스를 추가하십시오:
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
// Remove (if no longer needed)
// using Barkoder.Maui;
// Add
using IronBarCode;
Imports IronBarCode
단계 3: 라이선스 초기화
애플리케이션 시작 시 라이선스 초기화를 추가하십시오 — ASP.NET Core의 경우 Program.cs 안에, 또는 콘솔이나 데스크톱 앱에서 바코드 작업 전:
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
코드 마이그레이션 예제
이미지에서 바코드 읽기
코어 읽기 시나리오가 barKoder의 라이브 카메라 프레임에서 IronBarcode의 파일/스트림/byte[] API로 매핑됩니다.
barKoder MAUI 접근 방법:
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
// dotnet add package Plugin.Maui.Barkoder
using Barkoder.Maui;
public partial class ScanPage : ContentPage, IBarkoderDelegate
{
public ScanPage()
{
InitializeComponent();
BarkoderView.StartScanning(this);
}
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
{
Console.WriteLine($"Barcode: {r.TextualData}");
Console.WriteLine($"Type: {r.BarcodeTypeName}");
}
}
}
Imports Barkoder.Maui
Public Partial Class ScanPage
Inherits ContentPage
Implements IBarkoderDelegate
Public Sub New()
InitializeComponent()
BarkoderView.StartScanning(Me)
End Sub
Public Sub DidFinishScanning(result As BarcodeResult()) Implements IBarkoderDelegate.DidFinishScanning
For Each r In result
Console.WriteLine($"Barcode: {r.TextualData}")
Console.WriteLine($"Type: {r.BarcodeTypeName}")
Next
End Sub
End Class
IronBarcode 접근 방식:
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
// dotnet add package BarCode
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var results = BarcodeReader.Read("scan.png");
foreach (var result in results)
{
Console.WriteLine($"Format: {result.Format}");
Console.WriteLine($"Value: {result.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim results = BarcodeReader.Read("scan.png")
For Each result In results
Console.WriteLine($"Format: {result.Format}")
Console.WriteLine($"Value: {result.Value}")
Next
IronBarcode의 BarcodeReader.Read()는 바코드 형식을 사전에 지정하지 않고도 자동으로 감지합니다. 이 호출 방식은 모바일 기기로 촬영하여 서버에 업로드한 이미지, 파일 시스템에서 불러온 이미지, 또는 스트림에서 바이트 배열로 수신한 이미지 모두에 적용됩니다. 자세한 읽기 자료는 IronBarcode 읽기 가이드를 참조하십시오.
손상된 바코드 복구(흐릿함 제거 모드와 동일)
바코더의 디블러(DeBlur) 모드는 가장 많이 언급되는 기능 중 하나입니다. IronBarcode는 ReadingSpeed.ExtremeDetail를 통해 파일 입력에 해당하는 기능을 제공합니다.
barKoder MAUI 접근 방법:
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
// Live camera scanning with DeBlur enabled via configuration
using Barkoder.Maui;
BarkoderView.SetEnabledBarcodeTypes(/* configure formats */);
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Recovered: {r.TextualData}");
}
Imports Barkoder.Maui
' Live camera scanning with DeBlur enabled via configuration
BarkoderView.SetEnabledBarcodeTypes() ' configure formats
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Recovered: {r.TextualData}")
Next
End Sub
IronBarcode 접근 방식:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("worn-shipping-label.png", options);
if (results.Any())
{
Console.WriteLine($"Recovered barcode: {results.First().Value}");
}
else
{
Console.WriteLine("Could not decode — image quality too low");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("worn-shipping-label.png", options)
If results.Any() Then
Console.WriteLine($"Recovered barcode: {results.First().Value}")
Else
Console.WriteLine("Could not decode — image quality too low")
End If
ReadingSpeed.ExtremeDetail는 멀티 패스 ML 기반 이미지 분석 파이프라인을 실행하며, 대비 향상, 선명화, 회전 보정, 손상 복구를 적용한 후 디코딩을 시도합니다. 배치 워크플로의 경우 기본으로 ReadingSpeed.Balanced를 사용하고, ExtremeDetail가 Balanced 디코딩에 실패한 이미지만을 위해 대체로 사용하십시오.
다중 바코드 감지
Barkoder의 다중 바코드 프레임 스캐닝은 IronBarcode의 ExpectMultipleBarcodes 옵션에 매핑되며, 이는 이미지와 PDF 모두에 효과적입니다.
barKoder MAUI 접근 방법:
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
// Live camera frame returns BarcodeResult[]; multi-scan configured on the view
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}");
}
Imports Barkoder.Maui
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"{r.BarcodeTypeName}: {r.TextualData}")
Next
End Sub
IronBarcode 접근 방식:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
// Works identically on images and PDFs
var results = BarcodeReader.Read("shipping-manifest.pdf", options);
foreach (var barcode in results)
{
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
' Works identically on images and PDFs
Dim results = BarcodeReader.Read("shipping-manifest.pdf", options)
For Each barcode In results
Console.WriteLine($"Page {barcode.PageNumber} | {barcode.Format} | {barcode.Value}")
Next
이것은 단일 메서드 호출입니다. 페이지 추출도 없고, 여러 번 요청할 필요도 없으며, 바코드별 처리 오버헤드도 없습니다. PDF 파일은 네이티브 방식으로 읽을 수 있습니다.
데이터매트릭스 생성 및 읽기
Barkoder는 DataMatrix를 읽을 수는 있지만 생성할 수는 없습니다.IronBarcode산업용 추적 시스템에서 흔히 요구되는 워크플로의 양쪽 측면을 모두 포괄합니다.
barKoder MAUI 접근 방법:
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
// Camera-only DataMatrix scanning; no generation available
using Barkoder.Maui;
BarkoderView.StartScanning(this);
public void DidFinishScanning(BarcodeResult[] result)
{
foreach (var r in result)
Console.WriteLine($"Part ID: {r.TextualData}");
}
Imports Barkoder.Maui
' Camera-only DataMatrix scanning; no generation available
BarkoderView.StartScanning(Me)
Public Sub DidFinishScanning(result As BarcodeResult())
For Each r In result
Console.WriteLine($"Part ID: {r.TextualData}")
Next
End Sub
IronBarcode 접근 방식:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix)
.SaveAsPng("part-label.png");
// Read DataMatrix from a scanned industrial part image
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
var results = BarcodeReader.Read("etched-part-photo.png", options);
foreach (var result in results)
{
Console.WriteLine($"Part Serial: {result.Value}");
Console.WriteLine($"Barcode Type: {result.Format}");
}
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' Generate a DataMatrix barcode for a part label
BarcodeWriter.CreateBarcode("PART-SN-20240315-A42291", BarcodeEncoding.DataMatrix) _
.SaveAsPng("part-label.png")
' Read DataMatrix from a scanned industrial part image
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
Dim results = BarcodeReader.Read("etched-part-photo.png", options)
For Each result In results
Console.WriteLine($"Part Serial: {result.Value}")
Console.WriteLine($"Barcode Type: {result.Format}")
Next
지원되는 인코딩 형식 및 생성 옵션의 전체 목록은 IronBarcode 바코드 생성 설명서를 참조하십시오.
브랜딩이 포함된 QR 코드 생성
Barkoder는 바코드를 생성하지 않습니다.IronBarcode마케팅, 포장 및 제품 식별 워크플로에서 일반적으로 요구되는 로고가 내장된 QR 코드를 생성합니다.
barKoder MAUI 접근 방법:
Not available — Plugin.Maui.Barkoder is a reader-only SDK with no
generation API on any platform.
IronBarcode 접근 방식:
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
// QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500)
.AddBrandLogo("company-logo.png")
.SaveAsPng("branded-qr.png");
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
' QR code with brand logo embedded at centre
QRCodeWriter.CreateQrCode("https://parts.example.com/product/A42", 500) _
.AddBrandLogo("company-logo.png") _
.SaveAsPng("branded-qr.png")
ASP.NET Core 바코드 API 엔드포인트
Barkoder는 서버 측 배포 모델을 사용하지 않습니다. 모바일 스캔 업로드 엔드포인트와 유사한 기능, 즉 모든 클라이언트로부터 이미지를 수신하고 바코드 데이터를 반환하는 기능을 구현하려면 .NET 라이브러리가 필요합니다.
barKoder 접근 방법:
Not available — Plugin.Maui.Barkoder runs only inside a MAUI app head
against a live camera. There is no ASP.NET Core integration and no
server-side execution model.
IronBarcode 접근 방식:
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
// In Program.cs
using IronBarCode;
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
app.MapPost("/api/scan", async (IFormFile file) =>
{
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var options = new BarcodeReaderOptions
{
Speed = ReadingSpeed.Balanced,
ExpectMultipleBarcodes = true,
};
var results = BarcodeReader.Read(imageBytes, options);
return Results.Ok(results.Select(r => new
{
Value = r.Value,
Format = r.Format.ToString(),
}));
});
Imports IronBarCode
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
app.MapPost("/api/scan", Async Function(file As IFormFile) As Task(Of IResult)
Using stream = file.OpenReadStream()
Dim imageBytes(CInt(stream.Length) - 1) As Byte
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim options As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.Balanced,
.ExpectMultipleBarcodes = True
}
Dim results = BarcodeReader.Read(imageBytes, options)
Return Results.Ok(results.Select(Function(r) New With {
.Value = r.Value,
.Format = r.Format.ToString()
}))
End Using
End Function)
barKoder SDKAPI를 IronBarcode로 매핑한 참조
이 테이블은 barKoder의 MAUI / Xamarin 표면을IronBarcode호출로 매핑한 것입니다:
| barKoder API | IronBarcode동등품 |
|---|---|
| 라이센스는 barKoder 포털/구성에서 설정됨 | IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY" |
DeBlur 설정은 BarkoderView에서 가능합니다 |
Speed = ReadingSpeed.ExtremeDetail |
멀티 스캔 설정은 BarkoderView에서 가능합니다 |
ExpectMultipleBarcodes = true |
SetEnabledBarcodeTypes(...) |
BarcodeEncoding.<Format> (읽기 시 자동 감지) |
BarkoderView.StartScanning(IBarkoderDelegate) |
BarcodeReader.Read("image.png") — 동기식 |
BarcodeResult.TextualData |
result.Value |
BarcodeResult.BarcodeTypeName |
result.Format |
| MatrixSight 손상 복구 | ML 전처리와 함께 ReadingSpeed.ExtremeDetail |
| 라이브 카메라 프레임 입력 | 파일 경로 / Stream / byte[] 입력 |
| 온디바이스 처리 | 완전 로컬 연결 - 네트워크 통화 없음 |
| 세대 지원 없음 | BarcodeWriter.CreateBarcode() / QRCodeWriter.CreateQrCode() |
| PDF를 지원하지 않습니다. | BarcodeReader.Read("document.pdf") — 네이티브 |
| 서버 배포 없음 | ASP.NET Core, Docker, Azure Functions, Lambda 환경에서 작동합니다. |
| 페이지 인덱스 없음 (적용 불가) | result.PageNumber — PDF 읽기 시 사용 가능 |
일반적인 마이그레이션 문제와 해결책
문제 1: NuGet 패키지 이름
barKoder SDK: 공식 .NET 패키지는 Plugin.Maui.Barkoder와 Barkoder.Xamarin입니다. 어느 쪽도 비모바일 시나리오를 다루지 않습니다.
해결책:IronBarcode설치:
dotnet add package BarCode
만약 Plugin.Maui.Barkoder이(가) 더 이상 필요 없다면(완전히 파일/PDF/서버 처리로 이동하는 경우), 제거하십시오:
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
dotnet remove package Plugin.Maui.Barkoder
dotnet add package BarCode
문제 2: 카메라 프레임 입력 대 파일 입력
barKoder SDK: 모든 입력은 라이브 카메라 프레임으로 제공되며, 연속적인 비디오 피드는 장치에서 처리됩니다. 파일 경로 입력 모드는 없습니다.
해결 방법:IronBarcode파일, 스트림, 바이트 배열 및 System.Drawing.Image 객체를 허용합니다. 모바일 클라이언트에서 업로드된 이미지의 경우 요청 스트림을 직접 읽습니다.
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
using var stream = file.OpenReadStream();
var imageBytes = new byte[stream.Length];
await stream.ReadAsync(imageBytes);
var results = BarcodeReader.Read(imageBytes, options);
Imports System.IO
Using stream = file.OpenReadStream()
Dim imageBytes = New Byte(stream.Length - 1) {}
Await stream.ReadAsync(imageBytes, 0, imageBytes.Length)
Dim results = BarcodeReader.Read(imageBytes, options)
End Using
문제 3: 콜백 기반 API vs 동기식 결과
barKoder SDK: BarkoderView.StartScanning(IBarkoderDelegate)은(는) 델리게이트/콜백 패턴을 사용하며, DidFinishScanning(BarcodeResult[])은(는) 바코드가 카메라 피드에서 감지될 때 비동기으로 실행됩니다.
솔루션: IronBarcode의 BarcodeReader.Read()은(는) 동기식으로 IEnumerable<BarcodeResult>를 직접 반환합니다. 비동기가 필요한 ASP.NET Core 환경에서 Task.Run() 안에 감싸십시오:
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
var results = await Task.Run(() => BarcodeReader.Read(imageBytes, options));
Dim results = Await Task.Run(Function() BarcodeReader.Read(imageBytes, options))
문제 4: 디블러 모드 구성
barKoder SDK: DeBlur은(는) 스캐닝이 시작되기 전 BarkoderView 설정에 활성화되며 모든 후속 스캔에 적용됩니다.
솔루션: IronBarcode에서 상응하는 기능은 ReadingSpeed.ExtremeDetail이며, BarcodeReaderOptions를 통해 읽기마다 설정됩니다. 옵션 객체를 한 번만 생성하고 재사용하세요.
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
var deepOptions = new BarcodeReaderOptions
{
Speed = ReadingSpeed.ExtremeDetail,
ExpectMultipleBarcodes = false,
};
// Reuse across multiple reads
var results = BarcodeReader.Read("image.png", deepOptions);
Imports System
Dim deepOptions As New BarcodeReaderOptions With {
.Speed = ReadingSpeed.ExtremeDetail,
.ExpectMultipleBarcodes = False
}
' Reuse across multiple reads
Dim results = BarcodeReader.Read("image.png", deepOptions)
제5호: 차세대 역량 부족 문제
barKoder SDK: Barkoder는 읽기 전용입니다. 바코드나 QR 코드를 생성하는 API는 없습니다.
해결책:IronBarcode바코드 판독과 생성 모두를 지원합니다. 표준 형식에는 BarcodeWriter를 사용하고, QR 코드에는 QRCodeWriter를 사용하십시오:
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
// Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128)
.SaveAsPng("shipping-label.png");
// QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500)
.SaveAsPng("product-qr.png");
// Get as bytes for embedding in API response or PDF
byte[] barcodeBytes = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128)
.ToPngBinaryData();
Imports System
' Standard barcode generation
BarcodeWriter.CreateBarcode("SHIP-20240315-00428", BarcodeEncoding.Code128) _
.SaveAsPng("shipping-label.png")
' QR code generation
QRCodeWriter.CreateQrCode("https://example.com/product/A42", 500) _
.SaveAsPng("product-qr.png")
' Get as bytes for embedding in API response or PDF
Dim barcodeBytes As Byte() = BarcodeWriter.CreateBarcode("INV-100291", BarcodeEncoding.Code128) _
.ToPngBinaryData()
barKoder SDK마이그레이션 체크리스트
이동 전 작업
코드베이스에서 barKoder 참조를 감사하십시오:
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
grep -r "Barkoder\|BarkoderView\|IBarkoderDelegate\|BarcodeResult" --include="*.cs" .
grep -r "Plugin.Maui.Barkoder\|Barkoder.Xamarin" --include="*.csproj" .
grep -r "Barkoder" --include="*.xaml" .
현재 구현 중이거나 계획 중인 바코드 시나리오를 문서화하십시오.
- 읽어야 하는 바코드 형식은 무엇입니까? (Code128, DataMatrix, QR, PDF417 등)
- 손상된 바코드 복구가 필요한지 여부 (
ReadingSpeed.ExtremeDetail) - 다중 바코드 감지가 필요한지 여부 (
ExpectMultipleBarcodes = true) - 바코드 생성이 필요한지 여부 (
BarcodeWriter,QRCodeWriter) - PDF 처리가 필요한지 여부 (
BarcodeReader.Read("doc.pdf")) - 배포 대상 (ASP.NET Core, Azure Functions, Docker, Lambda, 데스크톱, MAUI)
코드 업데이트 작업
- 더 이상 필요하지 않은 경우
Plugin.Maui.Barkoder또는Barkoder.Xamarin을(를).csproj에서 제거하십시오 BarCodeNuGet 패키지를 설치하십시오- 더 이상 필요하지 않은 경우
using Barkoder.Maui;(또는 Xamarin에 해당하는 것)를 제거하십시오 - 모든 바코드 처리 파일에
using IronBarCode;를 추가하십시오 - 애플리케이션 시작 시
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";를 추가하십시오 BarkoderView.StartScanning/DidFinishScanning콜백을BarcodeReader.Read(filePath, options)으로 대체하십시오BarcodeResult.TextualData을(를)result.Value으로 매핑하십시오BarcodeResult.BarcodeTypeName을(를)result.Format으로 매핑하십시오BarcodeReaderOptions에서 DeBlur 설정을Speed = ReadingSpeed.ExtremeDetail으로 매핑하십시오BarcodeReaderOptions에서 멀티 스캔 설정을ExpectMultipleBarcodes = true으로 매핑하십시오- 모든 생성 요구 사항에 대해
BarcodeWriter.CreateBarcode()호출을 추가하십시오 - QR 코드 생성 요구 사항에 대해
QRCodeWriter.CreateQrCode()호출을 추가하십시오 - PDF 전처리 코드를
BarcodeReader.Read("document.pdf")으로 대체하십시오 - 비동기 ASP.NET Core 엔드포인트에 동기식
BarcodeReader.Read()호출을Task.Run()로 감싸십시오
마이그레이션 후 테스트
코드 업데이트를 완료한 후 다음 사항을 확인하십시오.
- 사용된 모든 이미지 형식(PNG, JPEG, TIFF, BMP)에 대해
BarcodeReader.Read()가 결과를 반환하는지 확인하십시오 - 테스트 세트 내 가장 낮은 품질 샘플에서
ReadingSpeed.ExtremeDetail가 바코드를 복구하는지 확인하십시오 - 다중 바코드 문서에서
ExpectMultipleBarcodes = true가 바코드의 정확한 개수를 반환하는지 확인하십시오 - 실제 문서 워크플로에서 사용되는 모든 PDF 버전에 대해 PDF 읽기 기능을 테스트합니다.
- 대상 스캐너에서
BarcodeWriter.CreateBarcode()출력이 스캔 가능하도록 확인하십시오 - 모바일 QR 리더에서
QRCodeWriter.CreateQrCode()출력이 스캔 가능하도록 확인하십시오 - ASP.NET Core 엔드포인트(해당되는 경우)를 모바일 클라이언트에서 파일 업로드 기능으로 테스트합니다.
- Docker, Azure 또는 Lambda 배포 대상에서 정상 작동 여부를 확인합니다.
- 가능한 경우 읽기-처리-생성 주기 전체를 포괄하는 엔드투엔드 테스트를 실행합니다.
IronBarcode로 마이그레이션할 때의 주요 이점
비카메라 .NET을 포함하는 플랫폼: IronBarcode는 NuGet에서 설치되고 모든 .NET 프로젝트에서 실행됩니다 — ASP.NET Core, Azure Functions, Lambda, Docker, 콘솔, 작업자, WPF, WinForms, Avalonia, Blazor, 그리고 MAUI를 포함해. Barkoder의 Plugin.Maui.Barkoder는 MAUI 모바일 앱 헤드 내에서 카메라 UI만을 포함합니다; IronBarcode는 모든 나머지를 다룹니다.
카메라 없는 손상 내성 판독: Barkoder를 매력적으로 만든 기능 — DeBlur, MatrixSight, 손상 복구 —은 IronBarcode의 ReadingSpeed.ExtremeDetail 및 ML 기반 이미지 전처리를 통해 존재합니다. Barkoder가 실시간 카메라 입력에서 달성하는 것과 동일한 정확도 향상을IronBarcode파일, 스캔 문서 및 업로드된 이미지에서 달성합니다.
읽기 및 생성 워크플로 완료: Barkoder는 읽기 전용입니다.IronBarcode단일 패키지로 50가지 이상의 다양한 바코드 포맷을 읽고 생성하는 기능을 모두 제공합니다. 배송 라벨을 생성하거나, 포장용 QR 코드를 만들거나, 문서에 바코드를 삽입해야 하는 팀은 별도의 라이브러리가 필요하지 않습니다.
PDF 기본 지원:IronBarcode송장, 명세서, 의료 기록, 규정 준수 문서 등 PDF 문서에서 바코드를 읽는 뛰어난 기능을 제공합니다. 중간 이미지 추출 과정도 없고, 페이지별 API 호출도 없으며, 추가적인 종속성도 필요하지 않습니다. 다중 페이지 PDF는 단일 BarcodeReader.Read() 호출로 처리됩니다.
완전한 서버 측 배포:IronBarcode ASP.NET Core, Azure Functions, AWS Lambda, Docker 컨테이너 및 기타 모든 .NET 호스팅 환경에서 실행됩니다. 이 시스템은 네트워크 호출이나 API 키 관리 없이, 원격 서비스로 인한 지연 시간 없이 로컬에서 바코드를 처리합니다. 바코드 한 장을 처리하든 백만 장을 처리하든 비용은 동일하며, 요청당 요금이 부과되지 않습니다.
예측 가능한 영구 가격 책정:IronBarcode는 개발자 1인 기준 749달러부터 시작하는 일회성 영구 라이선스로 제공되며, 요청당 요금, 사용량 제한, 구독 갱신이 없습니다. 대규모로 바코드를 처리하는 프로덕션 애플리케이션을 구축하는 팀의 경우 비용 모델은 간단하고 예측 가능합니다.
자주 묻는 질문
Barkoder SDK에서 IronBarcode로 마이그레이션해야 하는 이유는 무엇인가요?
일반적인 이유로는 라이선스 간소화(SDK + 런타임 키 복잡성 제거), 처리량 제한 제거, 네이티브 PDF 지원 확보, Docker/CI/CD 배포 개선, 프로덕션 코드의 API 상용구 감소 등이 있습니다.
Barkoder API 호출을 IronBarcode로 대체하려면 어떻게 해야 하나요?
인스턴스 생성 및 라이선스 상용구를 IronBarCode.License.LicenseKey = "key"로 대체합니다. 판독기 호출을 BarcodeReader.Read(경로)로, 쓰기 호출을 BarcodeWriter.CreateBarcode(데이터, 인코딩)로 바꿉니다. 정적 메서드는 인스턴스 관리가 필요하지 않습니다.
바코더 SDK에서 IronBarcode로 마이그레이션할 때 얼마나 많은 코드가 변경되나요?
대부분의 마이그레이션은 더 적은 코드 줄로 이루어집니다. 라이선스 상용구, 인스턴스 생성자, 명시적 형식 구성이 제거됩니다. 핵심 읽기/쓰기 작업이 더 간결한 결과 객체를 가진 더 짧은 IronBarcode에 매핑됩니다.
마이그레이션하는 동안 Barkoder SDK와 IronBarcode를 모두 설치해야 하나요?
아니요. 대부분의 마이그레이션은 병렬 작업이 아닌 직접 교체 작업입니다. 한 번에 하나의 서비스 클래스를 마이그레이션하고, NuGet 참조를 교체하고, 인스턴스화 및 API 호출 패턴을 업데이트한 후 다음 클래스로 이동합니다.
IronBarcode의 NuGet 패키지 이름은 무엇인가요?
패키지는 'IronBarCode'(대문자 B와 C 포함)입니다. '설치-패키지 IronBarCode' 또는 '닷넷 추가 패키지 IronBarCode'로 설치합니다. 코드의 사용 지시어는 'using IronBarCode;'입니다.
IronBarcode는 Barkoder SDK와 비교하여 어떻게 Docker 배포를 간소화하나요?
IronBarcode는 외부 SDK 파일이나 마운트된 라이선스 구성이 없는 NuGet 패키지입니다. Docker에서 IRONBARCODE_LICENSE_KEY 환경 변수를 설정하면 패키지가 시작 시 라이선스 유효성 검사를 처리합니다.
Barkoder에서 마이그레이션한 후 IronBarcode가 모든 바코드 형식을 자동으로 감지하나요?
예. IronBarcode는 지원되는 모든 형식에서 기호를 자동으로 감지합니다. 명시적인 바코드 유형 열거가 필요하지 않습니다. 형식이 이미 알려져 있고 성능이 중요한 경우 BarcodeReaderOptions를 사용하여 검색 공간을 최적화하여 제한할 수 있습니다.
IronBarcode는 별도의 라이브러리 없이 PDF에서 바코드를 판독할 수 있나요?
예. BarcodeReader.Read("document.pdf")는 기본적으로 PDF 파일을 처리합니다. 결과에는 발견된 각 바코드에 대한 페이지 번호, 형식, 값 및 신뢰도가 포함됩니다. 외부 PDF 렌더링 단계가 필요하지 않습니다.
IronBarcode는 병렬 바코드 처리를 어떻게 처리하나요?
IronBarcode의 정적 메서드는 상태 저장소가 없고 스레드에 안전합니다. 스레드별 인스턴스 관리 없이 파일 목록에 직접 Parallel.ForEach를 사용할 수 있습니다. BarcodeReaderOptions.MaxParallelThreads는 내부 스레드 예산을 제어합니다.
바코더 SDK에서 IronBarcode로 마이그레이션하면 어떤 결과 속성이 변경되나요?
일반적인 이름 변경: 바코드 값은 값으로, 바코드 유형은 형식으로 바뀝니다. IronBarcode 결과에는 신뢰도 및 페이지 번호도 추가됩니다. 솔루션 전반의 검색 및 바꾸기 기능은 기존 결과 처리 코드에서 이름 변경을 처리합니다.
CI/CD 파이프라인에서 IronBarcode 라이선싱을 설정하려면 어떻게 해야 하나요?
IRONBARCODE_LICENSE_KEY를 파이프라인 시크릿으로 저장하고 애플리케이션 시작 코드에 IronBarCode.License.LicenseKey를 할당하세요. 하나의 비밀은 개발, 테스트, 스테이징 및 프로덕션을 포함한 모든 환경에 적용됩니다.
IronBarcode는 사용자 지정 스타일로 QR 코드 생성을 지원하나요?
예. QRCodeWriter.CreateQrCode()는 변경바코드색()을 통한 사용자 지정 색상, 추가브랜드 로고()를 통한 로고 임베딩, 구성 가능한 오류 수정 수준, PNG, JPG, PDF, 스트림을 포함한 여러 출력 형식을 지원합니다.

