如何從圖像文件(JPEG、PNG、GIF、TIFF、SVG、BMP)中讀取條碼

Hairil related to 如何從圖像文件(JPEG、PNG、GIF、TIFF、SVG、BMP)中讀取條碼
海里海西米·賓·奧馬
2023年3月19日
已更新 2025年2月8日
分享:
This article was translated from English: Does it need improvement?
Translated
View the article in English


立即在您的專案中使用IronBarcode,並享受免費試用。

第一步:
green arrow pointer

直接從圖像中讀取條碼

IronBarcode 的其中一個關鍵功能是其能夠直接從多種圖像格式中讀取條碼。 IronBarcode 目前支援下列圖像格式:

* 可扩展向量图形 (SVG)

* 聯合影像專家小組 (JPEG)

* 可攜式網絡圖形 (PNG)

* 圖形交換格式 (GIF)

* 標記圖像文件格式 (TIFF)

* 點陣圖影像檔 (BMP)

這是透過我們的開來源庫IronDrawing的幫助而實現的。 現在,讓我們看看如何實際使用 IronBarcode 進行條碼閱讀:

:path=/static-assets/barcode/content-code-examples/how-to/read-barcodes-from-images-1.cs
using IronBarCode;
using System;

var myBarcode = BarcodeReader.Read(@"image_file_path.jpg"); //image file path

foreach (var item in myBarcode)
{
    Console.WriteLine(item.ToString());
}
Imports IronBarCode
Imports System

Private myBarcode = BarcodeReader.Read("image_file_path.jpg") 'image file path

For Each item In myBarcode
	Console.WriteLine(item.ToString())
Next item
$vbLabelText   $csharpLabel
QRcodeintro related to 直接從圖像中讀取條碼
測試樣本 QR 碼
Code128intro related to 直接從圖像中讀取條碼
樣本測試條碼

想知道範例中的條碼值嗎?試試這段代碼吧! 要使用IronBarcode,首先您必須透過Microsoft Visual Studio NuGet套件管理員將IronBarcode庫安裝到您的項目中,如下圖所示。 這將允許您訪問 IronBarcode BarcodeReader.Read() 方法以直接讀取條碼圖像。

從上面的程式碼片段中,我們可以看到 IronBarcode 提供了簡單性,只需要使用 BarcodeReader.Read() 方法即可讀取已包含在專案內的圖片檔案,藉由指定檔案名稱字串或檔案路徑字串作為該方法的參數。 最佳做法是在方法中指定文件路徑時使用逐字字符串文字 "@",因為不包含此字符將需要用戶在文件路徑字符串中添加多個轉義字符 "\"。

BarcodeReader.Read() 方法呼叫結尾附加 Values() 方法,以取得條碼值作為 System.String [] 物件。

要在控制台顯示結果,可以使用foreach迴圈來遍歷儲存在string []數組中的值,並在迴圈塊內部調用Console.WriteLine()方法,將迭代器變量作為參數。

此方法不僅能讀取一維條碼格式(Codabar、Code128、Code39、Code93、EAN13、EAN18、ITF、MSI、UPCA、UPCE),還能讀取多種圖像格式的二維條碼格式(Aztec、DataMatrix、QRCode)。

設定條碼讀取器選項

感覺條碼讀取太慢了嗎? 圖片中的條碼太小,IronBarcode 無法讀取? 想要只讀取圖像的特定區域嗎? 想要在混合條碼的圖像中只讀取特定類型的條碼嗎? 想要提升整體閱讀表現嗎? 不必再擔心!

BarcodeReaderOptions 允許用戶調整條碼讀取器的行為,以解決上述所有問題。 讓我們逐一查看並詳細討論BarcodeReaderOptions中所有可調整的屬性:

裁剪區域

CropAreaBarcodeReaderOptions 中的一個屬性,類型為 IronSoftware.Drawing.CropRectangle,允許用戶指定希望 IronBarcode 讀取的圖像區域。 這將有助於提高讀取性能,因為條碼讀取器不需要掃描整個圖像來尋找條碼,同時也由於已指定讀取區域,因此提高了讀取準確性。

要設置CropArea屬性,只需實例化一個新的矩形類型對象,並將矩形的坐標、寬度和長度作為參數指定即可。 接受的測量單位是像素(px)。 CropArea = new IronSoftware.Drawing.Rectangle(x, y, width, height)

期望條碼類型

預設情況下,IronBarcode 將掃描圖片中的所有支持的條碼。 然而,如果用戶知道圖像中有哪些類型的條碼或希望讀取哪些類型的條碼,將此屬性設置為僅讀取某些類型的條碼將大大提高讀取性能和準確性,因為條碼讀取器不需要遍歷條碼集合來解釋和讀取條碼。

若要使用此屬性,只需將 ExpectBarcodeTypes 設定為 BarcodeEncoding 列舉中的某個欄位。 讓我們了解 IronBarcode 支持的每一種條碼類型,並查看每種類型的樣本條碼。

  • AllOneDimensional:線性類型的條碼,包括 Codabar、Code128、Code39、Code93、EAN13、EAN18、ITF、MSI、UPCA、UPCE 條碼。

  • AllTwoDimensional:這包括網格、矩陣和堆疊條碼。屬於2維條碼的條碼類型有Aztec、DataMatrix、QRCode條碼。

  • Aztec : Aztec 二維條碼格式。Aztec Code 是一種由 Andrew Longacre, Jr. 和 Robert Hussey 在 1995 年發明的二維條碼。由於其中央尋找圖案類似於阿茲特克金字塔而命名,Aztec 條碼有潛力比其他矩陣條碼使用更少的空間,因為它不需要周圍的空白「靜區」。以下是 Aztec 條碼的例子。
  • Aztec 條碼範例
    阿茲特克條碼
  • Codabar:Codabar 是由 Pitney Bowes Corp. 於 1972 年開發的線性條碼符號。Codabar 只編碼數據(數字)。以下是一個 Codabar 條碼的示例
  • Codabar 條碼範例
    Codabar 條碼
  • Code128:Code 128 是一種高密度線性條碼符號學,定義於 ISO/IEC 15417:2007。它用於字母數字或純數字條碼。以下是 Code128 條碼的示例
  • Code128 條碼樣本
    Code128 條碼
  • Code39:Code 39 是一種可變長度的離散條碼符號學。Code 39 規範定義了 43 個字符,包括大寫字母(A 到 Z)。以下是一個 Code39 條碼的示例。
  • Code39 條碼範例
    Code39 條碼
  • Code93:Code 93 是一維條碼格式。Code 93 是 Intermec 於 1982 年設計的條碼符號學,旨在為 Code 39 提供更高的密度和數據安全性增強。Code 93 支援編碼僅限以下 ASCII 字元:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9 - . $ / + % 空格。以下是一個 Code93 條碼的例子
  • Code93條碼範例
    Code93 條碼
  • DataMatrix:Data Matrix 是一種二維條碼,由排列成方形或矩形圖案的黑白“單元”或模組組成,也稱為矩陣。要編碼的信息可以是文字或數字資料。常見的數據大小從幾個字節到 1556 字節不等。以下是一個 DataMatrix 條碼的範例:
  • DataMatrix 條碼示例
    DataMatrix 條碼
  • EAN13:國際商品編碼(也稱為歐洲商品編碼或EAN)是一種標準,用於描述條碼符號學和編號系統,用於全球貿易中識別來自特定製造商、特定包裝配置的特定零售產品類型。 EAN-13 僅能編碼長度為12或13位數字的數字內容。較短的條碼將會在數字的開頭自動加上前導零(000)。以下是一個EAN13條碼示例。
  • EAN13 條碼範例
    EAN13條碼
  • EAN8:EAN-8是一種EAN/UPC符號條碼,源自較長的國際商品編號(EAN-13)代碼。EAN-8僅可編碼長度為7或8位數的數字(數字)內容。較短的條碼將自動在數字的開頭加上前置零(000)。以下是一個EAN8條碼的例子
  • EAN8 條碼範例
    EAN8 條碼
  • IntelligentMail:Intelligent Mail 2D 條碼格式。Intelligent Mail 條碼(也稱為“IM Barcode”或“美國郵政服務OneCode條碼”或“IMB”)是一種用於美國郵件的65欄條碼。術語“Intelligent Mail”指的是美國郵政服務為國內郵件遞送提供的服務。IM 條碼旨在提供比其前身 POSTNET 和 PLANET 更豐富的信息和功能。請注意,IronBarcode只可以辨識這種類型的條碼。以下是此類條碼的範例
  • IntelligentMail 條碼範例
    IntelligentMail 條碼
  • ITF : ITF-14 是 GS1 對交錯 2 of 5(ITF)條碼的實現,用於編碼全球貿易項目編號。ITF-14 符號通常用於產品的包裝層級,例如 24 罐湯的箱子。ITF-14 將始終編碼 14 位數字。ITF 僅編碼數值數據。如果數字位數不是偶數,則會自動在前面加上一個 '0'。以下是 ITF 條碼的示例。
  • ITF 條碼範例
    ITF 條碼
  • MaxiCode:MaxiCode 二維條碼格式。MaxiCode 是一種公共領域的機器可讀符號系統,最初由聯合包裹服務公司創建和使用。適用於追踪和管理包裹運送,它類似於條碼,但使用排列在六角形網格中的點。請注意,IronBarcode 僅能讀取此類型的條碼。下面是一個此類型條碼的示例
  • MaxiCode條碼範例
    MaxiCode 條碼
  • MSI:MSI 是由 MSI Data Corporation 開發的條碼符號,基於原始 Plessey Code 符號構建。此類型的條碼僅接受數字值。以下是一個 MSI 類型條碼的例子。
  • MSI 條碼範例
    微星條碼
  • PDF417:PDF417 是一種堆疊式線性條碼符號格式,應用於多種領域,主要包括運輸、身份證件和庫存管理。PDF 代表可攜帶數據文件。417 表示代碼中的每個圖樣由 4 條和間距組成,每個圖樣長度為 17 個單位。PDF417 符碼學是由 Symbol Technologies 的王燕秋博士於 1991 年發明的(Wang 1993),它是 ISO 標準 15438。以下是一個 PDF417 條碼的範例。
  • PDF417 條碼範例
    PDF417 條碼
  • Plessey:Plessey Code 是一種基於脈衝寬度調變的1D線性條碼符號,由英國公司 The Plessey Company PLC 於1971年開發。這種條碼類型僅接受數字值。以下是 Plessey 條碼的示例。
  • Plessey 條碼範例
    普萊西條碼
  • QR碼:QR碼(從快速反應碼縮寫而來)是矩陣條碼(一種二維條碼)的商標,最初於1994年為日本汽車行業設計。條碼是一種機器可讀的光學標籤,包含有關所附物品的信息。QR碼採用四種標準化的編碼模式(數字、字母數字、字節/二進位和漢字)來有效存儲數據;也可以使用擴展。以下是一個QR碼條碼的例子。
  • QRCode 條碼範例
    QR碼 條碼
  • Rss14:減少空間符號 14 條碼格式。可以表示為 1D 條碼或堆疊 2D 條碼。RSS 14 條碼(減少空間符號)將完整的 14 位數 EAN.UCC 項目識別編碼在一個符號中,該符號可以由適當配置的銷售點激光掃描器全向掃描。這是 EAN International 和 Uniform Code Council, Inc. 最新的、適用於空間限制識別的條碼類型。RSS 條碼已被確定為針對食品雜貨行業和醫療保健業的目標,這些行業中的物品太小,無法允許其他條碼符號。請注意,IronBarcode 僅能讀取 這種類型的條碼。以下是 Rss14 條碼的一個示例
  • 一維 Rss14 條碼範例
    一維 Rss14 條碼
    2D Rss14 條碼範例
    2 維 Rss14 條碼
  • UPCA:通用產品代碼(UPC)是一種條形碼標準,在美國、加拿大、英國、澳大利亞、新西蘭、歐洲和其他國家廣泛用於商店內交易商品的追蹤。UPC(技術上指的是UPC-A)由12位數字組成,唯一地分配給每個交易商品。與相關的EAN條形碼一起,UPC是根據GS1規範主要用於在銷售點掃描交易商品的條形碼。UPCA僅能編碼12或13位長度的數字內容(位數)。較短的條形碼會自動在數字開頭添加零(000)。以下是UPCA條形碼的示例:
  • UPCA 條碼範例
    UPCA 條碼
  • UPCE:為了讓UPC條形碼可以用於較小的包裝上,因為完整的12位數條形碼可能無法適應,因此開發了UPC的“零抑制”版本,稱為UPC-E。其中系統碼數字、製造商代碼中的所有尾隨零,以及產品代碼中的所有前導零都會被抑制。UPCE可能僅可編碼長度為7位或8位的數字(數字)內容。下面是一個UPCE條形碼的示例
  • UPCE 條碼範例
    UPCE 條碼

預期多個條碼

IronBarcode預設會掃描圖像中的所有條形碼,這包括掃描整個圖像文件並將讀取的條形碼值添加到字符串數組中。 但是,如果使用者不希望在圖像檔中讀取多個條碼,可以將此屬性設為false,這將使條碼讀取器在找到條碼值後停止掃描。 這將再次提升IronBarcode的性能和讀取速度。

圖像過濾器

BarcodeReaderOptions中可以添加的一個屬性是影像過濾器的集合。 图像过滤器对于预处理馈送到Iron Barcode的原始图像非常重要。 要在BarcodeReaderOptions中應用影像濾鏡,使用者必須先初始化並指定要使用的ImageFilter集合。

最大并行线程

IronBarcode 也允許用戶啟用並調整平行線程執行的數量,這將反過來提高處理的速度和效率。 並行線程是指在不同處理器核心上同時執行多個線程。 IronBarcode 中 MaxParallelThread 屬性的默認值為 4。用戶可以根據其機器的能力和資源數量進行調整。

多線程

此屬性允許IronBarcode同時讀取多個影像。 Multihreaded的預設值是True,因此會自動管理多個執行緒,以提高批次條碼讀取任務的效能。

移除誤報

此屬性將移除所有錯誤的正面條碼讀取。 錯誤的正確條碼讀取僅指條碼值的錯誤讀取,但被識別為有效。 這可能是由於序列化過程中的錯誤,例如序列化錯誤,或者條碼標籤或準備過程中的錯誤。 因此,將RemoveFalsePositive設為 true 將會移除誤報的條碼讀取結果,從而提高條碼讀取的準確性。 然而,如果用戶願意犧牲準確性來提高效能,將此屬性設為False會有所幫助。此屬性的預設值為True

掃描模式

定義 IronBarcode 如何在圖像中掃描和檢測條碼。

  • 自動:使用自動圖像預處理和配置的最佳讀取選項來讀取條碼。 建議以獲得最佳效果和性能。
  • OnlyDetectionModel:掃描圖像中的條碼,並將其位置作為IronSoftware.Drawing.PointF的數組返回。 此模式不讀取檢測到的條碼; 它只返回每個條碼的位置。
  • MachineLearningScan:使用機器學習檢測來掃描圖像中的條碼並讀取它們。
  • OnlyBasicScan:僅讀取條碼,無機器學習偵測、無自動影像預處理或讀取器選項配置。

    此選項可以單獨用於 IronBarCode.Slim。

閱讀速度

如名稱所示,Speed 屬性使使用者能夠進一步優化 IronBarcode 閱讀器的性能。 與 RemoveFalsePositive 屬性類似,調整此屬性可以提高性能,但會以準確性為代價。 它接受ReadingSpeed列舉,該列舉有以下四個級別:

  • 更快:將速度屬性設置為此值可實現最快的條碼讀取,但會降低準確性。 該過程跳過圖像預處理,往往導致條碼結果為空。 僅在輸入圖像清晰銳利時使用此設置。
  • 平衡建議此設定用於Speed屬性。 它通過嘗試對圖像進行輕度處理來平衡精確性和讀取性能,以便澄清條碼區域並使其突出,以便條碼讀取器能夠檢測到。 大多數時候,這個設定足以讓 IronBarcode 讀取條碼圖片並產生準確的輸出。
  • 詳細:如果使用設定ReadingSpeed.Balanced未能成功從讀取中產生條碼值,用戶可以選擇使用ReadingSpeed.Detailed。 IronBarcode 將對圖像進行中等處理,以便更清晰地澄清條碼區域,讓條碼讀取器更容易檢測到條碼。 此設定非常有用於偵測小型或較不清晰的條碼圖像。
  • ExtremeDetail:這個設置是最不推薦的設置,因為它的CPU處理過程相當密集,需要對條碼圖像進行繁重的處理,以便讀取器能夠讀取條碼。 這將大大降低IronBarcode的讀取性能。 在選擇此設定之前,建議用戶對圖像進行預處理/應用濾鏡。

    請注意,此設定需大量使用 CPU,可能會影響讀取性能。 在使用此設定之前,建議使用者先嘗試其他設定。 將ReadingSpeed.DetailedRemoveFalsePositive設定為「True」的結合將在控制台中打印警告。 然而,它不會影響讀取,可以忽略。 -->

    請注意,此設定需大量使用 CPU,可能會影響讀取性能。 在使用此設定之前,建議使用者先嘗試其他設定。 將ReadingSpeed.ExtremeDetailRemoveFalsePositive設置為“True”結合使用時,將在控制台打印警告。 然而,它不會影響讀取,可以忽略。 -->

使用Code39擴展模式

此設定允許以擴展模式讀取和解釋Code39類型條碼,從而應用完整的ASCII字符集。 將 UseCode39ExtendedMode 設置為 True 將啟用更精確的 Code39 條碼讀取。

從圖像進階讀取條碼

現在我們已經學會了所有可以由使用者調整的選項,無論是為了提高性能還是精確度,讓我們來看看如何在我們的代碼中應用它。 以下的程式碼片段進行了演示。

:path=/static-assets/barcode/content-code-examples/how-to/read-barcodes-from-images-2.cs
using IronBarCode;
using System;

BarcodeReaderOptions myOptions = new BarcodeReaderOptions()
{
    ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional, //or AllTwoDimensional
    ExpectMultipleBarcodes = true, // Default is true
    MaxParallelThreads = 2, // Default is 4
    Speed = ReadingSpeed.Detailed, // 4 levels of speed. Default is Balanced
    CropArea = new IronSoftware.Drawing.Rectangle(x: 242, y: 1124, width: 359, height: 378), // Units are in px
    ImageFilters = new ImageFilterCollection { new BinaryThresholdFilter() }, // Assign to image filter object name
    Multithreaded = true, // Default is true
    UseCode39ExtendedMode = true, // Default is true

};

var myBarcode = BarcodeReader.Read(@"image_file_path.jpg", myOptions); // Image file path

foreach (var item in myBarcode)
{
    Console.WriteLine(item.ToString());
}
Imports IronBarCode
Imports System

Private myOptions As New BarcodeReaderOptions() With {
	.ExpectBarcodeTypes = BarcodeEncoding.AllOneDimensional,
	.ExpectMultipleBarcodes = True,
	.MaxParallelThreads = 2,
	.Speed = ReadingSpeed.Detailed,
	.CropArea = New IronSoftware.Drawing.Rectangle(x:= 242, y:= 1124, width:= 359, height:= 378),
	.ImageFilters = New ImageFilterCollection From {New BinaryThresholdFilter()},
	.Multithreaded = True,
	.UseCode39ExtendedMode = True
}

Private myBarcode = BarcodeReader.Read("image_file_path.jpg", myOptions) ' Image file path

For Each item In myBarcode
	Console.WriteLine(item.ToString())
Next item
$vbLabelText   $csharpLabel

從程式碼片段中,我們可以看到,要使用BarcodeReaderOptions,我們必須先初始化它,然後可以根據上面所述的屬性來確定和調整BarcodeReaderOptions的屬性。 初始化的BarcodeReaderOptions然後可以用作BarcodeReader.Read()方法中的參數,並與圖像文件一起使用。這將在從圖像中讀取條碼時應用BarcodeReaderOptions中的所有設置。

Hairil related to 從圖像進階讀取條碼
海里海西米·賓·奧馬
軟體工程師
和所有優秀的工程師一樣,Hairil 是一位熱衷學習的人。他正在精進自己對 C#、Python 和 Java 的知識,利用這些知識為 Iron Software 團隊的成員創造價值。Hairil 從馬來西亞的馬來西亞工藝大學加入了 Iron Software 團隊,他在那裡獲得了化學和過程工程學士學位。