PDF417 条形码解码器 .NET 类库及两个演示应用





5.00/5 (9投票s)
PDF417 条形码解码器类库允许您从图像文件中提取 PDF417 条形码信息。该库是用 C# 编写的,适用于 .NET 框架。两个演示项目允许您探索该库并读取 PDF417 条形码。
引言
PDF417 条形码解码器类库允许您从图像文件中提取 PDF417 条形码信息。该库是用 C# 编写的,适用于 .NET 框架。这是作者发表的关于 PDF417 条形码编码和解码的第二篇文章。第一篇文章是 PDF417 条形码编码器 .NET 类库及演示应用。您可以使用编码器文章生成条形码图像文件来测试解码器。解码器类读取包含单个 PDF417 条形码或多个条形码的图像文件,并返回一个结果数组。主要结果是字节数组或多个字节数组。提供了将字节数组转换为基于 ISO-8859 标准的文本字符串的方法。包含两个演示/测试项目用于测试该库。Pdf417DecoderDemo
读取条形码图像文件。Pdf417VideoDecoder
捕获网络摄像头图像并解码 PDF417 条形码。
PDF417 是一种二维条形码。条形码文档和规范可在以下网站找到。维基百科对 PDF417 进行了很好的概述。 点击此处访问该页面。PDF417 标准可从 ISO 组织购买 在此网站。早期版本的规范可免费下载 在此网站。如果您想完全理解解码过程,强烈建议您下载此文档。
本文附带的软件是 PDF417 解码器库和两个演示/测试程序。该软件是用 C# 编写的,适用于 .NET 框架。本文解释了解码过程。如何将解码器集成到您的应用程序中。以及如何使用演示/测试程序。
PDF417 条形码解码过程
下面给出了从上述维基百科文章中截取的 PDF417 条形码示例
- 读取图像文件并将其转换为黑白像素的布尔数组。
- 逐行水平扫描图像,从左到右,并定位开始和停止图案。如果没有找到开始和停止签名,则从右到左扫描图像。条形码相对于图像的最大倾斜角约为相对于水平轴的 +/- 30 度。
- 如果图像包含多个 PDF417 条形码,则以下步骤将对每个条形码执行。
- 扫描左行指示符列和右行指示符列。指示符列的字码包含数据行和列的数量,以及纠错字码的长度。
- 定位左上指示字码、左下指示字码、右上指示字码和右下指示字码。
- 利用前两步的信息,计算透视映射矩阵的系数。这些系数会将数据行和列坐标转换为像素图像坐标。 参见纹理映射和图像扭曲基础(第 19 页)。
- 提取数据字码。
- 运行错误检测和纠正算法。
- 将字码解压缩为字节。
- 如果结果成功,则保存结果。
- 对找到的每个条形码重复最后几步。
- 将检测到的成功条形码数量返回给调用应用程序。
- 如果返回的条形码计数为零,则未检测到条形码,或没有成功解码。如果计数大于零,则结果以条形码信息数组或二进制字节数组的形式返回。
- 可以使用全局标签标识符 CharacterSet 值将返回的二进制数据(字节数组)转换为文本字符串。
PDF471 解码器项目源代码
附加的 Visual Studio 解决方案源文件 Pdf417DecoderLibrary
包含三个项目
Pdf417DecoderLibrary
:解码器库包含解码图像所需的所有类。主类是Pdf417Decoder
。Pdf417DecoderDemo
:演示应用程序允许您测试解码器。它将解码图像文件。Pdf417VideoDecoder
:视频解码器是一个演示应用程序,它将使用您系统中的第一个网络摄像头来捕获 PDF417 条形码图像并对其进行解码。
将 PDF417 解码器库集成到您的应用程序中
将 Pdf417DecoderLibrary.dll 类库包含到您的项目中。将附带的 Pdf417EncoderLibrary.dll 文件安装在您的开发区域。启动 Visual Studio。打开您的应用程序。转到解决方案资源管理器。右键单击“引用”并选择“添加引用”。选择“浏览”选项卡,然后导航文件系统到已安装的 Pdf417EncoderLibrary.dll 的位置。当您的应用程序发布时,必须在您的可执行文件(.exe)文件所在的文件夹中包含并安装 Pdf417EncoderLibrary.dll 文件。
该库的命名空间是 Pdf417DercodeLibrary
。在所有引用该库的源文件中添加一个 using
语句。
从您的应用程序调用 PDF417 解码器
- 创建一个
Pdf417Decoder
对象。此对象可以重复使用。 - 调用
Decode
方法并传入图像文件名。 - 返回值是检测到的条形码数量。
- 如果返回值是零,则未找到或未成功解码任何条形码。
- 如果返回值大于零,则迭代所有找到的条形码。
- 有三种方式可以访问结果
- 读取条形码二进制数据数组。
- 读取完整条形码信息数组。
- 调用
BinaryDataToString
方法返回单个二进制数据结果的文本字符串。
下面是添加到您的应用程序以读取 PDF417 条形码的代码序列示例。
// create decoder object
Pdf417Decoder pdf417Decoder = new Pdf417Decoder();
// decode an image
int BarcodesCount = pdf417Decoder.Decode(Pdf417InputImage);
// process barcodes
for(int Count = 0; Count < BarcodesCount; Count++)
{
// binary result
byte[] BinaryData = pdf417Decoder.BarcodesData[Count];
// -or-
// full information result
BarcodeInfo barcodeInfo = pdf417Decoder.BarcodesInfo[Count];
// -or-
// text string result
String TextData = pdf417Decoder.BinaryDataToString(Count);
}
完整条形码信息结果类
解码的主要结果是二进制字节数组。该库还为您提供有关条形码的附加信息。BarcodeInfo
类如下所述
/// <summary>
/// Barcode results extra information
/// </summary>
public class BarcodeInfo
{
/// <summary>
/// Barcode binary (byte array) data
/// </summary>
public byte[] BarcodeData { get; internal set; }
/// <summary>
/// Global Label Identifier character set (ISO-8859-n)
/// The n represent part number 1 to 9, 13 and 15
/// </summary>
public string CharacterSet { get; internal set; }
/// <summary>
/// Global Label Identifier character set number
/// This number is two more than the part number
/// </summary>
public int GliCharacterSetNo { get; internal set; }
/// <summary>
/// Global label identifier general purpose number
/// code word 926 value 900 to 810899
/// </summary>
public int GliGeneralPurpose { get; internal set; }
/// <summary>
/// Global label identifier user defined number
/// code word 925 value 810,900 to 811,799
/// </summary>
public int GliUserDefined { get; internal set; }
/// <summary>
/// Data columns
/// </summary>
public int DataColumns { get; internal set; }
/// <summary>
/// data rows
/// </summary>
public int DataRows { get; internal set; }
/// <summary>
/// Error correction length
/// </summary>
public int ErrorCorrectionLength { get; internal set; }
/// <summary>
/// Error correction count
/// </summary>
public int ErrorCorrectionCount { get; internal set;}
}
二进制数据转文本字符串
重要的是要注意,条形码编码的是字节数组而不是字符数组(文本字符串)。解码过程从条形码图像中恢复字节。要编码文本字符串,必须将字符转换为字节。解码器必须将字节转换为字符。只要这两种转换是对称的,编码和解码文本即可正常工作。这些转换不属于 PDF417 规范。对该过程唯一支持的是全局标签标识符字符集。编码器根据 ISO-8856-part 的函数设置此值。解码器可以读取它并正确处理字节数组。
为了使下面的两种解码方法正常工作,编码器必须按如下方式编码文本
// this code if for a PDF417 encoder
// convert text string to byte array
// n is an ISO part number
Encoding ISO = Encoding.GetEncoding("ISO-8859-n");
byte[] UtfBytes = Encoding.UTF8.GetBytes(StringData);
byte[] IsoBytes = Encoding.Convert(Encoding.UTF8, ISO, UtfBytes);
Pdf417Decoder
类有两个方法可以将二进制数据转换为文本字符串。
一个 static
方法
/// <summary>
/// Convert binary data array to text string
/// </summary>
/// <param name="BarcodeBinaryData">Binary byte array</param>
/// <param name="IsoStandard">ISO standard "ISO-8859-part"</param>
/// <returns>Text string</returns>
public static string BinaryDataToString
(
byte[] BarcodeBinaryData,
string IsoStandard = "ISO-8859-1"
)
{
try
{
// convert byte array to string
Encoding ISO = Encoding.GetEncoding(IsoStandard);
byte[] Utf8Bytes = Encoding.Convert(ISO, Encoding.UTF8, BarcodeBinaryData);
char[] Utf8Chars = Encoding.UTF8.GetChars(Utf8Bytes);
// save result
return new string(Utf8Chars);
}
catch(Exception Ex)
{
return null;
}
}
一个根据全局标签 ID 字符集将字节数组转换为文本 string
的方法
/// <summary>
/// Convert binary data to string for one result
/// </summary>
/// <param name="Index">Index to BarcodesInfo array</param>
/// <returns>Text string</returns>
public string BinaryDataToString
(
int Index
)
{
return BinaryDataToString(BarcodesInfo[Index].BarcodeData,
BarcodesInfo[Index].CharacterSet ?? "ISO-8859-1");
}
PDF417 解码器演示/测试程序
Pdf417DecoderDemo
项目旨在演示和测试 PDF417 解码器库的所有功能。单击 PDF417Image
按钮。选择一个包含 PSD417 条形码的图像。然后查看结果。如果您在 Visual Studio 环境中以调试模式运行程序,您可以在文本编辑器中查看跟踪文件 Pdf417DecoderTrace.txt。滚动到文件末尾以获取最新的结果。
解码带有两个条形码的图像的另一个示例。
PDF417 视频解码器演示/测试程序
PDF417 视频解码器 Pdf417VideoDecoder
是一个测试/演示应用程序,它将使用您系统中的第一个网络摄像头。演示程序结合了 PDF417 解码器和视频摄像头图像捕获。视频摄像头软件基于 Direct Show 库。
此演示程序使用 CodeProject.com 上发布的 Camera .NET Project 的一些源模块,并且 Github 项目基于 DirectShowLib DirectShowLib
。请注意,此项目中的 DirectShowLib
是原始源模块的修改子集。
请注意,我只在我自己的网络摄像头上测试过此应用程序。我的摄像头是 Logitech HD Webcam C615。我使用的是 640 x 480 像素的帧大小。
该程序将摄像头软件设置为在屏幕的预览区域显示视频流。扫描速率为每秒 5 帧。捕获每一帧并测试是否包含 PDF417 条形码。找到条形码后,结果将显示在“解码数据”文本框中。解码将继续,直到按下“重置”按钮。如果解码的数据是 URI,则“转到 URI”按钮将启用,您可以在默认网页浏览器中显示此 URI。
为了使视频解码成功,每个条形码模块必须由几个摄像头像素表示。例如,4x12 或更多像素。条形码必须足够清晰、平坦且与摄像头平行。下图说明了该软件将图像转换为正方形的能力,其中查找符号位于正确的位置。
历史
- 2019/05/01:版本 1.0 - 原始版本