如何从图像文件(jpg、png、gif、tiff、svg、bmp)中读取条形码

This article was translated from English: Does it need improvement?
Translated
View the article in English

海瑞尔 哈西米 本 奥马尔




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

第一步:
green arrow pointer

直接从图像读取条形码

IronBarcode的一个关键功能是其能够直接从多种图像格式中读取条形码。 这包括:

* 可伸缩矢量图形(SVG)

* 联合图像专家小组(JPEG)

* 便携式网络图形(巴新)

* 图形交换格式(图像互换格式)

* 标记图像文件格式(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
VB   C#
QRcodeintro related to 直接从图像读取条形码
测试二维码样本
Code128intro related to 直接从图像读取条形码
测试条形码样本

想知道样本中的条形码值是多少吗?用代码片段试试吧 要使用IronBarcode,首先需要通过Microsoft Visual Studio NuGet包管理器将IronBarcode库安装到您的项目中,如下图所示。 这将允许您访问IronBarcode BarcodeReader.Read() method to directly read barcode image.

从上面的代码片段中,我们可以看到IronBarcode通过允许用户只使用 BarcodeReader.Read() 来读取已包含在项目中的图像文件。 文件名 字符串,或 文件路径 将字符串作为方法的参数。 最佳实践是在方法中指定文件路径时使用逐字字符串文字“@”,因为不包括此字符将需要用户在文件路径字符串中添加多个转义字符“\”。

附加 价值观() 方法末尾的 BarcodeReader.Read() 方法调用,以获取条形码值作为 System.String [] object.

要在控制台显示结果,您可以使用 执行 循环,遍历存储在 字符串 [] 数组,并在循环块内调用 Console.WriteLine() method with the iterator variable as the parameter.

此方法不仅能够读取一维条码格式(Codabar, Code128, Code39, Code93, EAN13, EAN18, ITF, MSI, UPCA, UPCE)它还能读取二维条形码格式(Aztec、DataMatrix、QRCode)各种图像格式。

设置条码阅读器选项

感觉条形码读取太慢了吗? 图片中的条形码太小,IronBarcode无法读取? 要只读取图像的特定区域吗? 想要在包含多种条码的图像中只读取特定类型的条码吗? 想要提升整体阅读表现吗? 不用再担心了!

条码阅读器选项 允许用户调整或修改条形码读取器的行为,以便解决上述所有问题。 让我们详细查看和讨论所有可调整的属性。 条码阅读器选项 一一对应:

作物面积

作物面积 是一个 IronSoftware.Drawing.CropRectangle 可提供 条码阅读器选项 允许用户指定图像中用户希望IronBarcode读取的区域。 这将有助于提高读取性能,因为条码读取器无需扫描整个图像来寻找条码,同时也因为已经指定了读取区域,从而提高读取准确性。

要设置 作物面积 属性,只需实例化一个新的 Rectangle 类型对象,并以参数形式指定矩形的坐标、宽度和长度。 接受的测量单位是像素。(px). CropArea = new IronSoftware.Drawing.Rectangle(x, y, width, height)

期望条码类型

默认情况下,IronBarcode 将扫描图像中支持的所有条形码。 然而,如果用户知道图像中可用或希望读取的条形码类型,将此属性设置为仅读取某些类型的条形码将大大提高读取性能和准确性,因为条形码读取器无需遍历条形码集合来解释和读取条形码。

要使用此属性,只需设置 期望条码类型 的一个字段 条码编码 枚举。 让我们了解IronBarcode支持的每一种条形码类型,并查看每种类型的示例条形码。

  • AllOneDimensional 线性类型的条形码。 This includes Codabar, Code128, Code39, Code93, EAN13, EAN18, ITF, MSI, UPCA, UPCE barcodes.

  • 全二维 : 这包括网格、矩阵和堆叠条形码。 The barcode type that falls under 2 Dimensional barcodes are Aztec, DataMatrix, QRCode barcodes.

  • 阿兹特克 :阿兹台克二维条形码格式。阿兹台克码是由 Andrew Longacre, Jr. 和 Robert Hussey 于 1995 年发明的一种二维条形码。阿兹台克条形码的名称来源于其中央查找器图案与阿兹台克金字塔的相似之处,由于它不需要周围的空白 "静区",因此与其他矩阵条形码相比,阿兹台克条形码有可能使用更少的空间。以下是阿兹台克条形码的示例
  • Aztec 条码样本
    阿兹台克条形码
  • Codabar :Codabar 是 Pitney Bowes 公司于 1972 年开发的一种线性条形码符号。Codabar 编码 仅数字数据(位数.以下是 Codabar 条形码的示例
  • Codabar 条形码样本
    编码条形码
  • 代码 128 : Code 128 是 ISO/IEC 15417:2007 中定义的一种高密度线性条形码符号。它用于 字母数字或仅数字 条形码。以下是 Code128 条形码的示例
  • Code128 条形码示例
    Code128 条形码
  • 代码 39 :Code 39 是一种长度可变的离散条形码符号。Code 39 规范 定义了 43 个字符,由大写字母组成 (A 到 Z)。以下是 Code39 条形码的示例
  • Code39 条形码示例
    Code39 条形码
  • 代码 93 :Code 93 1D 条形码格式。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 条形码
  • 数据矩阵 :数据矩阵(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 条形码
  • 智能邮件 :智能邮件二维条形码格式。智能邮件条形码(Intelligent Mail Barcode,又称 "IM Barcode "或 "USPS OneCode Barcodes "或 "IMB")是用于美国邮件的 65 条条形码。智能邮件 "一词指的是美国邮政为国内邮件投递提供的服务。IM 条形码旨在提供比其前身 POSTNET 和 PLANET 更多的信息和功能。请注意,IronBarcode 可以 只读 这种类型的条形码。以下是此类条形码的示例
  • 智能邮件条码示例
    智能邮件条形码
  • ITF : ITF-14 是 GS1 实施的 5 条交错 2 (ITF) 条形码,用于编码全球贸易项目编号。ITF-14 符号通常用于产品的各级包装,如一箱 24 罐汤。ITF-14 始终编码 14 位数字。ITF 编码 仅为数值数据.如果位数不是偶数,则会自动加上 "0"。下面是一个 ITF 条形码示例
  • ITF 条形码样本
    ITF 条形码
  • MaxiCode :MaxiCode 二维条形码格式。MaxiCode 是一种公共领域的机器可读符号系统,最初由美国联合包裹服务公司创建和使用。它类似于条形码,但使用的是以六边形网格排列的点。请注意,IronBarcode 可以 只读 这种类型的条形码。以下是此类条形码的示例
  • MaxiCode 条形码样本
    MaxiCode 条形码
  • MSI :MSI 是 MSI 数据公司在原始 Plessey Code 符号基础上开发的一种条形码符号。这种条形码 只接受数值.以下是 MSI 类型条形码的示例
  • MSI 条形码样本
    微星条形码
  • PDF417 :PDF417 是一种堆叠线性条形码符号格式,主要用于运输、身份证和库存管理等多种应用。PDF 是便携式数据文件(Portable Data File)的缩写。417 表示代码中的每个图案由 4 个条形和空格组成,每个图案长 17 个单位。PDF417 符号技术是由 Symbol Technologies 公司的 Ynjiun P. Wang 博士于 1991 年发明的。(Wang 1993)它是 ISO 标准 15438。以下是 PDF417 条形码的示例
  • PDF417 条形码样本
    PDF417 条形码
  • 医药代码 :医药二进制代码。医疗行业使用的读取容错二进制条形码标准。请注意,IronBarcode 可以 只读 这种类型的条形码。以下是 PharmaCode 条形码的示例
  • PharmaCode 条码示例
    PharmaCode 条形码
  • 普莱斯 :Plessey Code 是一种基于脉宽调制的一维线性条形码符号,由英国 Plessey Company PLC 公司于 1971 年开发。这种条形码类型 只接受数值.以下是 Plessey 条形码示例
  • Plessey 条形码示例
    Plessey 条形码
  • QRCode : QR 码(Quick Response Code 的缩写)是一种矩阵条形码(或二维条形码)的商标,最早于 1994 年为日本汽车行业设计。条形码是一种机器可读的光学标签,包含与所附物品有关的信息。QR 码使用四种标准化编码模式(数字、字母数字、字节/二进制和汉字)来有效存储数据;也可以使用扩展模式。以下是 QR 码条形码的示例
  • QRCode 条形码样本
    QRCode 条形码
  • Rss14 :Reduce Space Symbology 14 条码格式。可表示一维条形码或堆叠二维条形码。RSS 14 条形码(Reduce Space Symbology)将完整的 14 位 EAN.UCC 项目标识编码在一个符号中,该符号可由适当配置的销售点激光扫描仪进行全方位扫描。它是 EAN International 和 Uniform Code Council, Inc.最新推出的用于空间受限识别的条形码类型。RSS 条形码已被确定用于食品杂货业和医疗保健业,因为这些行业的物品太小,无法使用其他条形码符号。请注意,IronBarcode 可以 只读 这种类型的条形码。以下是 Rss14 条形码的示例
  • 1D Rss14 条码样本
    维 Rss14 条码
    二维 Rss14 条码样本
    维 Rss14 条码
  • UPCA :通用产品代码(UPC)是一种条形码符号,在美国、加拿大、英国、澳大利亚、新西兰、欧洲和其他国家广泛使用,用于跟踪商店中的商品。UPC (技术上指 UPC-A)由 12 个数字组成,每个商品都有唯一的数字编号。根据 GS1 规范,UPC 与相关的 EAN 条形码一起,是主要用于在销售点扫描商品的条形码。UPCA 可以 只对长度为 12 或 13 位数的数字(位数)内容进行编码.较短的条形码将自动在数字开头预置尾零 (000)。以下是 UPCA 条形码的示例
  • UPCA 条形码样本
    UPCA 条形码
  • UPCE :为了能在较小的包装上使用 UPC 条形码(12 位数的条形码可能放不下),开发了一种 UPC 的 "零抑制 "版本,称为 UPC-E,其中的数字系统位数、制造商代码中的所有尾数零和产品代码中的所有前导零都被抑制。UPCE 可以 只对长度为 7 或 8 位数的数字(位数)内容进行编码.以下是 UPCE 条形码示例
  • UPCE 条形码样本
    UPCE 条形码

ExpectMultipleBarcodes

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

图像过滤器

One of the properties that can be added in 条码阅读器选项 是一组图像滤镜。 图像过滤器对于预处理输入到IronBarcode的原始图像非常重要。 要在内部应用图像过滤器 条码阅读器选项用户必须首先启动并指定 图像过滤器 要使用的收集。

最大并行线程数

IronBarcode还允许用户启用和调整并行线程执行的数量,从而提高处理速度和效率。 并行线程意味着在不同的处理器核心上同时执行多个线程。 默认金额为 最大并行线程 IronBarcode 中的属性为 4,用户可以根据自己机器的能力和资源量进行调整。

多线程

此属性使IronBarcode能够并行读取多个图像。 默认为 多线程正确因此,多线程将被自动管理,以提高批量条形码读取任务的性能。

删除假阳性

此属性消除任何错误的正面条形码读取。 错误的条码读取仅指错误读取条码值,但被识别为有效。 这可能是由于测序过程中的错误,例如测序错误,或者是在条形码标记或准备过程中的错误。 因此,设置 删除假阳性 将true设置为真将消除误报的条形码读取,从而提高条形码读取的准确性。 但是,如果用户为了性能而牺牲准确性,将此属性设置为 假的 会有帮助。该属性的默认值是 正确.

速度

正如名称所示, 速度 使用户可以进一步优化IronBarcode条形码阅读器的性能。 相同 删除假阳性 属性,调整此属性将以牺牲准确性为代价提高性能,具体分为以下四个等级:

  • ReadingSpeed.Faster

    设置 速度 将此属性设置为此值将使条形码的读取速度最快,但会牺牲准确性。 程序执行速度很快,但大多数时候会返回空的条形码结果。这是因为输入图像没有经过预处理。 简直 IronBarcode 将条形码图像按原样读取。 如果用户确信输入图像清晰锐利,建议只使用此值。

  • ReadingSpeed.Balanced

    此设置为 推荐速度 属性。 它通过尝试对图像应用轻处理来平衡精度和读取性能,以便清晰地标识出条码区域,使条码阅读器能够更容易地检测到。 大多数情况下,此设置足以让IronBarcode读取条码图像并产生准确的输出。

  • ReadingSpeed.Detailed

    如果使用设置 ReadingSpeed.Balanced 如果不能成功读取条形码值,用户可以选择使用 ReadingSpeed.Detailed. IronBarcode将对图像进行中等处理,以进一步清晰地勾勒出条形码区域,使条形码阅读器更容易识别条形码。 此设置非常有用,可以检测到小型或不够清晰的条形码图像。

    请注意,此设置会占用大量CPU资源,并可能影响读取性能。 用户被鼓励在使用此设置之前尝试其他设置。 组合 ReadingSpeed.Detailed删除假阳性 设置为“True”将在控制台打印警告。 但是,这不会影响阅读,可以忽略。

  • ReadingSpeed.ExtremeDetail

    该设置是 丝毫 由于其 CPU 密集型过程,建议设置此选项,这样将对条形码图像进行大量处理,以便读取器能够读取条形码。 这将极大地降低IronBarcode的读取性能。 在选择此设置之前,建议用户对图像进行预处理/应用滤镜。

    请注意,此设置会占用大量CPU资源,并可能影响读取性能。 用户被鼓励在使用此设置之前尝试其他设置。 组合 ReadingSpeed.ExtremeDetail删除假阳性 设置为“True”将在控制台打印警告。 但是,这不会影响阅读,可以忽略。

使用代码 39 扩展模式

此设置允许以扩展模式读取和解释 Code39 类型的条形码,从而应用完整的 ASCII 字符集。 设置 使用代码 39 扩展模式正确 可以更准确地读取 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
VB   C#

从代码片段中,我们可以看到,要使用 条码阅读器选项 我们必须首先对其进行初始化,然后才能确定和调整 条码阅读器选项 根据上述属性。 已初始化 条码阅读器选项 随后可以在 BarcodeReader.Read() 方法和图像文件。这将应用 条码阅读器选项 从图像中读取条形码时。

Hairil related to 从图像中高级条码读取

海瑞尔 哈西米 本 奥马尔

软件工程师

像所有优秀的工程师一样,Hairil 是一个热衷学习的人。他正在精进自己的 C#、Python 和 Java 知识,并利用这些知识为 Iron Software 团队成员增添价值。Hairil 毕业于马来西亚的马来西亚工艺大学(Universiti Teknologi MARA),获得了化学与工艺工程学士学位,然后加入了 Iron Software 团队。