푸터 콘텐츠로 바로가기
다른 구성 요소와 비교

싱크퓨전 바코드와 IronBarcode: C# 바코드 라이브러리 비교

ZXing.Net vs IronBarcode: 2026년에 .NET 바코드 라이브러리를 선택하기

ZXing.Net의 BarcodeReader는 스레드 안전하지 않습니다. 애플리케이션의 모든 동시 읽기 경로 — 모든 병렬 ForEach, 모든 동시 요청을 처리하는 비동기 컨트롤러 액션 —는 자체적인 리더 인스턴스를 필요로 합니다. 즉, 인스턴스마다 형식 구성 반복, 호출별 Bitmap 로딩 및 해제, 그리고 모든 요청 시 리더 할당을 의미합니다. IronBarcode의 정적 메소드는 요청별 할당 없이 동일한 작업을 처리합니다. 스레드 안전성은 여러 문제점 중 하나일 뿐입니다. 네이티브 PDF 지원 부족, Windows와 Linux 간의 바인딩 패키지 파편화, 스캔하려는 모든 바코드 형식을 지정해야 하는 요구 사항 등은 ZX를 사용하는 .NET 프로젝트에서 시간이 지남에 따라 해결 방법을 찾아야 하는 이유입니다.

ZXing .NET 이해하기

ZXing .NET 은 Google의 Java 기반 ZXing("지브라 크로싱") 라이브러리를 오픈 소스로 포팅한 버전으로,Apache 2.0라이선스 하에 배포되며 Michael Jahn이 GitHub 에서 유지 관리합니다. 이 라이브러리는 .NET 용 오픈 소스 바코드 라이브러리 중 가장 많이 다운로드되었으며, 10년이 넘는 오랜 역사를 자랑합니다. 이 라이브러리는 다양한 바코드 형식에 대한 읽기 및 쓰기 기능을 모두 제공하며, 무료 라이선스 덕분에 Apache 호환 종속성이 필요한 오픈 소스 제품을 포함하여 모든 규모의 프로젝트에서 사용할 수 있습니다.

ZXing.Net의 아키텍처는 자바를 포팅한 프로그램이라는 기원을 반영합니다. BarcodeReader 클래스는 상태 저장 객체입니다: Decode 호출 시 내부 상태가 기록되며, 이는 인스턴스를 스레드 간에 안전하게 공유할 수 없게 만듭니다. 올바른 동시 사용을 위해서는 스레드별 새로운 리더 또는 ThreadLocal<BarcodeReader> 풀을 필요로 합니다. 이는 모두 호출자에게 스레드 안전성 책임을 부과합니다. 이미지 로딩 기능 또한 핵심 패키지에 포함되어 있지 않습니다. 대신 ZXing .NET 은 플랫폼별 바인딩 패키지를 제공하며, 각 패키지는 서로 다른 API 표면을 노출합니다.

주요 건축적 특징은 다음과 같습니다.

  • 아파치 2.0 라이선스: 상업적 용도 및 오픈 소스 용도로 무료로 사용 가능하며, 비용이나 판매 문의가 필요하지 않습니다.
  • 상태 저장 BarcodeReader: BarcodeReader 인스턴스는 스레드 안전하지 않음; 스레드별 또는 병렬 작업별로 새 인스턴스를 생성해야 합니다.
  • 수동 형식 지정: 호출자는 각 디코드 전에 reader.Options.PossibleFormats을 설정해야 합니다; 목록에 없는 형식은 오류나 경고 없이 조용히 건너뛰어집니다.
  • PDF를 기본적으로 지원하지 않습니다. 이 라이브러리는 이미지만 읽습니다. PDF 입력을 위해서는 PDF 뷰어와 같은 별도의 PDF 렌더링 라이브러리가 필요하며, 이 라이브러리는 디코딩 전에 페이지를 비트맵으로 변환해야 합니다.
  • 플랫폼 바인딩 파편화: 코어 패키지는 이미지 로딩 기능을 제공하지 않습니다. 별도의 바인딩 패키지 (ZXing.Net.Bindings.Windows.CompatibilitySystem.Drawing 사용, ZXing.Net.Bindings.ImageSharp / .V2 / .V3는 SixLabors.ImageSharp 사용, 그리고 ZXing.Net.Bindings.SkiaSharpZXing.Net.Bindings.Magick)는 다른 배포 대상에 대해 다른 API를 제공합니다.
  • 활발한 커뮤니티: GitHub 에서 이슈, 풀 리퀘스트 및 토론이 활발하게 진행되어 커뮤니티 수준의 지원을 무료로 제공합니다.
  • 광범위한 형식 지원: QR 코드, 코드 128, 코드 39, EAN-13, EAN-8, UPC-A, 데이터 매트릭스, PDF 417, 아즈텍 및 기타 널리 사용되는 심볼을 지원합니다.

상태 유지형 리더 아키텍처

ZXing.Net의 BarcodeReader는 각 스레드 또는 병렬 작업에 대해 새로운 인스턴스를 필요로 합니다. 다음 패턴은 동시 처리를 위한 최소한의 올바른 설정입니다.

// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
// ZXing.Net: a new reader instance is created per iteration
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing

Parallel.ForEach(imagePaths, Sub(path)
    Dim reader = New BarcodeReader()
    reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    }

    Using bitmap As New Bitmap(path)
        Dim result = reader.Decode(bitmap)

        If result IsNot Nothing Then
            results(path) = result.Text
        End If
    End Using
End Sub)
$vbLabelText   $csharpLabel

ThreadLocal<BarcodeReader> 패턴은 각 호출당 할당을 줄이기 위해 스레드별 하나의 인스턴스를 재사용하지만, 해제 복잡성이 추가됩니다. 어느 쪽이든, ZXing.Net에서 스레드 안전성은 호출자의 책임입니다.

IronBarcode 이해하기

IronBarcode 는 Iron Software 에서 개발한 상 for .NET 바코드 라이브러리입니다. 이것은 상태 없는 정적 API를 통해 바코드 읽기 및 생성을 제공합니다: BarcodeReader.ReadBarcodeWriter.CreateBarcode는 주요 진입점이며, 둘 다 사용 전에 인스턴스 생성이나 구성 필요 없이 사용됩니다. 이 라이브러리는 단일 NuGet 패키지로 제공되며, 플랫폼별 바인딩 패키지 없이 Windows, Linux, macOS및 Docker 컨테이너 내부에서 동일하게 실행됩니다.

IronBarcode의 판독 엔진은 50개 이상의 바코드 심볼에 걸쳐 자동 형식 감지 기능을 수행합니다. 발신자는 어떤 형식을 찾아야 하는지 지정하지 않습니다. 엔진은 지원되는 모든 형식에 대해 각 이미지를 평가하고 발견된 모든 바코드를 반환합니다. 스캐닝 속도와 철저함을 균형 잡아야 하는 애플리케이션을 위해,ReadingSpeed 열거형(Faster, Balanced, Detailed, ExtremeDetail)은 형식 열거를 요구하지 않고 제어를 제공합니다. 이 라이브러리는 별도의 PDF 렌더링 라이브러리 없이도 모든 페이지의 바코드를 PDF 문서에서 직접 읽을 수 있는 네이티브 PDF 지원 기능도 포함하고 있습니다.

주요 특성에는 다음이 포함됩니다:

  • 상업용 라이선스: 유료 라이선스 키가 필요합니다. 평가를 위해 체험 모드를 사용할 수 있습니다.
  • 상태 없는 정적 API: BarcodeReader.ReadBarcodeWriter.CreateBarcode는 스레드 안전한 정적 메소드입니다; 인스턴스 관리가 필요하지 않습니다.
  • 자동 포맷 감지: 지원되는 50개 이상의 바코드 포맷을 포맷 목록 없이 모두 감지합니다. 발신자는 포맷 범위보다는 속도를 조정할 수 있습니다.
  • 네이티브 PDF 지원: BarcodeReader.Read는 외부 PDF 라이브러리 없이 PDF 파일 경로를 직접 받아 모든 페이지를 처리합니다.
  • 단일 크로스 플랫폼 패키지: 하나의 NuGet 패키지로 Windows, Linux, macOS및 Docker에서 동일한 API 인터페이스를 사용할 수 있습니다.
  • 유창한 생성 API: BarcodeWriter.CreateBarcodeGeneratedBarcode 객체를 반환하며, 내장된 출력 메소드가 SaveAsPng, SaveAsPdf, ToPngBinaryData, 그리고 ToStream를 포함합니다.
  • 상업적 지원: 유료 라이선스에는 서비스 수준 약정이 포함된 Iron Software의 지원팀 이용 권한이 포함됩니다.

기능 비교

다음 표는 ZXing .NET 과IronBarcode의 근본적인 차이점을 보여줍니다.

기능 ZXing.Net IronBarcode
특허 Apache 2.0 (무료) 상업적
스레드 안전성 스레드 안전하지 않음 - 스레드마다 새 인스턴스가 필요합니다. 스레드 안전한 정적 API
형식 감지 수동 — PossibleFormats 리스트 필요 자동 — 50개 이상의 형식
PDF 읽기 아니요 — PDF 뷰어 또는 유사한 프로그램이 필요합니다. 네이티브 — 단일 메서드 호출
플랫폼 지원 플랫폼별로 별도의 바인딩 패키지가 제공됩니다. 단일 패키지로 모든 플랫폼에서 사용 가능
바코드 생성 Bitmap 반환, 수동 저장 필요 출력 기능이 내장된 Fluent API
가격 무료 $749부터 (Lite) / $1,499 (Plus)

상세 기능 비교

기능 ZXing.Net IronBarcode
독서
스레드 안전 읽기 아니요, 스레드별 인스턴스가 필요합니다. 예 — 정적 상태 비저장 API
자동 형식 감지 아니요 — PossibleFormats 필요 예, 모든 형식이 자동으로 감지됩니다.
이미지당 여러 개의 바코드 예 — DecodeMultiple 예 — 기본 동작
PDF 바코드 읽기 아니요 - 외부 라이브러리가 필요합니다 네, 원어민입니다.
손상된 바코드 복구 TryHarder 플래그 머신러닝 기반 이미지 보정
속도/정밀도 조정 형식 목록 축소 ReadingSpeed 열거형
세대
코드 128 / 코드 39
QR 코드
로고가 포함된 QR 코드 아니요
QR 코드 색상 맞춤 설정 아니요
PNG/JPEG/PDF 형식으로 출력 System.Drawing를 통한 수동 방식 내장 출력 메서드
유창한 세대 체인 아니요
플랫폼 및 배포
Windows (System.Drawing) 예 — ZXing.Net.Bindings.Windows.Compatibility
리눅스/Docker 예 —ZXing.Net.Bindings.ImageSharp / .V2 / .V3(다른 API) 예, 동일한 API를 사용합니다.
macOS 예 — ZXing.Net.Bindings.ImageSharp / .V2 / .V3
Docker 추가 종속성 libgdiplus 필요할 수 있음 None
단일 NuGet 패키지 아니요 — 코어 + 바인딩 + 선택적 ImageSharp
라이선스 및 지원
라이선스 유형 Apache 2.0 상업적
비용 무료 749달러부터
지역사회 지원 GitHub 이슈, 활발한 커뮤니티
상업용 SLA 지원 아니요
오픈소스 친화적 아니요

스레드 안전성 및 동시 처리

스레드 안전성은 두 라이브러리 간의 가장 중요한 운영상 차이점이며, 문서상의 경고보다 더 많은 프로젝트에 영향을 미칩니다.

ZXing .NET 접근 방식

ZXing.Net의 BarcodeReader는 상태 저장 객체입니다. Decode가 호출되면, 내부 상태가 기록됩니다. 두 스레드가 동일한 인스턴스를 공유하는 경우 쓰기 경쟁이 발생합니다. 결과는 비결정적입니다. 다른 이미지의 결과가 나오거나, 바코드가 있는 위치에 null이 반환되거나, 예외가 발생할 수 있습니다. 올바른 접근 방식은 스레드당 하나의 리더를 생성하는 것입니다. 즉, 모든 병렬 또는 비동기 경로가 리더를 할당하고, 구성하고, 한 번 사용한 후 폐기하는 것입니다.

// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
// ZXing.Net: one reader instance per parallel operation
Parallel.ForEach(imagePaths, path =>
{
    var reader = new BarcodeReader();
    reader.Options.PossibleFormats = new List<BarcodeFormat>
    {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    };

    using var bitmap = new Bitmap(path);
    var result = reader.Decode(bitmap);

    if (result != null)
        results[path] = result.Text;
});
Imports System.Collections.Concurrent
Imports System.Drawing
Imports ZXing

Parallel.ForEach(imagePaths, Sub(path)
    Dim reader As New BarcodeReader()
    reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.EAN_13
    }

    Using bitmap As New Bitmap(path)
        Dim result = reader.Decode(bitmap)

        If result IsNot Nothing Then
            results(path) = result.Text
        End If
    End Using
End Sub)
$vbLabelText   $csharpLabel

ThreadLocal<BarcodeReader> 패턴은 각 호출당 할당을 줄이기 위해 스레드별 하나의 리더를 재사용하지만, 여전히 각 인스턴스에서 형식 구성이 필요하며 해제 복잡성이 추가됩니다.

IronBarcode 접근법

IronBarcode의 BarcodeReader.Read는 상태 없는 정적 메소드입니다. 공유해야 할 인스턴스도 없고, 격리해야 할 인스턴스도 없으며, 보호해야 할 구성 상태도 없습니다. 동일한 호출은 여러 개의 동시 스레드에서 안전하게 실행될 수 있습니다.

// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

Parallel.ForEach(imagePaths, path =>
{
    var result = BarcodeReader.Read(path, options).FirstOrDefault();
    if (result != null)
        results[path] = result.Value;
});
// IronBarcode: static method — no instance management
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true,
    MaxParallelThreads = 4
};

Parallel.ForEach(imagePaths, path =>
{
    var result = BarcodeReader.Read(path, options).FirstOrDefault();
    if (result != null)
        results[path] = result.Value;
});
Imports IronBarcode

Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True,
    .MaxParallelThreads = 4
}

Parallel.ForEach(imagePaths, Sub(path)
    Dim result = BarcodeReader.Read(path, options).FirstOrDefault()
    If result IsNot Nothing Then
        results(path) = result.Value
    End If
End Sub)
$vbLabelText   $csharpLabel

IronBarcode의 비동기 및 멀티스레드 바코드 판독 관련 문서는 내부 스레드 풀링 모델을 설명합니다. MaxParallelThreads 속성은 외부 조율 없이 병렬 처리 정도를 제어합니다.

형식 감지

두 라이브러리 간의 두 번째 중요한 운영상 차이점은 형식 감지 정책입니다.

ZXing .NET 접근 방식

ZXing.Net는 각 디코드 전에 reader.Options.PossibleFormats를 채우도록 요구합니다. 목록에 없는 바코드 형식은 감지되지 않으며, 오류나 경고도 표시되지 않고 부분적인 결과도 나오지 않습니다.

// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.UPC_A,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;

using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
// ZXing.Net: PossibleFormats list controls which symbologies are decoded
var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.UPC_A,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF_417
};
reader.Options.TryHarder = true;

using var bitmap = new Bitmap(imagePath);
var results = reader.DecodeMultiple(bitmap);
Imports ZXing
Imports ZXing.Common

' ZXing.Net: PossibleFormats list controls which symbologies are decoded
Dim reader As New BarcodeReader()
reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.CODE_39,
    BarcodeFormat.EAN_13,
    BarcodeFormat.EAN_8,
    BarcodeFormat.UPC_A,
    BarcodeFormat.DATA_MATRIX,
    BarcodeFormat.PDF_417
}
reader.Options.TryHarder = True

Using bitmap As New Bitmap(imagePath)
    Dim results = reader.DecodeMultiple(bitmap)
End Using
$vbLabelText   $csharpLabel

누락을 방지하기 위해 모든 형식을 나열하면 성능이 저하됩니다. 예상되는 형식만 나열하면 외부 소스에서 이미지가 들어올 때 누락되는 오류가 발생할 위험이 있습니다. ZXing .NET 에는 목록에 없는 형식의 바코드를 발견했다는 사실을 보고하는 메커니즘이 없습니다.

IronBarcode 접근법

IronBarcode 지원되는 50개 이상의 형식을 자동으로 감지합니다. 형식 목록은 필요하지 않으며 허용되지도 않습니다.

// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
    Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
// IronBarcode: automatic detection across all supported formats
var results = BarcodeReader.Read(imagePath);
foreach (var barcode in results)
{
    Console.WriteLine($"{barcode.Value} ({barcode.Format})");
}
Imports IronBarcode

' IronBarcode: automatic detection across all supported formats
Dim results = BarcodeReader.Read(imagePath)
For Each barcode In results
    Console.WriteLine($"{barcode.Value} ({barcode.Format})")
Next
$vbLabelText   $csharpLabel

읽기 속도와 검출 철저함을 맞추는 애플리케이션에 대해, IronBarcode는 ReadingSpeed 열거형 — Faster, Balanced, Detailed, ExtremeDetail —을 제공하며, 형식 열거를 요구하지 않습니다. 속도 튜닝은 엔진이 각 이미지를 처리하는 방식에 영향을 미치지만, 어떤 이미지 형식을 고려할지는 영향을 주지 않습니다.

PDF 문서 지원

ZXing .NET 에서는 PDF 읽기가 명확한 한계입니다. 해당 라이브러리는 어떤 형태의 PDF 지원도 제공하지 않습니다.

ZXing .NET 접근 방식

PDF 파일에 바코드가 포함된 경우, ZXing .NET 은 외부 PDF 렌더링 라이브러리가 필요합니다. 가장 일반적인 해결 방법은 PdfiumViewer를 사용하는 것인데, 이 방법은 약 20MB의 네이티브 바이너리와 호출자가 구현하고 유지 관리해야 하는 페이지 렌더링 루프를 추가합니다.

// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);

var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.PDF_417
};

for (int i = 0; i < pdfDocument.PageCount; i++)
{
    string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
    try
    {
        using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
        pageImage.Save(tempPath, ImageFormat.Png);

        using var bitmap = new Bitmap(tempPath);
        var decoded = reader.DecodeMultiple(bitmap);
        if (decoded != null)
            results.AddRange(decoded.Select(d => d.Text));
    }
    finally
    {
        File.Delete(tempPath);
    }
}
// ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
using var pdfDocument = PdfDocument.Load(pdfPath);

var reader = new BarcodeReader();
reader.Options.PossibleFormats = new List<BarcodeFormat>
{
    BarcodeFormat.QR_CODE,
    BarcodeFormat.CODE_128,
    BarcodeFormat.PDF_417
};

for (int i = 0; i < pdfDocument.PageCount; i++)
{
    string tempPath = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png");
    try
    {
        using var pageImage = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi);
        pageImage.Save(tempPath, ImageFormat.Png);

        using var bitmap = new Bitmap(tempPath);
        var decoded = reader.DecodeMultiple(bitmap);
        if (decoded != null)
            results.AddRange(decoded.Select(d => d.Text));
    }
    finally
    {
        File.Delete(tempPath);
    }
}
Imports System.IO
Imports System.Drawing
Imports PdfiumViewer
Imports ZXing
Imports ZXing.Common

' ZXing.Net: PDF input is handled by PdfiumViewer with a per-page render loop
Using pdfDocument As PdfDocument = PdfDocument.Load(pdfPath)

    Dim reader As New BarcodeReader()
    reader.Options.PossibleFormats = New List(Of BarcodeFormat) From {
        BarcodeFormat.QR_CODE,
        BarcodeFormat.CODE_128,
        BarcodeFormat.PDF_417
    }

    For i As Integer = 0 To pdfDocument.PageCount - 1
        Dim tempPath As String = Path.Combine(Path.GetTempPath(), $"{Guid.NewGuid()}.png")
        Try
            Using pageImage As Image = pdfDocument.Render(i, 200, 200, PdfRenderFlags.CorrectFromDpi)
                pageImage.Save(tempPath, Imaging.ImageFormat.Png)

                Using bitmap As New Bitmap(tempPath)
                    Dim decoded = reader.DecodeMultiple(bitmap)
                    If decoded IsNot Nothing Then
                        results.AddRange(decoded.Select(Function(d) d.Text))
                    End If
                End Using
            End Using
        Finally
            File.Delete(tempPath)
        End Try
    Next
End Using
$vbLabelText   $csharpLabel

이 패턴에는 실제 오류 모드가 있습니다. DPI 구성 오류로 인해 오류 메시지가 표시되지 않고, 보안 환경에서 임시 파일 권한이 제대로 작동하지 않으며, PdfiumViewer 네이티브 라이브러리는 별도의 배포 관리가 필요하고, 추가 구성 없이는 Linux에서 설치가 제대로 작동하지 않습니다.

IronBarcode 접근법

IronBarcode 외부 프로그램 없이 모든 페이지, 모든 형식의 PDF에서 바코드를 직접 읽어냅니다 . 같은 BarcodeReader.Read 호출이 PDF 경로를 직접 받습니다:

// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
// IronBarcode: one call processes every page of the PDF
var results = BarcodeReader.Read("invoice.pdf");
foreach (var barcode in results)
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}");
Imports IronBarcode

' IronBarcode: one call processes every page of the PDF
Dim results = BarcodeReader.Read("invoice.pdf")
For Each barcode In results
    Console.WriteLine($"Page {barcode.PageNumber}: {barcode.Value}")
Next
$vbLabelText   $csharpLabel

페이지 열거, DPI 구성, 임시 파일, 애플리케이션과 함께 배포해야 할 별도의 라이브러리가 필요 없습니다.

플랫폼 바인딩 및 배포

ZXing.Net의 이미지 처리는 플랫폼별 바인딩 패키지에 분산되어 있으며, 각 패키지는 서로 다른 API 인터페이스를 제공합니다.

ZXing .NET 접근 방식

핵심 ZXing.Net 패키지는 디코딩 로직을 제공하지만 이미지 로딩은 제공하지 않습니다. 호출자는 배포 대상에 따라 바인딩을 선택해야 합니다.

환경 패키지 노트
Windows 데스크톱 / WPF ZXing.Net.Bindings.Windows.Compatibility 윈도우 친화적 — System.Drawing 사용; 리눅스에서 libgdiplus 필요
리눅스 / Docker / 크로스 플랫폼 ZXing.Net.Bindings.ImageSharp / .V2 / .V3 서로 다른 API 표면; SixLabors.ImageSharp 종속성을 추가합니다 (V2/V3 트랙의 ImageSharp 주요 버전)
macOS ZXing.Net.Bindings.ImageSharp / .V2 / .V3 리눅스와 동일한 경로

실질적인 결과는 System.Drawing.Bitmap을 사용하는 윈도우 코드가 리눅스에서 컴파일되거나 실행되지 않는다는 것입니다. 컨테이너화를 위해서는 바인딩 패키지를 변경하고 이미지 로딩 코드를 다시 작성해야 합니다.

// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;

var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
// Windows binding path — uses System.Drawing
using ZXing.Windows.Compatibility;
using System.Drawing;

var reader = new BarcodeReader();
using var bitmap = new Bitmap(imagePath);
var result = reader.Decode(bitmap);
Imports ZXing.Windows.Compatibility
Imports System.Drawing

Dim reader As New BarcodeReader()
Using bitmap As New Bitmap(imagePath)
    Dim result = reader.Decode(bitmap)
End Using
$vbLabelText   $csharpLabel
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
// Cross-platform path — different package, different API
using ZXing.ImageSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;

var reader = new BarcodeReader<Rgba32>();
using var image = Image.Load<Rgba32>(imagePath);
var result = reader.Decode(image);
Imports ZXing.ImageSharp
Imports SixLabors.ImageSharp
Imports SixLabors.ImageSharp.PixelFormats

Dim reader As New BarcodeReader(Of Rgba32)()
Using image As Image(Of Rgba32) = Image.Load(Of Rgba32)(imagePath)
    Dim result = reader.Decode(image)
End Using
$vbLabelText   $csharpLabel

리눅스 호스트에서 윈도우 바인딩을 사용할 때도 Docker 이미지에 libgdiplus가 필요하며, 이는 컨테이너에 약 50MB를 추가합니다.

IronBarcode 접근법

IronBarcode 모든 플랫폼용 패키지를 하나로 묶어서 배송합니다. 같은 BarcodeReader.Read(path) 호출이 윈도우, 리눅스, macOS, Docker 컨테이너 내에서 동일하게 컴파일 및 실행됩니다. 별도의 패키지 바인딩, 플랫폼 조건부 설정, 추가 시스템 종속성이 필요하지 않습니다. .NET 애플리케이션을 컨테이너화하는 팀을 위해 IronBarcode Docker 및 Linux 설정 가이드에서는 단일 패키지 배포 패턴을 자세히 다룹니다.

생성 API

두 라이브러리 모두 바코드를 생성하지만, API는 서로 다른 설계 방식을 반영합니다.

ZXing .NET 접근 방식

ZXing.Net의 BarcodeWriter 클래스는 작성자 객체를 생성하고, 인코딩 옵션을 수락하며 Write를 호출하고, 호출자가 System.Drawing.Imaging을 사용하여 수동으로 저장해야 하는 Bitmap를 반환합니다:

// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;

var writer = new BarcodeWriter
{
    Format = BarcodeFormat.CODE_128,
    Options = new EncodingOptions
    {
        Width = 300,
        Height = 100,
        Margin = 10
    }
};

using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
// ZXing.Net: create writer, set options, call Write, save Bitmap
using ZXing;
using ZXing.Common;
using ZXing.Windows.Compatibility;
using System.Drawing.Imaging;

var writer = new BarcodeWriter
{
    Format = BarcodeFormat.CODE_128,
    Options = new EncodingOptions
    {
        Width = 300,
        Height = 100,
        Margin = 10
    }
};

using var bitmap = writer.Write("PRODUCT-001");
bitmap.Save("output.png", ImageFormat.Png);
Imports ZXing
Imports ZXing.Common
Imports ZXing.Windows.Compatibility
Imports System.Drawing.Imaging

Dim writer As New BarcodeWriter With {
    .Format = BarcodeFormat.CODE_128,
    .Options = New EncodingOptions With {
        .Width = 300,
        .Height = 100,
        .Margin = 10
    }
}

Using bitmap = writer.Write("PRODUCT-001")
    bitmap.Save("output.png", ImageFormat.Png)
End Using
$vbLabelText   $csharpLabel

PNG 또는 JPEG가 아닌 형식으로 저장, PDF에 저장, 또는 HTTP 응답을 위한 이진 출력 생성 모두 호출자가 구현해야 하는 추가 System.Drawing이 필요합니다.

IronBarcode 접근법

IronBarcode의 BarcodeWriter.CreateBarcode는 유창한 체인을 통해 빌트인 출력 메소드를 제공하는 GeneratedBarcode 객체를 반환합니다:

// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng("output.png");
// IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128)
    .ResizeTo(300, 100)
    .SaveAsPng("output.png");
Imports IronBarCode

' IronBarcode: create and save in one fluent chain
BarcodeWriter.CreateBarcode("PRODUCT-001", BarcodeEncoding.Code128) _
    .ResizeTo(300, 100) _
    .SaveAsPng("output.png")
$vbLabelText   $csharpLabel

GeneratedBarcode 객체는 또한 .ToPngBinaryData(), .ToJpegBinaryData(), .ToStream(), 및 .SaveAsPdf()를 공개하며 — 이는 ZXing.Net이 System.Drawing를 사용하여 직접 구현해야 하는 출력 대상입니다.

API 매핑 참조

ZXing.Net IronBarcode 노트
new BarcodeReader() 정적 — 인스턴스 없음 BarcodeReader.Read(...)는 정적 호출입니다
reader.Options.PossibleFormats = new List<BarcodeFormat> { ... } 필요 없음 자동 감지 기능은 모든 형식을 지원합니다.
reader.Options.TryHarder = true Speed = ReadingSpeed.Balanced BarcodeReaderOptions를 통한 정확도 조정
reader.Decode(bitmap) BarcodeReader.Read(imagePath) 경로를 직접 전달 — Bitmap 필요 없음
reader.DecodeMultiple(bitmap) BarcodeReader.Read(imagePath) 항상 컬렉션을 반환합니다.
result.Text result.Value 부동산 이름 변경됨
result.BarcodeFormat result.Format 부동산 이름 변경됨
BarcodeFormat.QR_CODE BarcodeEncoding.QRCode 열거형 명명 규칙 변경
BarcodeFormat.CODE_128 BarcodeEncoding.Code128 열거형 명명 규칙 변경
BarcodeFormat.EAN_13 BarcodeEncoding.EAN13 열거형 명명 규칙 변경
새 바코드 작성기 { 형식 = 바코드 형식.CODE_128, 옵션 = 새 인코딩 옵션 { ... } } BarcodeWriter.CreateBarcode(data, BarcodeEncoding.Code128) 정적 공장 방식
writer.Write(data)Bitmap를 반환합니다 .SaveAsPng(path) / .ToPngBinaryData() GeneratedBarcode에서 내장된 출력 메소드
PDF를 지원하지 않습니다. PDF 뷰어가 필요합니다. BarcodeReader.Read("doc.pdf") 네이티브 PDF 지원
스레드 안전하지 않음 스레드 안전한 정적 API 인스턴스 관리가 필요하지 않습니다.

팀이 .NET 용 ZX에서IronBarcode로 전환을 고려할 때

여러 시나리오에서 개발팀은 .NET ZXing하는 대신IronBarcode대안으로 고려하게 됩니다.

동시 처리 및 고처리량 처리

단일 스레드 콘솔 애플리케이션에서는 정상적으로 작동하는 ZXing .NET 통합 기능이 동일한 코드를 동시 요청을 처리하는 ASP.NET Core 컨트롤러나 병렬로 배치를 처리하는 백그라운드 작업으로 옮기면 비결정적인 동작을 보일 수 있습니다. ZXing .NET 에서 요구하는 스레드별 인스턴스 패턴은 모든 요청 또는 병렬 작업이 구성된 디코더 세트가 포함된 전체 리더 객체를 할당하고, 한 번 사용한 후 폐기한다는 것을 의미합니다. 요청량이 증가함에 따라 이러한 할당 압력은 측정 가능해집니다. 이러한 단계에 도달하는 팀, 특히 물류, 창고 관리 또는 문서 처리 분야에서 높은 처리량의 스캔 파이프라인을 운영하는 팀은 모든 호출자에게 이러한 오버헤드를 부과하지 않는 스레딩 모델을 가진 라이브러리를 찾는 경우가 많습니다.

혼합 형식 문서 스캔

타사로부터 문서를 받는 애플리케이션은 형식 목록을 구성할 때 예상하지 못했던 바코드 형식을 자주 접하게 됩니다. Code 128용으로 구축된 배송 연동 시스템은 QR 코드를 사용하여 파트너로부터 배송 정보를 수신합니다. PDF 417에 맞춰 구성된 의료 기록 시스템이 새로운 장비 공급업체의 Data Matrix 심볼을 사용하게 되었습니다. ZXing .NET 에서는 이러한 각 경우에 디코딩 오류가 아닌 null 값이 조용히 반환되므로, 하위 처리 과정에서 오류가 발생할 때까지 해당 오류가 드러나지 않을 수 있습니다. 특히 바코드 누락이 비즈니스에 영향을 미치는 상황에서, 형식 오류로 인해 곤란을 겪었던 팀들은 형식 ​​목록 유지 관리 비용과 형식을 자동으로 감지하는 라이브러리 도입 비용을 비교 검토하기 시작합니다.

PDF 바코드 추출

많은 업무 관련 문서들이 PDF 형식으로 도착합니다. 예를 들어 송장, 선적 서류, 환자 기록, 규정 준수 인증서 등이 있습니다. ZXing .NET 은 이러한 파일을 직접 읽을 수 없습니다. PDF에서 바코드를 추출해야 하는 팀은 ZXing .NET 기반의 렌더링 파이프라인을 구축하고 유지 관리하게 됩니다. 여기에는 PDF 라이브러리 선택, 네이티브 종속성 관리, 페이지 렌더링 루프 구현, DPI 구성 처리, 임시 파일 정리 로직 작성 등이 포함됩니다. 해당 인프라 코드는 바코드 로직이 아닙니다. 이 라이브러리는 ZXing .NET 에서 지원하는 비트맵 이미지와 실제 비즈니스 문서의 형식(PDF) 간의 격차를 해소하기 위해 존재합니다. 특히 PDF 라이브러리 자체에 라이선스, 배포 및 플랫폼 관련 고려 사항이 있는 경우, 이러한 연결을 유지 관리해야 하는 팀은 전체 입력 표면을 처리하는 단일 라이브러리를 선호하는 경우가 많습니다.

결합 복잡성 감소

Windows에서 시작하여 나중에 Linux 또는 Docker에 배포하는 프로젝트는 ZXing.Net의 바인딩 파편화 문제를 직접적으로 겪게 됩니다. Windows 바인딩 패키지는 크로스 플랫폼 ImageSharp 바인딩과 다른 API를 사용하며, 둘 사이를 전환하려면 NuGet 참조와 이미지 로딩 코드를 모두 변경해야 합니다. .NET 애플리케이션을 컨테이너화하는 것이 일반적인 팀이나 개발자 컴퓨터(Windows 또는 macOS)와 프로덕션 서버(Linux)에서 동일한 코드베이스를 실행하는 팀은 이미지 로딩을 위한 두 가지 코드 경로를 유지 관리하는 것이 스캔 계층의 향후 변경 사항에 마찰을 일으킨다는 사실을 알게 됩니다.

일반적인 마이그레이션 고려사항

ZXing .NET 에서IronBarcode로 전환하는 팀은 다음과 같은 특정 기술적 변경 사항을 계획해야 합니다.

바코드 리더 인스턴스화 제거

코드베이스의 모든 new BarcodeReader() 호출이 마이그레이션 동안 제거됩니다. 리더 생성, 형식 구성, 이미지 로딩, 디코딩 호출 등 인스턴스화 패턴은 단일 정적 메서드 호출로 통합됩니다. using IronBarCode;로 대체된 파일과, ZXing, ZXing.Common, ZXing.Windows.Compatibility, ZXing.ImageSharp, SixLabors.ImageSharp 네임스페이스를 가져오는 파일이 제거되고 단일 using IronBarCode;로 대체됩니다.

PossibleFormats 구성 제거

reader.Options.PossibleFormats 할당 블록이 각 호출 위치에서 삭제됩니다. IronBarcode는 자동 형식 감지를 수행하며 형식 제한 목록을 허용하지 않습니다. TryHarder 플래그는 BarcodeReaderOptionsReadingSpeed 속성으로 대체되며, 이는 형식 범위를 좁히지 않고 검출 노력을 제어합니다.

바인딩 패키지 정리

마이그레이션은 ZXing.Net, ZXing.Net.Bindings.Windows.Compatibility, 모든 ZXing.Net.Bindings.ImageSharp 변형 (.V2 / .V3), 그리고 PDF 읽기를 지원하기 위해 추가된 모든 PdfiumViewer 패키지를 제거합니다. 리눅스에서 윈도우 바인딩을 통해 System.Drawing를 지원하려고 Docker파일에 추가된 libgdiplus가 있는 경우, 해당 줄도 제거됩니다.IronBarcode Docker 이미지에 플랫폼별 종속성이 필요하지 않습니다.

IronBarcode 추가 기능

위 비교 섹션에서 다룬 기능 외에도IronBarcode다음과 같은 기능을 제공합니다.

  • 로고 삽입 QR 코드 : 사용자 지정 로고 이미지가 중앙에 오버레이된 QR 코드를 생성하고, 스캔 가능성을 보장하기 위해 자동 오류 수정 기능을 제공합니다.
  • QR 코드 색상 맞춤 설정 : 브랜드 이미지에 맞춰 생성된 QR 코드의 전경색과 배경색을 설정할 수 있습니다.
  • PDF에 바코드 삽입 : 별도의 PDF 라이브러리 없이 기존 PDF 페이지의 지정된 좌표에 직접 바코드를 삽입할 수 있습니다.
  • GS1 바코드 지원 : 소매 및 의료 공급망에서 사용되는 GS1-128 및 GS1 DataBar를 포함한 GS1 형식의 바코드를 읽고 생성할 수 있습니다.
  • 멀티스레드 비동기 읽기: 블로킹 없이 바코드 읽기를 await 파이프라인에 통합하기 위한 내장 비동기 메소드.
  • ML 기반 이미지 보정: TryHarder가 복구할 수 없는 손상되거나 흐릿하거나 대비가 낮은 바코드를 위한 자동 이미지 개선.

.NET 호환성 및 미래 준비

IronBarcode는 .NET Standard 2.0 이상을 대상으로 하며 .NET Framework 4.6.2+, .NET Core 3.1, .NET 5, .NET 6, .NET 7, .NET 8 및 .NET 9과 호환성을 제공합니다. 라이브러리는 Microsoft의 .NET 릴리스 주기에 맞춰 정기적으로 업데이트를 받으며, .NET 10과의 호환성도 출시 시점에 제공될 예정입니다. ZXing .NET 은 NuGet 패키지 대상을 통해 광범위한 .NET 호환성을 유지하며, 이러한 관점에서 두 라이브러리 모두 최신 .NET 프로젝트에 적합합니다.

결론

ZXing .NET 과IronBarcode바코드 라이브러리 설계에 있어 서로 다른 철학을 나타냅니다. ZXing .NET 은 상태를 유지하는 인스턴스 기반 라이브러리로, 스레딩, 형식 지정 및 PDF 브리징 처리를 전적으로 호출자에게 위임합니다.IronBarcode는 상태를 저장하지 않는 정적 API 라이브러리로, 스레딩을 내장하고, 형식을 자동으로 감지하며, PDF 입력을 기본적으로 처리합니다. 이러한 차이의 실질적인 결과는 동시 실행 또는 문서 처리 컨텍스트에서 .NET 코드를 ZX로 작성하면 스레드별 인스턴스 패턴, 형식 목록, PDF 렌더링 파이프라인 및 플랫폼별 바인딩 분기와 같은 인프라가 축적되는 경향이 있는 반면, 동일한 시나리오에서IronBarcode코드는 이러한 주변 구조가 전혀 필요하지 않다는 것입니다.

ZXing .NET 은 비용이 전혀 들지 않는 프로젝트에 있어 진정으로 강력한 선택입니다. 아파치 2.0 라이선스를 채택하고 있어 오픈 소스 프로젝트 및 무료 종속성을 선호하는 상용 제품과 호환됩니다. 통제된 환경, 즉 알려진 바코드 형식, 깨끗한 이미지, 단일 스레드 또는 가벼운 동시 처리 환경에서는 안정적으로 작동합니다. 활발한 GitHub 커뮤니티를 통해 문제에 대한 신속한 답변을 얻을 수 있으며, 지원하는 형식 범위는 상용 제품과 비교해도 손색이 없습니다. 이러한 조건이 충족되는 애플리케이션의 경우 ZXing.Net의 비용 우위는 분명하며 기술적 한계 또한 관리 가능한 수준입니다.

IronBarcode ZXing.Net의 설계 제약 조건이 운영 비용으로 이어지는 시나리오를 해결합니다. 예를 들어 요청별 인스턴스 할당을 측정할 수 있는 동시 웹 API, PDF 입력이 예외가 아닌 일반적인 문서 파이프라인, 오류 발생 시 비즈니스 위험을 초래하는 혼합 형식 스캔, 두 개의 바인딩 패키지가 두 개의 코드 경로를 의미하는 크로스 플랫폼 배포 등이 있습니다. 이러한 맥락에서 라이브러리의 상업용 라이선스는 인스턴스 관리가 필요 없는 스레딩 모델, 유지 관리가 필요 없는 형식 감지 기능, 그리고 별도의 라이브러리가 필요 없는 PDF 지원 기능을 제공합니다.

결정은 프로젝트 요구 사항에 따라 달라집니다. 단일 형식 프로토타입, 오픈 소스 스캐너 또는 비용이 제약 조건인 소량 생산 도구의 경우 ZXing .NET 이 적합한 선택입니다. 외부 소스의 문서를 여러 스레드에서 처리하는 프로덕션 웹 API의 경우 IronBarcode의 설계 가정이 운영 현실과 일치합니다. 라이브러리들이 감지율과 실제 스캔 시나리오에서 어떻게 다른지 보다 폭넓게 살펴보려면 ZXing .NET 과IronBarcode바코드 스캐너 비교 분석 자료를 참고하세요.

자주 묻는 질문

ZXing.Net이란 무엇인가요?

ZXing.Net은 C# 애플리케이션에서 바코드를 생성하고 판독하기 위한 .NET 바코드 라이브러리입니다. 개발자가 .NET 프로젝트용 바코드 솔루션을 선택할 때 평가하는 여러 대안 중 하나입니다.

ZXing.Net과 IronBarcode의 주요 차이점은 무엇인가요?

IronBarcode는 인스턴스 관리가 필요 없는 정적 상태 비저장 API를 사용하는 반면, ZXing.Net은 일반적으로 사용하기 전에 인스턴스 생성 및 구성이 필요합니다. 또한 IronBarcode는 모든 환경에서 기본 PDF 지원, 자동 형식 감지, 단일 키 라이선싱을 제공합니다.

IronBarcode가 ZXing.Net보다 라이선스 취득이 더 쉬운가요?

IronBarcode는 개발 및 프로덕션 배포를 모두 포괄하는 단일 라이선스 키를 사용합니다. 따라서 SDK 키와 런타임 키를 분리하는 라이선싱 시스템에 비해 CI/CD 파이프라인 및 Docker 구성이 간소화됩니다.

IronBarcode는 ZXing.Net이 지원하는 모든 바코드 형식을 지원하나요?

IronBarcode는 QR코드, Code 128, Code 39, DataMatrix, PDF417, Aztec, EAN-13, UPC-A, GS1 등 30개 이상의 바코드 심볼로지를 지원합니다. 형식 자동 감지 기능은 명시적인 형식 열거가 필요하지 않음을 의미합니다.

IronBarcode는 네이티브 PDF 바코드 판독을 지원하나요?

예. IronBarcode는 별도의 PDF 렌더링 라이브러리가 필요 없이 BarcodeReader.Read("document.pdf")를 사용하여 PDF 파일에서 직접 바코드를 판독합니다. 페이지별 결과에는 페이지 번호, 바코드 형식, 값 및 신뢰도 점수가 포함됩니다.

IronBarcode는 ZXing.Net과 비교하여 일괄 처리를 어떻게 처리하나요?

IronBarcode의 정적 메서드는 상태 저장소가 없고 자연스럽게 스레드에 안전하므로 스레드별 인스턴스 관리 없이 Parallel.ForEach를 직접 사용할 수 있습니다. 어떤 가격대에서도 처리량 상한선이 없습니다.

IronBarcode 어떤 .NET 버전을 지원하나요?

IronBarcode는 단일 NuGet 패키지로 .NET Framework 4.6.2+, .NET Core 3.1 및 .NET 5, 6, 7, 8, 9를 지원합니다. 플랫폼 대상에는 Windows x64/x86, Linux x64, macOS x64/ARM이 포함됩니다.

.NET 프로젝트에 IronBarcode를 설치하려면 어떻게 해야 하나요?

NuGet을 통해 IronBarcode 설치: 패키지 관리자 콘솔에서 'Install-Package IronBarCode'를 실행하거나 CLI에서 '닷넷 추가 패키지 IronBarCode'를 실행합니다. 추가 SDK 인스톨러나 런타임 파일은 필요하지 않습니다.

ZXing.Net과 달리 구매하기 전에 IronBarcode를 평가할 수 있나요?

예. IronBarcode의 평가판 모드는 완전한 디코딩된 바코드 값을 반환하며 생성된 출력 이미지에만 워터마크가 표시됩니다. 구매를 결정하기 전에 자신의 문서에서 판독 정확도를 벤치마킹할 수 있습니다.

ZXing.Net과 IronBarcode의 가격 차이는 무엇인가요?

개발 및 프로덕션을 포함하는 단일 개발자 영구 라이선스의 IronBarcode 가격은 $749부터 시작합니다. 가격 세부 정보 및 볼륨 옵션은 IronBarcode 라이선스 페이지에서 확인할 수 있습니다. 별도의 런타임 라이선스 요구 사항은 없습니다.

ZXing.Net에서 IronBarcode로 마이그레이션하는 것은 간단하나요?

ZXing.Net에서 IronBarcode로의 마이그레이션에는 주로 인스턴스 기반 API 호출을 IronBarcode의 정적 메서드로 대체하고, 라이선스 상용구를 제거하며, 결과 속성 이름을 업데이트하는 작업이 포함됩니다. 대부분의 마이그레이션에는 코드를 추가하기보다는 줄이는 작업이 포함됩니다.

IronBarcode는 로고가 있는 QR 코드를 생성하나요?

예. QRCodeWriter.CreateQrCode().AddBrandLogo("logo.png")는 구성 가능한 오류 수정을 통해 기본적으로 브랜드 이미지를 QR코드에 임베드합니다. ChangeBarCodeColor()를 통해 컬러 QR 코드도 지원됩니다.

Curtis Chau
기술 문서 작성자

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

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

아이언 서포트 팀

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