如何从图像文件(JPEG、PNG、GIF、TIFF、SVG、BMP)中读取 BarCode

Hairil related to 如何从图像文件(JPEG、PNG、GIF、TIFF、SVG、BMP)中读取 BarCode
海瑞尔 哈西米 本 奥马尔
2023年三月19日
更新 2025年二月8日
分享:
This article was translated from English: Does it need improvement?
Translated
View the article in English


立即在您的项目中开始使用IronBarcode,并享受免费试用。

第一步:
green arrow pointer

直接从图像中读取 BarCode

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 直接从图像中读取 BarCode
测试二维码样本
Code128intro related to 直接从图像中读取 BarCode
测试条形码样本

想知道示例中的 BarCode 值是多少吗?请使用代码片段进行尝试! 要使用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属性,只需实例化一个新的Rectangle类型对象,并将矩形的坐标、宽度和长度作为参数指定。 接受的测量单位是像素(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:这包括网格、矩阵和堆叠条形码。属于二维条形码的类型包括Aztec、DataMatrix、QRCode条形码。

  • Aztec:Aztec 二维条码格式。Aztec Code 是由 Andrew Longacre, Jr. 和 Robert Hussey 于 1995 年发明的一种二维条码。由于其中心定位图案类似于阿兹特克金字塔,因此得名 Aztec。Aztec 码可能比其他矩阵条码占用更少的空间,因为它不需要周围空白的“静区”。下面是 Aztec 条形码的示例。
  • Aztec 条码样本
    阿兹台克条形码
  • Codabar:Codabar 是由 Pitney Bowes Corp. 于 1972 年开发的线性条形码符号。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二维条码格式。Intelligent Mail Barcode(也称为“IM Barcode”或“USPS OneCode Barcodes”或“IMB”)是一个用于美国邮件的65条条码。“Intelligent Mail”这一术语指的是美国邮政服务提供的国内邮件投递服务。IM条码旨在提供比其前身POSTNET和PLANET更多的信息和功能。请注意,IronBarcode只能读取这种类型的条码。以下是这种类型条码的一个示例。
  • 智能邮件条码示例
    智能邮件条形码
  • ITF:ITF-14 是 GS1 对交错 2 之 5 (ITF) 条形码的实现,用于编码全球贸易项目编号。ITF-14 符号通常用于产品的包装层级,例如 24 罐汤的纸箱。ITF-14 始终编码 14 位数字。ITF 仅编码数字数据。如果数字位数不是偶数,则会自动在前面加上 '0'。以下是 ITF 条形码的示例。
  • ITF 条形码样本
    ITF 条形码
  • MaxiCode:MaxiCode 是一种二维条码格式。MaxiCode 是一种公共领域的机器可读符号系统,最初由联合包裹服务公司(UPS)创建并使用。适用于跟踪和管理包裹的运输,它类似于条码,但采用的是六边形网格排列的点。请注意,IronBarcode只能读取这种类型的条码。以下是这种类型条码的一个示例。
  • MaxiCode 条形码样本
    MaxiCode 条形码
  • MSI:MSI 是由 MSI Data Corporation 开发的一种条形码符号,基于最初的 Plessey Code 符号。此类条形码仅接受数字值。以下是 MSI 类型条形码的示例:
  • MSI 条形码样本
    微星条形码
  • PDF417:PDF417 是一种堆叠线性条码符号格式,广泛应用于运输、身份证件和库存管理等领域。PDF 代表便携数据文件。417 表示代码中的每个模式由 4 条和空格组成,并且每个模式长度为 17 个单位。PDF417 符号学由 Dr. Ynjiun P. Wang 于 1991 年在 Symbol Technologies 发明。(Wang 1993)其为 ISO 标准 15438。以下是 PDF417 条码的示例。
  • PDF417 条形码样本
    PDF417 条形码
  • Plessey:Plessey代码是一种基于脉冲宽度调制的1D线性条码符号系统,由总部设在英国的The Plessey Company PLC于1971年开发。这种条码类型仅接受数字值。以下是一个Plessey条码示例:
  • Plessey 条形码示例
    Plessey 条形码
  • 二维码:二维码(自快速响应码缩写)是矩阵条码(或二维条码)的商标,最初于1994年为日本汽车行业设计。条码是一种机器可识别的光学标签,其中包含有关附加物品的信息。二维码使用四种标准化编码模式(数字、字母数字、字节/二进制和汉字)来高效存储数据;扩展名也可用于。下面是一个二维码条码的示例。
  • QRCode 条形码样本
    QRCode 条形码
  • Rss14:缩减空间符号 14 条码格式。可以表示为一维条码或堆叠的二维条码。RSS 14 条码(缩减空间符号)以一个符号编码完整的 14 位 EAN.UCC 项目标识,可以通过适当配置的销售点激光扫描器进行全向扫描。它是来自 EAN 国际和统一代码委员会公司用于空间受限识别的最新条码类型。RSS 条码被认定为面向杂货业和医疗保健领域,这些领域的商品太小,无法采用其他条码符号。请注意,IronBarcode 仅能读取这种类型的条码。下面是一个 Rss14 条码的示例。
  • 1D Rss14 条码样本
    1 维 Rss14 条码
    二维 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 条形码

ExpectMultipleBarcodes

IronBarcode默认情况下将扫描图像中的所有条形码,这包括扫描整个图像文件并将读取的条形码值添加到字符串数组中。 然而,如果用户不希望读取图像文件中的多个条形码,用户可以将此属性设置为false,这将使条形码读取器在找到一个条形码值后停止扫描。 这将再次提高IronBarcode的性能和读取速度。

图像过滤器

BarcodeReaderOptions中可以添加的属性之一是图像滤镜的集合。 图像过滤器对于预处理输入到IronBarcode的原始图像非常重要。 要在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" 结合使用时,会在控制台中打印警告。 但是,这不会影响阅读,可以忽略。 -->

使用代码 39 扩展模式

此设置允许以扩展模式读取和解释 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 毕业于马来西亚的马来西亚工艺大学(Universiti Teknologi MARA),获得了化学与工艺工程学士学位,然后加入了 Iron Software 团队。