푸터 콘텐츠로 바로가기
동영상

C#에서 스트림을 통해 바코드를 읽는 방법

barKoder SDK에서 IronBarcode로의 마이그레이션

Barkoder는 공식 .NET 패키지 — Plugin.Maui.BarkoderBarkoder.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
$vbLabelText   $csharpLabel

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

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
SHELL

앱에 여전히 라이브 카메라 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
$vbLabelText   $csharpLabel

단계 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"
$vbLabelText   $csharpLabel

코드 마이그레이션 예제

이미지에서 바코드 읽기

코어 읽기 시나리오가 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
$vbLabelText   $csharpLabel

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

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

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

ReadingSpeed.ExtremeDetail는 멀티 패스 ML 기반 이미지 분석 파이프라인을 실행하며, 대비 향상, 선명화, 회전 보정, 손상 복구를 적용한 후 디코딩을 시도합니다. 배치 워크플로의 경우 기본으로 ReadingSpeed.Balanced를 사용하고, ExtremeDetailBalanced 디코딩에 실패한 이미지만을 위해 대체로 사용하십시오.

다중 바코드 감지

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

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

이것은 단일 메서드 호출입니다. 페이지 추출도 없고, 여러 번 요청할 필요도 없으며, 바코드별 처리 오버헤드도 없습니다. 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
$vbLabelText   $csharpLabel

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

지원되는 인코딩 형식 및 생성 옵션의 전체 목록은 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")
$vbLabelText   $csharpLabel

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

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.BarkoderBarkoder.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
SHELL

문제 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
$vbLabelText   $csharpLabel

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

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

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

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" .
SHELL

현재 구현 중이거나 계획 중인 바코드 시나리오를 문서화하십시오.

  • 읽어야 하는 바코드 형식은 무엇입니까? (Code128, DataMatrix, QR, PDF417 등)
  • 손상된 바코드 복구가 필요한지 여부 (ReadingSpeed.ExtremeDetail)
  • 다중 바코드 감지가 필요한지 여부 (ExpectMultipleBarcodes = true)
  • 바코드 생성이 필요한지 여부 (BarcodeWriter, QRCodeWriter)
  • PDF 처리가 필요한지 여부 (BarcodeReader.Read("doc.pdf"))
  • 배포 대상 (ASP.NET Core, Azure Functions, Docker, Lambda, 데스크톱, MAUI)

코드 업데이트 작업

  1. 더 이상 필요하지 않은 경우 Plugin.Maui.Barkoder 또는 Barkoder.Xamarin을(를) .csproj에서 제거하십시오
  2. BarCode NuGet 패키지를 설치하십시오
  3. 더 이상 필요하지 않은 경우 using Barkoder.Maui;(또는 Xamarin에 해당하는 것)를 제거하십시오
  4. 모든 바코드 처리 파일에 using IronBarCode;를 추가하십시오
  5. 애플리케이션 시작 시 IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";를 추가하십시오
  6. BarkoderView.StartScanning / DidFinishScanning 콜백을 BarcodeReader.Read(filePath, options)으로 대체하십시오
  7. BarcodeResult.TextualData을(를) result.Value으로 매핑하십시오
  8. BarcodeResult.BarcodeTypeName을(를) result.Format으로 매핑하십시오
  9. BarcodeReaderOptions에서 DeBlur 설정을 Speed = ReadingSpeed.ExtremeDetail으로 매핑하십시오
  10. BarcodeReaderOptions에서 멀티 스캔 설정을 ExpectMultipleBarcodes = true으로 매핑하십시오
  11. 모든 생성 요구 사항에 대해 BarcodeWriter.CreateBarcode() 호출을 추가하십시오
  12. QR 코드 생성 요구 사항에 대해 QRCodeWriter.CreateQrCode() 호출을 추가하십시오
  13. PDF 전처리 코드를 BarcodeReader.Read("document.pdf")으로 대체하십시오
  14. 비동기 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, 스트림을 포함한 여러 출력 형식을 지원합니다.

Curtis Chau
기술 문서 작성자

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

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

아이언 서포트 팀

저희는 주 5일, 24시간 온라인으로 운영합니다.
채팅
이메일
전화해