IRONSOFTWAREHOME
影片

從QRCoder遷移到IronBarcode

Curtis Chau
Curtis Chau
Updated: 2026年8月1日

本指南是為那些以QRCoder開始其專案並需要超越QR碼生成功能的開發團隊撰寫的。 QRCoder是一個維護良好且質量很高的程式庫,它在其預期範圍內表現出色,遷移與其質量無關。 這是對需求的回應——格式擴展、條碼讀取、PDF整合——這些都是QRCoder尚未涵蓋的功能。 本指南涵蓋了從QRCoder改為IronBarcode的完整技術路徑:套件替換、命名空間變更、每種常用模式的程式碼轉換、API對應列表以及遷移過程中出現問題的解決方案。

為何從QRCoder遷移

**超越QR的格式需求:**QRCoder僅生成QR碼。 當專案需要為物流使用Code 128標籤、零售產品識別使用EAN-13碼、製藥序列化使用DataMatrix或政府文件合規使用PDF417時,必須為每個額外格式引入單獨的程式庫。 隨著所需格式數量的增加,獨立套件、API和維護義務的數量也會增加。

**條碼讀取需求:**QRCoder沒有條碼讀取API —— 它本質上是一個僅生成的程式庫。 任何需要從傳入圖像中解碼QR碼、驗證掃描文件上條碼或處理運送標籤的應用都必須在QRCoder旁邊新增獨立的讀取程式庫。 這第二個程式庫帶來了自己的API介面、更新週期以及每次.NET升級時的相容性問題。

**多程式庫維護:**基於QRCoder的專案的現實累積模式是從QRCoder進行QR生成到1D條碼程式庫進行運送標籤,再到讀取程式庫進行解碼。 管理三到四個獨立套件意味著跟踪不同的版本說明,解決其中任何一個更新時的版本衝突,以及在開發團隊中保持對多個API的熟悉。 維護負擔隨時間增加,而在最初的整合估計中通常不明顯。

**PDF支持:**將條碼嵌入PDF文件或從傳入的PDF文件中提取條碼都在QRCoder的範圍之外。 文件處理流水線——發票處理、從PDF模板生成標籤、合規報告——在早期就會遇到此限制。 必須在QRCoder旁邊新增專用的PDF程式庫,或必須通過單獨的子系統進行條碼生成和PDF生成的路由。

基本問題

QRCoder有效地解決了QR生成問題。 當任何需求超出QR範圍時,程式碼庫必須開始引入其他套件以填補每個缺口:

//QRCoderhandles QR generation well — but no further
using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("SHIP-12345", QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrCodeData);
File.WriteAllBytes("qr.png", qrCode.GetGraphic(10));

// Now the shipping team asks for Code 128 — add NetBarcode
// Now the warehouse needs to scan barcodes — add ZXing.Net
// Now a report needs a barcode in a PDF — add a PDF library
// Each addition: new namespace, new API, new maintenance cycle
C#

IronBarcode將生成、讀取和PDF整合合併到一個API下:

//IronBarcode— one library covers all of the above
using IronBarCode;

// Generate QR
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.QRCode)
    .SaveAsPng("qr.png");

// Generate Code 128 — same API
BarcodeWriter.CreateBarcode("SHIP-12345", BarcodeEncoding.Code128)
    .SaveAsPng("label.png");

// Read a barcode from an image — built in
var results = BarcodeReader.Read("incoming.png");
C#

IronBarcode與QRCoder:功能比較

功能QRCoderIronBarcode
QR碼生成是的 — 優異
微型QR
Code 128 / Code 39
EAN-13 / UPC-A
DataMatrix
PDF417
Aztec
總格式數量150+
條碼讀取是的 — 自動檢測
PDF條碼提取
PDF條碼加印
Logo嵌入
顏色自定義
SVG輸出
PayloadGenerator輔助工具否 — 手動字串構造
零外部依賴自包含
授權MIT — 無限制商業 — Lite等級涵蓋單一開發者

快速開始:從QRCoder遷移到IronBarcode

步驟 1:替換 NuGet 包

從專案中移除QRCoder:

dotnet remove package QRCoder
SHELL

安裝IronBarcode:

dotnet add package IronBarcode
SHELL

如果專案曾使用ZXing.Net與QRCoder搭配進行條碼讀取,此階段也可將該套件移除:

dotnet remove package ZXing.Net
SHELL

步驟 2:更新命名空間

將QRCoder命名空間導入替換為IronBarcode命名空間:

// Before (QRCoder)
using QRCoder;

// After (IronBarcode)
using IronBarCode;

步驟 3:初始化授權

在應用啟動時新增授權初始化——Program.cs, Startup.cs, 或靜態構造函式:

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

無需註冊即可獲取免費試用金鑰。 生產部署需要購買授權。

程式碼遷移範例

基本QR碼生成

最常見的QRCoder模式需要三個物件:一個PngByteQRCode。 在IronBarcode中,單個靜態調用即可替代這個鏈。

QRCoder方法:

using QRCoder;

public class BarcodeService
{
    private readonly QRCodeGenerator _generator = new QRCodeGenerator();

    public byte[] GenerateQR(string content)
    {
        var qrCodeData = _generator.CreateQrCode(content, QRCodeGenerator.ECCLevel.M);
        var qrCode = new PngByteQRCode(qrCodeData);
        return qrCode.GetGraphic(10); // 10px per module
    }
}

IronBarcode 方法:

using IronBarCode;

public class BarcodeService
{
    public byte[] GenerateQR(string content)
    {
        return BarcodeWriter.CreateBarcode(content, BarcodeEncoding.QRCode)
            .ResizeTo(200, 200)
            .ToPngBinaryData();
    }
}

BarcodeWriter是一個靜態類——不需要實例,也不需要中間資料物件。 GetGraphic中接受的每模組像素整數。 在這裡QRCoder依照模組計數來調整輸出大小(例如,GetGraphic(10)為每模組10px圖像),IronBarcode採用絕對像素尺寸。

將QR碼保存到檔案

QRCoder僅通過終端步驟將記憶體中的位元組與文件輸出分開——渲染鏈相同。 IronBarcode在同一鏈上使用不同的終端方法。

QRCoder方法:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
var pngBytes = new PngByteQRCode(qrCodeData).GetGraphic(10);
File.WriteAllBytes("output.png", pngBytes);

IronBarcode 方法:

using IronBarCode;

// Save directly — no intermediate byte array needed
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("output.png");

// Or obtain bytes for in-memory use
byte[] pngBytes = BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .ToPngBinaryData();

SaveAsPng方法是一個直接寫入磁碟的終端。 byte[]用於流傳輸、HTTP響應或資料庫儲存。

SVG輸出

QRCoder方法:

using QRCoder;
using System.IO;

var generator = new QRCodeGenerator();
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);
string svgContent = new SvgQRCode(qrCodeData).GetGraphic(10);
File.WriteAllText("output.svg", svgContent);

IronBarcode 方法:

using IronBarCode;

BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsImage("output.svg");

.svg擴展名會產生SVG輸出)。

錯誤校正等級映射

QRCoder在每次QRCodeGenerator.ECCLevel列舉。 IronBarcode在使用QRCodeWriter.QrErrorCorrectionLevel提供顯式控制。

QRCoder方法:

using QRCoder;

var generator = new QRCodeGenerator();

// Medium — suitable for most generation without logos
var dataMedium = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.M);

// High — required when a logo will occlude part of the code
var dataHigh = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

IronBarcode 方法:

using IronBarCode;

// Default — equivalent to Medium, applied automatically
BarcodeWriter.CreateBarcode("https://example.com", BarcodeEncoding.QRCode)
    .SaveAsPng("default-ecc.png");

// Explicit level via QRCodeWriter
var qr = QRCodeWriter.CreateQrCode(
    "https://example.com",
    500,
    QRCodeWriter.QrErrorCorrectionLevel.Highest
);
qr.SaveAsPng("high-ecc.png");

等級映射為:ECCLevel.LLow, ECCLevel.MMedium, ECCLevel.QHigh, ECCLevel.HHighest

Logo嵌入

這兩個程式庫都支持QR碼上的Logo嵌入。 QRCoder通過System.Drawing.Bitmap參數。 IronBarcode提供QRCodeWriter.CreateQrCodeWithLogo()作為接受URL和Logo檔案路徑的專用工廠方法。 QR碼風格自定義指南涵蓋了Logo大小、定位和顏色組合選項。

QRCoder方法:

using QRCoder;
using System.Drawing;
using System.Drawing.Imaging;

var generator = new QRCodeGenerator();
// ECCLevel.H is required — the logo occludes part of the code
var qrCodeData = generator.CreateQrCode("https://example.com", QRCodeGenerator.ECCLevel.H);

var qrCode = new QRCode(qrCodeData);
var logoBitmap = new Bitmap("logo.png");
var qrBitmap = qrCode.GetGraphic(10, Color.Black, Color.White, logoBitmap);
qrBitmap.Save("qr-logo.png", ImageFormat.Png);

IronBarcode 方法:

using IronBarCode;

QRCodeWriter.CreateQrCodeWithLogo("https://example.com", "logo.png", 500)
    .SaveAsPng("qr-logo.png");

CreateQrCodeWithLogo接受內容和Logo影像的檔案路徑字串。 錯誤校正會自動設置為Logo嵌入所需的級別; 不需要顯式的ECC配置。

PayloadGenerator.WiFi遷移

QRCoder的PayloadGenerator.WiFi格式化標準WiFi QR有效載荷字串。 輸出格式是QR碼規範定義的公共標準(WIFI:T:{auth};S:{ssid};P:{password};;)。 在遷移時,這些字串可以直接構建。

QRCoder方法:

using QRCoder;

var wifi = new PayloadGenerator.WiFi(
    ssid: "OfficeNetwork",
    password: "SecurePass123",
    authenticationMode: PayloadGenerator.WiFi.Authentication.WPA
);
// wifi.ToString() produces: WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;

var generator = new QRCodeGenerator();
var qrData = generator.CreateQrCode(wifi.ToString(), QRCodeGenerator.ECCLevel.M);
var qrCode = new PngByteQRCode(qrData);
System.IO.File.WriteAllBytes("wifi.png", qrCode.GetGraphic(10));

IronBarcode 方法:

using IronBarCode;

// Construct the standard WiFi QR string directly
string wifiPayload = "WIFI:T:WPA;S:OfficeNetwork;P:SecurePass123;;";
BarcodeWriter.CreateBarcode(wifiPayload, BarcodeEncoding.QRCode)
    .ResizeTo(300, 300)
    .SaveAsPng("wifi.png");

對於使用多種型別的團隊(vCard、CalendarEvent、Geo、SMS),方法相同:識別每個生成器使用其.ToString()輸出生成的格式化字串,然後直接構建該字串或通過小靜態輔助方法。

##QRCoderAPI到IronBarcode的對應參考

QRCoderIronBarcode注意事項
new QRCodeGenerator()靜態類——無實例BarcodeWriter不需要實例建立
qrGenerator.CreateQrCode(data, ECCLevel.M)BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)直接替換
new PngByteQRCode(qrCodeData)不需要渲染是流暢鏈的一部分
byte[].ToPngBinaryData()通過.ResizeTo(w, h)設置大小
File.WriteAllBytes(path, bytes)模式.SaveAsPng(path)GeneratedBarcode上的終端方法
new SvgQRCode(qrCodeData).GetGraphic(10).SaveAsImage(path)為SVG輸出傳遞.svg擴展名
new QRCode(qrCodeData).GetGraphic(...)QRCodeWriter.CreateQrCode(data, size, level)用於Logo和顏色自定義
QRCodeGenerator.ECCLevel.LQRCodeWriter.QrErrorCorrectionLevel.Low
QRCodeGenerator.ECCLevel.MQRCodeWriter.QrErrorCorrectionLevel.Medium預設在未指定時
QRCodeGenerator.ECCLevel.QQRCodeWriter.QrErrorCorrectionLevel.High
QRCodeGenerator.ECCLevel.HQRCodeWriter.QrErrorCorrectionLevel.HighestLogo嵌入所需
PayloadGenerator.WiFi(...).ToString()"WIFI:T:WPA;S:{ssid};P:{pass};;"直接構建標準字串
PayloadGenerator.ContactData(...).ToString()"BEGIN:VCARD\n..."vCard是公共標準
無讀取 APIBarcodeReader.Read(path)新功能——無需額外的程式庫
僅QR格式通過BarcodeEncoding.*支持超過50種格式新功能

常見遷移問題及解決方案

問題1:PayloadGenerator字串格式變更

QRCoder:PayloadGenerator.WiFi, PayloadGenerator.ContactData等幫助器自動生成格式化字串。 程式碼將輔助物件的CreateQrCode

**解決方案:**識別每個PayloadGenerator型別生成的字串 - 其格式在QR碼規範中有記載,容易重現。 對於WiFi:WIFI:T:WPA;S:{ssid};P:{password};;。 對於vCard:標準BEGIN:VCARD / END:VCARD塊。 如果許多調用點使用同一種有效承載型別,可以編寫靜態助手方法:

public static string WifiPayload(string ssid, string password, string auth = "WPA")
    => $"WIFI:T:{auth};S:{ssid};P:{password};;";

問題2:ECCLevel枚舉映射

QRCoder:L, M, Q, H的巢狀枚舉。 它是每次CreateQrCode調用中的必填參數。

**解決方案:**在使用QRCodeWriter.QrErrorCorrectionLevel等效值。 在使用BarcodeWriter.CreateBarcode時,ECC級別預設為中等,無需參數。 更新每個調用點:

//QRCoderECCLevel.H →IronBarcodeQrErrorCorrectionLevel.Highest
var qr = QRCodeWriter.CreateQrCode(data, 500, QRCodeWriter.QrErrorCorrectionLevel.Highest);

//QRCoderECCLevel.M →IronBarcodedefault (no parameter needed)
BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode);
C#

問題3:渲染器類移除

**QRCoder:**每個輸出格式都需要其渲染器類的實例化—QRCode。 這些類接受GetGraphic,具有不同的返回型別。

**解決方案:**移除所有渲染器類的實例化。 IronBarcode將格式輸出內建在流暢鏈的終端方法中。 將.ResizeTo()之後。 將.svg擴展名。 QRCodeData中間物件也消失了——在IronBarcode中不需要。

問題4:PngByteQRCode移除及基於模組的尺寸調整

QRCoder:PngByteQRCode.GetGraphic(int pixelsPerModule)以每QR模組像素數量進行調整。 其結果影像尺寸取決於模組數量,這會隨著內容長度和ECC級別而變化。

**解決方案:**替換基於模組的尺寸調整為ResizeTo(int width, int height)絕對像素維度。 如果您的程式碼通過模組數計算預期輸出尺寸,則切換到能滿足輸出需求的固定目標尺寸:

// Before: GetGraphic(20) — output size varies with content
var bytes = new PngByteQRCode(qrData).GetGraphic(20);

// After: fixed 400×400 regardless of content
byte[] bytes = BarcodeWriter.CreateBarcode(data, BarcodeEncoding.QRCode)
    .ResizeTo(400, 400)
    .ToPngBinaryData();

QRCoder遷移檢查清單

遷移前任務

在做出任何變更之前核對程式碼庫中所有的QRCoder使用:

# Find allQRCodernamespace imports
grep -r "using QRCoder" --include="*.cs" .

# Find all generator and renderer instantiations
grep -r "QRCodeGenerator\|PngByteQRCode\|SvgQRCode\|AsciiQRCode\|QRCode\b" --include="*.cs" .

# Find all PayloadGenerator usages
grep -r "PayloadGenerator\." --include="*.cs" .

# Find ECCLevel references
grep -r "ECCLevel\." --include="*.cs" .

# Find ZXing.Net usage to remove at the same time
grep -r "using ZXing" --include="*.cs" .
SHELL
  • 用文件記錄所有PayloadGenerator型別的使用情況,並註明其字串輸出格式
  • 記錄所有ECC級別值的使用情況及其調用點
  • 確認任何與QRCoder搭配使用的ZXing.Net讀碼程式碼——這可以同時被替換掉
  • 獲取IronBarcode授權金鑰(無需註冊即可獲得試用金鑰)

程式碼更新任務

  1. 運行dotnet remove package QRCoder
  2. 如果僅與QRCoder一起使用讀碼功能,運行dotnet remove package ZXing.Net
  3. 運行dotnet add package IronBarcode
  4. 在應用程式啟動時加入IronBarCode.License.LicenseKey = "YOUR-KEY";
  5. using QRCoder;匯入
  6. 移除所有BarcodeWriter是靜態的
  7. generator.CreateQrCode(data, ECCLevel.X)+ 渲染器鏈模式
  8. .ResizeTo(w, h)
  9. .SaveAsPng(path)終端方法
  10. .svg擴展名)
  11. PayloadGenerator.WiFi(...)及其他輔助器初始化替換為直接格式字串
  12. 將每個QRCodeWriter.QrErrorCorrectionLevel等效值
  13. 將任何ZXing.NetBarcodeReader.Read(path)
  14. 對於Logo嵌入,將QRCodeWriter.CreateQrCodeWithLogo(data, logoPath, size)

遷移後測試

  • 使用至少兩個獨立的QR碼掃描應用程式掃描所有生成的QR碼以驗證可讀性
  • 驗證嵌入Logo的QR碼能正確掃描——確認錯誤校正級別是Highest
  • 比較生成的碼的視覺輸出與遷移前的樣本,在需要外觀一致性的地方
  • 測試所有PayloadGenerator替換——確認WiFi、vCard和其他有效負載字串在目標裝置上解碼正確
  • 如果同時移除ZXing.Net,則驗證所有條碼讀取路徑通過BarcodeReader.Read功能
  • 在乾淨的環境中運行應用程式以確認沒有殘留的QRCoder或ZXing.Net引用引發綁定失敗
  • 確認IronBarcode授權金鑰在工商環境及預備環境中正確載入

遷移到IronBarcode的主要優勢

**所有條碼操作的單一API:**遷移後,每個條碼任務——生成、讀取、PDF加印——都使用相同的IronBarCode命名空間和相同的進入點。 新加入該專案的開發者學習一個API而非三個。 條碼子系統的程式碼審查變得一致。 文件查詢被集中化。

不需要第二個程式庫進行條碼讀取:BarcodeReader.Read處理圖像文件、PDF頁面、流及記憶體位圖,具有自動格式檢測能力。 先前需要ZXing.Net的讀取能力——其格式規範要求及執行緒安全考量——現在可通過單一方法調用立即獲得。 從圖像讀取條碼指南涵蓋多條碼檢測、圖像預處理和PDF頁面掃描。

**無需新依賴的格式擴展:**遷移後新增Code 128、EAN-13、DataMatrix、PDF417或任何其他支持的格式只需不同的BarcodeEncoding參數值。 沒有需要安裝的新套件、沒有需要學習的新API,也沒有需要管理的版本相容性問題。 新格式需求變為一行程式碼的改變,而非新程式庫的整合。

**簡化的QR碼自定義:**Logo嵌入、顏色更改和靜默區域控製作為QRCodeWriter結果上的命名方法可用。 QRCoder為Logo嵌入要求的System.Drawing.Bitmap依賴被簡單的檔案路徑字串所取代。 QR碼風格自定義指南文件化了所有可用的自定義選項。

**內建的PDF整合:**條碼可以從傳入的PDF文件中讀取並加印到現有的PDF文件中,而無需新增PDF程式庫。 之前需要單獨PDF依賴的文件處理工作流程,現在則將條碼和PDF功能合併。

**減少長期維護負擔:**從三到四個獨立包遷移到一個,消除了跟踪多個發布周期、解決跨程式庫版本衝突及在.NET版本更新時更新多個測試套件的複合開銷。 條碼子系統的維護成本減至單個程式庫依賴。

請注意: NetBarcode, QRCoder和ZXing.NET是各自擁有者的註冊商標。 本網站不隸屬於、得到NetBarcode、QRCoder或ZXing.NET的認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時公開可用的資訊。
Curtis Chau
技術作家

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

...
閱讀更多

相關文章

Key in blue circle

立即免費取得 30 天試用金鑰

Your trial license will be sent to your email address

無任何限制。100% 解鎖。無需信用卡。

bullet_checked無需信用卡或建立帳號無任何限制。100% 解鎖。無需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
預訂您的免費即時演示
Booking Badge

全球數百萬工程師信賴

Iron Software的客戶標誌
獲取您的無義務諮詢
完成下方表單或發送電子郵件至sales@ironsoftware.com
您的詳細資訊將始終保密。
全球數百萬工程師信賴
Iron Software的客戶標誌
立即獲取您的30天試用金鑰
無需信用卡或帳戶建立