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

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

海瑞尔 哈西米 本 奥马尔




适用于的C# NuGet库

安装使用 NuGet

Install-Package BarCode
Java PDF JAR

下载 DLL

下载DLL

手动安装到你的项目中

适用于的C# NuGet库

安装使用 NuGet

Install-Package BarCode
Java PDF JAR

下载 DLL

下载DLL

手动安装到你的项目中

开始在您的项目中使用IronPDF,并立即获取免费试用。

第一步:
green arrow pointer

查看 IronBarcodeNuget 用于快速安装和部署。它有超过800万次下载,正在使用C#改变。

适用于的C# NuGet库 nuget.org/packages/BarCode/
Install-Package BarCode

考虑安装 IronBarcode DLL 直接。下载并手动安装到您的项目或GAC表单中: IronBarCode.zip

手动安装到你的项目中

下载DLL

直接从图像中读取条形码

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#
测试二维码样本
测试条形码样本

想知道样本中的条形码值是多少吗?用代码片段试试吧 要使用 IronBarcode,首先要通过 Microsoft Visual Studio NuGet 软件包管理器在项目中安装 IronBarcode 库,如下图所示。这将允许您访问 IronBarcode 条码阅读器.读取() 方法直接读取条形码图像。

从上面的代码片段中,我们可以看到 IronBarcode 允许用户只使用 条码阅读器.读取() 来读取已包含在项目中的图像文件。 文件名 字符串,或 文件路径 字符串作为方法的参数。最佳做法是,在方法中指定文件路径时使用逐字字符串字面"@",否则用户需要在文件路径字符串中添加多个转义字符"\"。

附加 价值观() 方法末尾的 条码阅读器.读取() 方法调用,以获取条形码值作为 System.String [] 反对

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

This method does not only able to read 1-Dimensional barcode formats(Codabar, Code128, Code39, Code93, EAN13, EAN18, ITF, MSI, UPCA, UPCE)它还能读取二维条形码格式(Aztec、DataMatrix、QRCode) 各种图像格式。

设置条形码阅读器选项

感觉条码读取太慢?图片中的条码太小,IronBarcode 无法读取?只想读取图像的特定区域?只想读取图像中混合条码中的特定类型条码?想要提高整体读取性能?不用担心!

条码阅读器选项 允许用户调整条码阅读器的行为,从而解决上述所有问题。让我们来详细了解和讨论条码阅读器中的所有可调整属性。 条码阅读器选项 一一对应:

作物面积

作物面积 是一个 IronSoftware.Drawing.CropRectangle 可提供 条码阅读器选项 它允许用户在图像中指定希望 IronBarcode 读取的区域。这将有助于提高读取性能,因为条形码读取器不需要扫描整个图像来读取条形码,而且由于指定了读取区域,还能提高读取精度。

要设置 作物面积 属性,只需实例化一个新的矩形类型对象,并指定矩形坐标、宽度和长度作为参数即可。可接受的测量单位是像素(px).

CropArea = new IronSoftware.Drawing.Rectangle(x, y, width, height)

期望条码类型

默认情况下,IronBarcode 支持的所有条码都将以图像形式扫描。但是,如果用户知道有哪些类型的条形码可用或想在图像中读取哪些类型的条形码,将此属性设置为只读取特定类型的条形码将大大提高读取性能和准确性,因为条形码阅读器无需遍历条形码集合来解释和读取条形码。

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

  • AllOneDimensional :线性条形码类型。这包括 Codabar、Code128、Code39、Code93、EAN13、EAN18、ITF、MSI、UPCA、UPCE 条码。

  • 全二维 :包括网格条码、矩阵条码和堆叠条码。属于二维条码的条码类型有 Aztec、DataMatrix 和 QRCode 条码。

  • 阿兹特克 : 阿兹特克 2D barcode format. 阿兹特克 Code is a type of 2D barcode invented by Andrew Longacre, Jr. and Robert Hussey in 1995. Named after the resemblance of the central finder pattern to an 阿兹特克 pyramid, 阿兹特克 code has the potential to use less space than other matrix barcodes because it does not require a surrounding blank "quiet zone". Below is an example of an 阿兹特克 Barcode
  • 阿兹特克 barcode sample
    阿兹特克 Barcode
  • Codabar :Codabar 是 Pitney Bowes 公司于 1972 年开发的一种线性条形码符号。Codabar 编码 仅数字数据(位数.以下是 Codabar 条形码的示例
  • Codabar 条形码样本
    编码条形码
  • 代码 128 : Code 128 是 ISO/IEC 15417:2007 中定义的一种高密度线性条形码符号。它用于 字母数字或仅数字 barcodes. Below is an example of 代码 128 barcode
  • 代码 128 barcode sample
    代码 128 Barcode
  • 代码 39 :Code 39 是一种长度可变的离散条形码符号。Code 39 规范 定义了 43 个字符,由大写字母组成 (A through Z). Below is an example of a 代码 39 barcode
  • 代码 39 barcode sample
    代码 39 Barcode
  • 代码 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 - . $ / + % SPACE. Below is an example of a 代码 93 barcode
  • 代码 93 barcode sample
    代码 93 Barcode
  • 数据矩阵 :数据矩阵(Data Matrix)是一种二维条形码,由黑白 "单元 "或模块组成,以正方形或长方形模式排列,也称为矩阵。要编码的信息可以是 文本或数字数据. Usual data size is from a few bytes up to 1556 bytes. Below is an example of a 数据矩阵 barcode
  • 数据矩阵 barcode sample
    数据矩阵 Barcode
  • 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 可以 只读 这种类型的条形码。以下是此类条形码的示例
  • 智能邮件 barcode sample
    智能邮件 Barcode
  • 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 数据公司在原始 普莱斯 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 可以 只读 this type of barcode. Below is an example of a 医药代码 barcode
  • 医药代码 barcode sample
    医药代码 Barcode
  • 普莱斯 : 普莱斯 Code is a 1D linear barcode symbology based on pulse width modulation, developed in 1971 by The 普莱斯 Company PLC, a British-based company. This barcode type 只接受数值. Below is an example of a 普莱斯 barcode
  • 普莱斯 barcode sample
    普莱斯 Barcode
  • 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 条码样本
    1 维 Rss14 条码
    二维 Rss14 条码样本
    2 维 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 的性能和读取速度。

图像过滤器s

可以在 条码阅读器选项 是一个图像过滤器集合。图像过滤器对于预处理输入到 Iron Barcode 的原始图像非常重要。要在 条码阅读器选项用户必须首先启动并指定 图像过滤器 要使用的收集。

最大并行线程 s

IronBarcode 还允许用户启用和调整并行线程的执行量,这反过来又会提高进程的速度和效率。并行线程是指在不同的处理器内核上同时执行多个线程。并行线程的默认数量为 最大并行线程 IronBarcode 中的属性为 4,用户可以根据自己机器的能力和资源量进行调整。

多线程

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

删除假阳性

此属性可删除任何假阳性条形码读数。假阳性条形码读数简单地说就是条形码值的错误读数,但被识别为有效。这可能是由于测序过程中的错误(如测序错误)或条形码标记或制备过程中的错误造成的。因此,设置 删除假阳性 为 true 时,将删除假阳性条形码读数,从而提高条形码读取的准确性。但是,如果用户需要以牺牲准确性为代价来提高性能,那么将此属性设置为 假的 会有帮助。该属性的默认值是 正确.

速度

顾名思义、 速度 使用户能够进一步优化 IronBarcode 条码阅读器的性能。与 删除假阳性 属性,调整该属性将以牺牲精确度为代价提高性能,但会分为 4 个级别,如下所示: 4.

  • Reading速度.Faster

    设置 速度 属性设置为该值将使条形码读取速度最快,但会牺牲准确性。程序会快速完成执行,但大部分时间条码结果都是空的。这是因为输入图像未经预处理 简直 则 IronBarcode 将按原样读取条码图像。用户只有在确信输入图像清晰锐利的情况下才可使用该值。

  • Reading速度.Balanced

    此设置为 推荐速度 属性。它在准确性和读取性能之间设定了一个平衡点,尝试对图像进行光处理,使条形码区域清晰并突出,以便条形码阅读器进行检测。大多数情况下,此设置足以让 IronBarcode 读取条形码图像并生成准确的输出。

  • Reading速度.Detailed

    如果使用设置 Reading速度.Balanced 如果不能成功读取条形码值,用户可以选择使用 Reading速度.Detailed.IronBarcode 将对图像进行 Medium Processing(中度处理),以进一步澄清条形码区域,使条形码阅读器能够更清晰地检测到条形码。此设置对于检测较小或不太清晰的条形码图像非常有用。

    但请注意,此设置需要大量 CPU 资源,可能会影响读取性能。建议用户在使用此设置之前先与其他设置进行试验。组合 Reading速度.Detailed删除假阳性 设置为 "True "将在控制台打印警告。不过,这不会影响读取,可以忽略。

  • Reading速度.ExtremeDetail

    此设置为 丝毫 推荐设置是由于其 CPU 密集型处理过程,即为了让阅读器能够读取条形码,将对条形码图像进行重型处理。这将大大降低 IronBarcode 的读取性能。建议用户在选择此设置前对图像进行预处理/应用过滤器。

    但请注意,此设置需要大量 CPU 资源,可能会影响读取性能。建议用户在使用此设置之前先与其他设置进行试验。组合 Reading速度.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#

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

海瑞尔 哈西米 本 奥马尔

软件工程师

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