跳至頁尾內容
影片

如何在 C# 中從圖像讀取條碼

從Barcoder遷移到IronBarcode

這個指南涵蓋了從Barcoder到IronBarcode的完整遷移路徑,適用於.NET開發者。 此遷移將兩個程式包合併為一個,用一次方法呼叫替代編碼器-渲染器流水線,並將所有格式特定的命名空間匯入——using IronBarCode;ImageRenderer / ImageRendererOptions型別已完全移除。 如果閱讀是缺乏的功能而導致您在Barcoder旁邊新增了第二個程式庫,IronBarcode通過BarcodeReader.Read()本機支援閱讀功能。

為什麼要從Barcoder遷移

從Barcoder遷移的團隊報告了這些觸發因素:

閱讀需求增加: Barcoder僅是生成功能的程式庫,沒有解碼能力。 當應用程式需要驗證接收到的條碼、處理掃描的文件或從上傳的PDF中閱讀條碼時,Barcoder沒有提供前進的路徑。 新增第二個用於閱讀的程式庫會創造一個分裂的程式碼基,擁有兩個NuGet依賴、兩個API需維護,及兩個版本歷史需追蹤。 IronBarcode能通過同一個包處理生成和閱讀。

.NET Framework相容性破壞: Barcoder.Renderer.Image停止支持.NET Framework。 在.NET Framework 4.x上運行服務或桌面應用的團隊,在進行例行依賴性維護時更新影像渲染程式包會遇到構建失敗。 IronBarcode支持.NET Framework 4.6.2到.NET 9,無需不同目標的條件式包裝。

套裝版本漂移: Barcoder.Renderer.Image是獨立版本的NuGet套裝。 在更新依賴過程中更新其中一個而沒有更新另一個可能會導致不相容性。 在多個專案的儲存庫中,確保每個專案上的渲染器版本一致是隨著團隊規模增長的一項協調負擔。

多格式增加: 一個以Code128開始的專案,然後新增QR,再新增DataMatrix,必須為每種格式新增新的命名空間匯入並學習不同的編碼器類及其不同的方法參數。 IronBarcode使用BarcodeEncoding列舉——新增格式就只需對現有呼叫進行一個單詞的改變。 沒有新的命名空間,沒有新的類別,沒有不同的方法簽名。

MAUI和雲端部署需求: Barcoder沒有記錄MAUI、Docker、AWS Lambda或Azure部署的支持。 構建跨平台移動應用或無伺服器條碼處理管道的團隊發現Barcoder的已錄目標未涵蓋這些場景。

基本問題

Barcoder將格式選擇與命名空間匯入緊密結合,並要求每個輸出操作必須有一個渲染器流水線。 切換格式或輸出型別需要對程式碼進行結構化更改。

// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
// Barcoder: 3 namespaces, encoder-specific class, renderer pipeline, stream management
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 2,
    .BarHeightFor1DBarcode = 50
})

Using stream As FileStream = File.OpenWrite("barcode.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

IronBarcode通過單一鍊狀呼叫來表達相同的操作:

// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");
// IronBarcode: 1 namespace, 1 method, 1 output call
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

IronBarcode與Barcoder:功能比較

功能 Barcoder IronBarcode
需要的NuGet套裝 至少2個(Barcoder + Barcoder.Renderer.Image) 1個(IronBarcode)
條碼生成
條碼閱讀/解碼
每格式編碼器類別 是的—DataMatrixEncoder,等等。 沒有—BarcodeEncoding列舉
每格式命名空間匯入 是的—Barcoder.DataMatrix 沒有—只有using IronBarCode
結果物件上的輸出方法 無—IBarcode無保存方法 有—ToStream
PDF閱讀 是的—BarcodeReader.Read(path)
帶Logo的QR 是的—.AddBrandLogo(path)
.NET Framework支持 影像渲染器中已刪除 .NET Framework 4.6.2+
.NET 9支持 不清楚/有限的活動
MAUI支持 是的—iOS、Android、Windows、macOS
Docker / Azure / AWS Lambda 未記錄
許可證 MIT(開源) 商業版—Lite $999、Plus $1,499、Professional $2,999、Unlimited $5,999
ReadingSpeed控制 是的—ReadingSpeed列舉
多條碼檢測 是的—ExpectMultipleBarcodes選項

快速入門:從Barcoder到IronBarcode的遷移

步驟 1:替換 NuGet 包

從您的專案中移除所有Barcoder套裝:

dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
dotnet remove package Barcoder
dotnet remove package Barcoder.Renderer.Image
SHELL

如果您已新增了SVG渲染器:

dotnet remove package Barcoder.Renderer.Svg
dotnet remove package Barcoder.Renderer.Svg
SHELL

安裝IronBarcode:

dotnet add package IronBarcode
dotnet add package IronBarcode
SHELL

步驟 2:更新命名空間

從專案中的每個檔案中移除所有using Barcoder.*語句:

// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
// Remove all of these
using Barcoder;
using Barcoder.Code128;
using Barcoder.Qr;
using Barcoder.DataMatrix;
using Barcoder.Renderers;
using Barcoder.Ean;
using Barcoder.Pdf417;
// ... and any other Barcoder.* namespaces in your project
$vbLabelText   $csharpLabel

將所有它們替換為單一的使用指令:

using IronBarCode;
using IronBarCode;
Imports IronBarCode
$vbLabelText   $csharpLabel

步驟 3:初始化授權

在應用程式啟動時新增授權初始化—MauiProgram.cs

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
Imports IronBarCode

IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

免費試用金鑰可以在ironsoftware.com得到。

程式碼遷移範例

Code128生成

Barcoder方法:

using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2,
    BarHeightFor1DBarcode = 50
});

using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 2,
    .BarHeightFor1DBarcode = 50
})

Using stream As FileStream = File.OpenWrite("barcode.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

IronBarcode 方法:

// NuGet: dotnet add package IronBarcode
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");
// NuGet: dotnet add package IronBarcode
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .SaveAsPng("barcode.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

ImageRendererOptions和流管理被完全移除。 格式被指定為BarcodeWriter類上。 輸出方法直接位於返回的GeneratedBarcode物件上。 IronBarcode條碼生成文件涵蓋了樣式、邊距和顏色自訂。

QR 碼生成

Barcoder方法:

using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;

IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 4
});

using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.Qr;
using Barcoder.Renderers;

IBarcode barcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 4
});

using var stream = File.OpenWrite("qr.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.Qr
Imports Barcoder.Renderers

Dim barcode As IBarcode = QrEncoder.Encode("https://example.com", ErrorCorrectionLevel.M)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 4
})

Using stream = File.OpenWrite("qr.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com", 500)
    .SaveAsPng("qr.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .SaveAsPng("qr.png")
$vbLabelText   $csharpLabel

CreateQrCode的第二個參數是以像素為單位的輸出尺寸。 錯誤校正級別預設為合理值,如果需要可以配置。 IronBarcode還支持在Barcoder中不可能的操作——在QR碼中心嵌入品牌標識:

using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
using IronBarCode;

QRCodeWriter.CreateQrCode("https://example.com", 500)
    .AddBrandLogo("logo.png")
    .SaveAsPng("qr-branded.png");
Imports IronBarCode

QRCodeWriter.CreateQrCode("https://example.com", 500) _
    .AddBrandLogo("logo.png") _
    .SaveAsPng("qr-branded.png")
$vbLabelText   $csharpLabel

DataMatrix生成

Barcoder方法:

using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;

IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 5
});

using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
using Barcoder;
using Barcoder.DataMatrix;
using Barcoder.Renderers;

IBarcode barcode = DataMatrixEncoder.Encode("ITEM-XYZ-001");

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 5
});

using var stream = File.OpenWrite("datamatrix.png");
renderer.Render(barcode, stream);
Imports Barcoder
Imports Barcoder.DataMatrix
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = DataMatrixEncoder.Encode("ITEM-XYZ-001")

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 5
})

Using stream As FileStream = File.OpenWrite("datamatrix.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
    .SaveAsPng("datamatrix.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix)
    .SaveAsPng("datamatrix.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("ITEM-XYZ-001", BarcodeEncoding.DataMatrix) _
    .SaveAsPng("datamatrix.png")
$vbLabelText   $csharpLabel

模式與Code128相同——只是BarcodeEncoding值變化了。 沒有新的命名空間匯入,沒有不同的類別,沒有不同的方法簽名。

控制輸出尺寸

Barcoder使用BarHeightFor1DBarcode——沒有直接的寬度/高度API。

Barcoder方法:

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 3,
    BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 3,
    BarHeightFor1DBarcode = 80
});
using var stream = File.OpenWrite("barcode.png");
renderer.Render(barcode, stream);
Imports System.IO

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 3,
    .BarHeightFor1DBarcode = 80
})

Using stream As FileStream = File.OpenWrite("barcode.png")
    renderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");
using IronBarCode;

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ResizeTo(400, 100)
    .SaveAsPng("barcode.png");
Imports IronBarCode

BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128) _
    .ResizeTo(400, 100) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

.ResizeTo(width, height)接受明確的像素尺寸。 它與同一GeneratedBarcode物件上的其他輸出方法連結。

獲取二進制資料而非文件

Barcoder方法:

using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2
});

using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
using Barcoder;
using Barcoder.Code128;
using Barcoder.Renderers;

IBarcode barcode = Code128Encoder.Encode("PRODUCT-12345", false);

var renderer = new ImageRenderer(new ImageRendererOptions
{
    ImageFormat = ImageFormat.Png,
    PixelSize = 2
});

using var ms = new MemoryStream();
renderer.Render(barcode, ms);
byte[] pngBytes = ms.ToArray();
Imports Barcoder
Imports Barcoder.Code128
Imports Barcoder.Renderers
Imports System.IO

Dim barcode As IBarcode = Code128Encoder.Encode("PRODUCT-12345", False)

Dim renderer = New ImageRenderer(New ImageRendererOptions With {
    .ImageFormat = ImageFormat.Png,
    .PixelSize = 2
})

Using ms As New MemoryStream()
    renderer.Render(barcode, ms)
    Dim pngBytes As Byte() = ms.ToArray()
End Using
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;

byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
using IronBarCode;

byte[] pngBytes = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128)
    .ToPngBinaryData();
Imports IronBarCode

Dim pngBytes As Byte() = BarcodeWriter.CreateBarcode("PRODUCT-12345", BarcodeEncoding.Code128).ToPngBinaryData()
$vbLabelText   $csharpLabel

GeneratedBarcode上的單一鏈式方法調用替代。

閱讀條碼(全新功能)

Barcoder沒有閱讀API。 如果您之前新增了第二個程式庫用於閱讀,可以將其移除。 IronBarcode從文件、字節陣列、流和PDF讀取,使用與生成同一套裝。

IronBarcode 方法:

using IronBarCode;

// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
}

// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");

// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
    Console.WriteLine(result.Value);

// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
using IronBarCode;

// Read from image file
var results = BarcodeReader.Read("barcode.png");
foreach (var result in results)
{
    Console.WriteLine($"Value: {result.Value}");
    Console.WriteLine($"Format: {result.Format}");
}

// Read from PDF natively — no image extraction step, no extra dependency
var pdfResults = BarcodeReader.Read("invoice.pdf");

// Read multiple barcodes from one image
var options = new BarcodeReaderOptions
{
    Speed = ReadingSpeed.Balanced,
    ExpectMultipleBarcodes = true
};
var multiResults = BarcodeReader.Read("warehouse-sheet.png", options);
foreach (var result in multiResults)
    Console.WriteLine(result.Value);

// Read from a stream directly
using var fileStream = File.OpenRead("barcode.png");
var streamResults = BarcodeReader.Read(fileStream);
Imports IronBarCode

' Read from image file
Dim results = BarcodeReader.Read("barcode.png")
For Each result In results
    Console.WriteLine($"Value: {result.Value}")
    Console.WriteLine($"Format: {result.Format}")
Next

' Read from PDF natively — no image extraction step, no extra dependency
Dim pdfResults = BarcodeReader.Read("invoice.pdf")

' Read multiple barcodes from one image
Dim options As New BarcodeReaderOptions With {
    .Speed = ReadingSpeed.Balanced,
    .ExpectMultipleBarcodes = True
}
Dim multiResults = BarcodeReader.Read("warehouse-sheet.png", options)
For Each result In multiResults
    Console.WriteLine(result.Value)
Next

' Read from a stream directly
Using fileStream = File.OpenRead("barcode.png")
    Dim streamResults = BarcodeReader.Read(fileStream)
End Using
$vbLabelText   $csharpLabel

IronBarcode條碼閱讀文件涵蓋了多頁PDF、興趣區域閱讀和性能調整選項。

SVG輸出

Barcoder方法:

using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
using Barcoder.Renderers;
var svgRenderer = new SvgRenderer();
using var stream = File.OpenWrite("barcode.svg");
svgRenderer.Render(barcode, stream);
Imports Barcoder.Renderers

Dim svgRenderer = New SvgRenderer()
Using stream = File.OpenWrite("barcode.svg")
    svgRenderer.Render(barcode, stream)
End Using
$vbLabelText   $csharpLabel

IronBarcode 方法:

using IronBarCode;

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .SaveAsSvg("barcode.svg");
using IronBarCode;

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .SaveAsSvg("barcode.svg");
Imports IronBarCode

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
    .SaveAsSvg("barcode.svg")
$vbLabelText   $csharpLabel

一旦所有SVG渲染站點被遷移,Barcoder.Renderer.Svg套裝可以被移除。

BarcoderAPI到IronBarcode對映參考

Barcoder IronBarcode
Code128Encoder.Encode("data", false) BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
QrEncoder.Encode("data", ErrorCorrectionLevel.M) QRCodeWriter.CreateQrCode("data", 500)
DataMatrixEncoder.Encode("data") BarcodeWriter.CreateBarcode("data", BarcodeEncoding.DataMatrix)
new ImageRenderer(new ImageRendererOptions { ... }) 不需要
renderer.Render(barcode, fileStream) .SaveAsPng(path)
renderer.Render(barcode, memoryStream) + ms.ToArray() .ToPngBinaryData()
IBarcode GeneratedBarcode
PixelSize = 2, BarHeightFor1DBarcode = 50 .ResizeTo(width, height)
SvgRenderer + renderer.Render(barcode, stream) .SaveAsSvg(path)
無讀取 API BarcodeReader.Read(path / stream / bytes / pdf)
2個套裝—Barcoder + Barcoder.Renderer.Image 1個套裝—IronBarcode
每個編碼器的格式命名空間(Barcoder.Qr,等等) BarcodeEncoding列舉,單一命名空間

常見遷移問題及解決方案

問題1:IBarcode 沒有保存方法

Barcoder:儲存IBarcode變數並稍後將其傳遞給渲染器的程式碼遵循了延遲渲染模式。 任何接受renderer.Render()的幫助方法都必須重構。

解決方案:GeneratedBarcodeGeneratedBarcode物件自帶輸出方法—將其傳遞給任何需要保存或序列化結果的方法。

//IronBarcode— GeneratedBarcode carries output methods
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");

static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
    barcode.SaveAsPng(path);
}
//IronBarcode— GeneratedBarcode carries output methods
using IronBarCode;

var barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128);
SaveBarcodeToFile(barcode, "output.png");

static void SaveBarcodeToFile(GeneratedBarcode barcode, string path)
{
    barcode.SaveAsPng(path);
}
Imports IronBarCode

Dim barcode = BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
SaveBarcodeToFile(barcode, "output.png")

Private Sub SaveBarcodeToFile(barcode As GeneratedBarcode, path As String)
    barcode.SaveAsPng(path)
End Sub
$vbLabelText   $csharpLabel

在整個解決方案中搜尋renderer.Render(將定位所有延遲渲染站點。

問題2:PixelSize沒有直接對應物件

Barcoder:PixelSize是條碼自然模組大小的一個比例倍增器。輸出尺寸取決於內容長度、格式以及倍增器的組合。 BarHeightFor1DBarcode獨立控制1D高度。 沒有直接的寬度/高度規格。

解決方案:測量現有Barcoder程式碼生成的實際像素輸出,將這些值傳遞給.ResizeTo(width, height)

BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .ResizeTo(300, 80)
    .SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128)
    .ResizeTo(300, 80)
    .SaveAsPng("barcode.png");
BarcodeWriter.CreateBarcode("data", BarcodeEncoding.Code128) _
    .ResizeTo(300, 80) _
    .SaveAsPng("barcode.png")
$vbLabelText   $csharpLabel

問題3:格式命名空間匯入堆積

Barcoder:在專案中使用的每種條碼格式為每個使用該格式的檔案新增一個using Barcoder.[Format]指令。 一個使用Code128、QR和DataMatrix的專案通常每個文件都有三個格式特定的匯入,以及using Barcoder.Renderers

解決方案:執行搜尋所有using IronBarCode;

grep -rn "using Barcoder" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
SHELL

每個結果是一行需要移除的內容,以單一每個文件一條using IronBarCode;指令代替。

問題4:套裝版本同步錯誤

Barcoder:僅在Barcoder.Renderer.Image其中之一更新後構建可能會產生型別解析錯誤,因為在不同的版本組合下這兩個套裝可能並不相容。

解決方案:在移除兩個Barcoder套裝並安裝IronBarcode之後,只需要一個套裝和一個版本。 此範疇的包鎖衝突被消除。 確認Barcoder.*引用,然後再進行構建。

Barcoder遷移檢查表

遷移前任務

在進行修改前,檢查您的程式碼庫以識別所有Barcoder使用情況:

grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
grep -rn "using Barcoder" --include="*.cs" .
grep -rn "Code128Encoder\.Encode" --include="*.cs" .
grep -rn "QrEncoder\.Encode" --include="*.cs" .
grep -rn "DataMatrixEncoder\.Encode" --include="*.cs" .
grep -rn "ImageRenderer\|ImageRendererOptions" --include="*.cs" .
grep -rn "SvgRenderer" --include="*.cs" .
grep -rn "renderer\.Render(" --include="*.cs" .
grep -rn "IBarcode" --include="*.cs" .
grep -rn "ErrorCorrectionLevel" --include="*.cs" .
SHELL

記錄所有位置,IBarcode以變數型別儲存或作爲方法參數傳遞的地方—這些是最需要關注的延遲渲染站點。 記下所有BarHeightFor1DBarcode值並測量對應輸出尺寸。

程式碼更新任務

  1. 從所有專案中移除Barcoder NuGet套裝
  2. 從所有專案中移除Barcoder.Renderer.Image NuGet套裝
  3. 如有存在,請移除Barcoder.Renderer.Svg NuGet套裝
  4. 安裝IronBarcode NuGet套裝
  5. 在應用程式啟動時新增IronBarCode.License.LicenseKey = "YOUR-LICENSE-KEY";
  6. 將所有using IronBarCode;
  7. BarcodeWriter.CreateBarcode(..., BarcodeEncoding.Code128)
  8. QRCodeWriter.CreateQrCode(..., size)
  9. BarcodeWriter.CreateBarcode(..., BarcodeEncoding.DataMatrix)
  10. 移除所有new ImageRenderer(new ImageRendererOptions {...})構造
  11. .SaveAsPng(path)
  12. renderer.Render(barcode, memoryStream) + .ToPngBinaryData()
  13. .SaveAsSvg(path)
  14. GeneratedBarcode
  15. PixelSize / .ResizeTo(width, height)

遷移後測試

  • 驗證每種生成的條碼格式能用標準掃瞄器或IronBarcode的掃瞄器正確掃瞄
  • 比較視覺輸出尺寸與遷移前的輸出—確認.ResizeTo()值生成等效尺寸
  • 用手機掃描QR碼輸出以確認錯誤校正級別是否足夠
  • 驗證SVG輸出是否在瀏覽器和列印上下文中正確渲染,如果您的專案使用SVG的話
  • 如果移除了一個第二的閱讀程式庫,確認BarcodeReader.Read()為同一輸入生成了等效的解碼值
  • 測試PDF閱讀,如果您的專案處理PDF文件—確認多頁PDF能正確閱讀所有頁
  • 在沒有剩餘Barcoder.*引用的情況下運行構建—編譯器錯誤表示遺漏的遷移現場

遷移到IronBarcode的主要優勢

統一套裝依賴:一個NuGet套裝取代了兩個(或三個,如果也使用了SVG渲染器)。 一個版本可追蹤,一個變更記錄監控,並且在依賴更新時沒有跨套裝相容性問題。 packages.lock.json複雜性立即降低。

本機閱讀功能:先前需要第二個程式庫來閱讀條碼的應用程式現在可以整合到IronBarcode。 BarcodeReader.Read()接受影像文件、字節陣列、流和PDF,通過同一個API,有多條碼檢測和閱讀速度調整內建。

格式選擇作為配置: 為現有項目新增條碼格式是一個對現有BarcodeEncoding列舉值的單字改變。 沒有新的命名空間匯入,沒有新的編碼器類,也沒有新的程式包。 這使得格式擴展在產品需求演進時幾乎沒有摩擦。

明確的輸出尺寸: PixelSize倍增器系統。 程式碼與輸出之間的關係是直接且可預測的,不受條碼內容長度或格式特定模塊大小的影響。

擴展平台覆蓋: IronBarcode支持.NET Framework 4.6.2到.NET 9,MAUI在iOS、Android、Windows和macOS上的部署,並記錄了在Docker、AWS Lambda和Azure Functions上的部署。 超越.NET Core的平臺要求擴展的團隊不會遇到影響Barcoder.Renderer.Image的框架支持差距。

主動維護和未來相容性: IronBarcode定期發布帶有記錄.NET相容性時間表的更新。 積極的發佈節奏保持了程式庫與當前.NET版本的一致性,這在最近發佈活動有限的程式庫中是無法保證的。

常見問題

我為什麼應該從Barcoder遷移到IronBarcode?

常見的理由包括簡化授權(去除SDK +運行時鑰匙的複雜性)、消除吞吐量限制、獲得原生PDF支持、改善Docker/CI/CD部署,並減少生產程式碼中的API樣板。

我該如何用IronBarcode替換Barcoder API呼叫?

用IronBarCode.License.LicenseKey = "key"替換實例建立和授權樣板。用BarcodeReader.Read(path)替換讀取呼叫,用BarcodeWriter.CreateBarcode(data, encoding)替換寫入呼叫。靜態方法不需要實例管理。

從Barcoder遷移到IronBarcode時,會有多少程式碼變更?

大多數遷移會導致較少的程式碼行。授權樣板、實例構造函式和顯式格式配置被移除。核心讀/寫操作映射為較短的IronBarcode等價物,且結果物件更清晰。

在遷移期間,我需要同時安裝Barcoder和IronBarcode嗎?

不需要。大多數遷移是直接替換而不是並行操作。一次遷移一個服務類,替換NuGet引用,並更新實例化和API呼叫模式後再移動到下一個類。

IronBarcode的NuGet包名稱是什麼?

包名是'IronBarCode'(大寫B和C)。可以用'Install-Package IronBarCode'或'dotnet add package IronBarCode'安裝。程式碼中的using指令是'using IronBarCode;'。

與Barcoder相比,IronBarcode如何簡化Docker部署?

IronBarcode是沒有外部SDK文件或掛載許可配置的NuGet封裝。在Docker中,設置IRONBARCODE_LICENSE_KEY環境變數,包在啟動時處理許可驗證。

從Barcoder遷移後,IronBarcode會自動檢測所有條碼格式嗎?

是的。IronBarcode自動檢測所有支持的格式的符號學。不需要顯式的BarcodeTypes枚舉。如果格式已經知道並且性能很重要,BarcodeReaderOptions允許限制搜索空間作為優化。

IronBarcode是否可以不使用單獨的庫讀取PDF中的條碼?

可以。BarcodeReader.Read("document.pdf")原生處理PDF文件。結果包括每個條碼發現的頁碼、格式、值和置信度。不需要外部PDF渲染步驟。

IronBarcode如何處理並行條碼處理?

IronBarcode的靜態方法是無狀態且執行緒安全的。直接使用Parallel.ForEach遍歷文件列表,不需要每個執行緒的實例管理。BarcodeReaderOptions.MaxParallelThreads控制內部執行緒預算。

從Barcoder遷移到IronBarcode時,哪些結果屬性會改變?

常見的重命名:BarcodeValue變為Value,BarcodeType變為Format。IronBarcode結果還新增了Confidence和PageNumber。整個解決方案的搜索和替換可處理現有結果處理程式碼中的重新命名。

我如何在CI/CD管道中設置IronBarcode授權?

將IRONBARCODE_LICENSE_KEY作為管道機密儲存,在應用程式啟動程式碼中分配IronBarCode.License.LicenseKey。一個機密涵蓋所有環境,包括開發、測試、分期和生產。

IronBarcode是否支持生成帶有自定義樣式的QR碼?

支持。QRCodeWriter.CreateQrCode()支持通過ChangeBarCodeColor()自定義顏色,通過AddBrandLogo()嵌入logo,可配置錯誤校正級別,以及包括PNG、JPG、PDF和流在內的多種輸出格式。

Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

除了開發,Curtis對物聯網(IoT)有濃厚的興趣,探索創新的方法來整合硬體和軟體。在空閒時間,他喜歡玩遊戲和建立Discord機器人,結合他對技術的熱愛與創造力。

Iron 支援團隊

我們線上24小時,每週5天。
聊天
電子郵件
給我打電話