本文转载自CodeProject上的一篇博文适用于 VS 2022 .NET 6.0(版本 3.1.0)的二维码编码器和解码器 C# 类库,作者是Uzi Granot QR Code库允许程序创建二维码图像或读取(解码)包含一个或多个二维码的图像。 QR Code库允许程序创建(编码)二维码图像,或读取(解码)包含一个或多个二维码的图像。代码已升级到 VS 2022 和 .NET 6.0。
QR Code库允许您的程序创建(编码)二维码图像或读取(解码)包含一个或多个二维码的图像。附带的源代码由两个解决方案组成,一个 QR Code编码器解决方案和一个 QR Code解码器解决方案。软件升级到VS 2022 .NET6.0。源代码是用 C# 编写的。它是一个开源代码。
请注意“QR Code”一词是 DENSO WAVE INCORPORATED 的注册商标。
QRCodeEncoderLibrary
: 类库项目QRCodeEncoderDemo
: 一个 Windows 窗体演示程序,演示如何将一个字符串
或一个字节数组编码为二维码图像文件QRCodeConsoleDemo
: 一个 Windows 控制台演示程序,演示如何将文本文件或二进制文件编码为 二维码图像文件QRCodeDecoderLibrary
: 类库项目QRCodeDecoderDemo
: 一个演示程序,演示如何解码包含 QR 码的图像文件并检索stringor 字节数组。图像文件源可以是磁盘文件或实时摄像机输入。摄像机软件基于 Direct Show Library。
此库的 QR Code编码器部分包含在PDF 文件编写器 C# 类库一文中。附带的源代码由两个 Visual Studio 解决方案组成。每个解决方案都由一个库项目和演示/测试项目组成。
将代码集成到您的应用程序需要执行以下步骤。在您的开发区域安装QRCodeEncoderLibrary.dll或QRCodeDecoderLibrary.dll 。启动 Visual Studio C# 程序并打开您的应用程序。转到Solution Explorer,右键单击References,然后选择Add Reference。选择浏览选项卡并将文件系统导航到所需库的位置。当发布应用程序时,必须包含相关库文件并将其安装在与可执行文件 (.exe ) 相同的文件夹中。
或者,您可以将相关库的源文件复制到您的项目中。
必须将相关的“ using
”语句添加到所有源文件中:
using QRCodeEncoderLibrary;
// or
using QRCodeDecoderLibrary;
二维码代表快速响应代码。它是一个二维条码。从视觉上看,它是由黑白相间的小方块组成的正方形。正方形周围是一片白色的宁静地带。二维码由国际标准 ISO/IEC 18004 定义。可在此处免费获得该标准的副本。
ISO 标准文件将 二维码定义为“二维码是一个矩阵,由一系列以整体方形图案排列的标称方形模块组成,包括位于符号三个角的独特定位图案,旨在帮助轻松定位它的位置、大小和倾斜度。提供了广泛的符号大小范围以及四个级别的纠错。模块尺寸由用户指定,以支持通过多种技术生成符号。
ISO 标准 18004 是了解二维码细节的最佳信息来源。在互联网上搜索可以找到更多关于该主题的文章。关于二维码的维基百科文章可以在这里查看。
二维码标准是 40 个不同大小的方块的集合。每个方块都有一个从 1 到 40 的版本号。每个方块的大小从 21 x 21 个模块(版本 1)到 177 x 177 个模块(版本 40)不等。每个版本的每条边比以前的版本多 4 个模块。
Square-Dimension = 21 + 4 * (Version - 1)
一些模块是固定的。最明显的是三方块探测器。其余模块分为数据和纠错。有 4 个级别的纠错:
数据区中的每个模块代表一位。黑色模块为1,白色模块为0。数据区可分为段。每个输入段字节数组都以数字、字母数字和字节三种方式之一编码为数据位。注意:二维码标准还有一种汉字字符编码方法。该项目不支持它。
除数据外,二维码还可以包含 ECI 分配编号。分配编号范围为 0 到 999999。该编号不是二维码数据的一部分。它用于根据字节值的替代解释(例如,替代字符集)对数据进行编码。
该程序分析每个数据段以找到“最佳”编码。如果您想减小二维码的大小并且您有如上定义的长串数字或字母数字数据,请将您的输入分成几个字符串或字节数组。其中一些字符串必须仅为数字或如上定义的字母数字。在解码过程中,所有结果string
段将连接在一起。
当库解码包含一个或多个二维码的图像时,结果将是一个string
s 数组或字节数组数组。每个数组项是一个二维码。
编码的主要类是QREncoder
. 它将字节数组或文本字符串
转换为二维码图像。要创建二维码图像,请按照以下步骤操作:
创建·QREncoder·对象。设置两个可选参数。纠错码和 ECI 分配编号。这个对象是可重用的。如果你想创建很多二维码,就复用这个对象。没有初始化或处置要求。可选参数将保留上次运行时的值。
// create QR Code encoder object
QRCodeEncoder Encoder = new();
如果需要,设置两个可选参数:
// Error correction
// error correction low (7%)
Encoder.ErrorCorrection = ErrorCorrection.L;
// or, error correction medium (15%) The Default
Encoder.ErrorCorrection = ErrorCorrection.M;
// or, error correction quarter (25%)
Encoder.ErrorCorrection = ErrorCorrection.Q;
// or, error correction high (30%)
Encoder.ErrorCorrection = ErrorCorrection.H;
// ECI Assignment Value (default is -1 not used)
// The ECI value is a number in the range of 0 to 999999.
// or -1 if it is not used
Encoder.ECIAssignValue = -1;
更高的纠错百分比可以更好地保护 二维码图像免受损坏。代价是增加了 二维码 符号的大小。
调用四种Encode
方法之一:
// single text string input
public void Encode(string StringDataSegment);
// multiple text strings input
public void Encode(string[] StringDataSegments);
// single byte array input
public void Encode(byte[] ByteDataSegment);
// multiple byte arrays input
public void Encode(byte[][] ByteDataSegments);
如果输入数据是文本字符串,或文本字符串数组。文本将使用以下方法转换为字节数组。
// the encoder converts text string to byte array
// using the conversion method
byte[] ByteArray = Encoding.UTF8.GetBytes(Text);
实际上,库软件会将第一种和第二种Encode
方法分别转换为第三种和第四种方法。
将QRCodeEncoderLibrary
扫描每个传入数据字节数组段以确定最佳编码方法。该程序不会尝试打断单个段以最小化 二维码矩阵的大小。您可以提交段数组以利用长字符串的数字或字母数字数据。
该Encode
方法返回一个bool[,]布尔元素数组的方阵。返回的二维 bool 数组也可以作为类QRCodeMatrix
的公共成员使用QREncode
。每个元素将黑色模块表示为true
,将白色模块表示为false
。在公共成员变量中矩阵维度使用QRCodeDimension
。如果编码失败,将抛出异常。
下一步是将 二维码符号保存到文件中,或者创建一个Bitmap
. 以下示例显示如何将 保存QRCodeMatrix
到 PNG 图像文件。将二维码图片保存为PNG文件不需要使用Bitmap
类,适用于net-core和net-standard。对于PNG 图像文件来说,Bitmap
明显要小于QRSaveBitmapImage
。
// save image as png file
// create save PNG image class
// and load the QR Code matrix
QRSavePngImage PngImage = new(QRCodeMatrix);
// set the module size in pixels
PngImage.ModuleSize = ModuleSize;
// set the quiet zone in pixels
PngImage.QuietZone = QuietZone;
// save the QR Code PNG image to file name
// or to open file stream
PngImage.SaveQRCodeToPngFile(Dialog.FileName);
使用Bitmap
类保存二维码。Bitma
p类允许您选择文件格式。
// save image as any file format supported by Bitmap class.
// create image class for the QR Code matrix
QRSaveBitmapImage Image = new(QRCodeMatrix);
// set the module size in pixels
Image.ModuleSize = ModuleSize;
// set the quiet zone in pixels
Image.QuietZone = QuietZone;
// save the QR Code image to file name
// or to open file stream
Image.SaveQRCodeToBitmapFile(Dialog.FileName, ImageFormat);
下面列出了命令行参数。参数设置编码选项。
命令行参数格式:
QR Code Encoder Demo 是一个测试程序,展示了如何对 二维码进行编码并将其保存为图像文件。
string
数字、字母数字和一般文本段。Encode
按钮,将显示二维码。QRCodeMatrix
将被创建。QR 码编码器演示
QR 码保存对话框
保存特殊二维码图像
QRDecoder
将包含二维码符号的图像文件或位图转换为QRCodeResult
. 每个结果项包含 二维码 数据字节数组和 ECI分配值。要解码包含一个或多个二维码图像的图像文件,请按照以下步骤操作。
创建QRDecoder
对象。这个对象是可重用的。如果你想解码一些图像,只需重用这个对象。没有初始化或处置要求。
// create QR Code decoder object
QRDecoder Decoder = new QRDecoder();
// call image decoder method with file name
QRCodeResult[] ResultArray = Decoder.ImageDecoder(FileName)
每个二维码符号解码成功,则将返回一个QRCodeResult
元素。在大多数情况下,它将是一个元素的数组。结果定义如下。DataArray
代表二维码的内容。但是在某些情况下,您可能对其他成员感兴趣。如果返回值为null
,则没有检测到二维码。
// QR Code result
public class QRCodeResult
{
// QR Code Data array
public byte[] DataArray;
// ECI Assignment Value
public int ECIAssignValue;
// the next members are for information only
// QR Code matrix version
public int QRCodeVersion;
// QR Code matrix dimension in bits
public int QRCodeDimension;
// QR Code error correction code (L, M, Q, H)
public ErrorCorrection ErrorCorrection;
}
要将数据字节数组QRCodeResult.DataArray
转换成为文本字符串
,请使用:
// convert binary result to text string
string TextResult = QRCode.ByteArrayToStr(ResultArray[Index].DataArray);
ByteArrayToStr
方法按照如下方式将字节数组转换为字符串
// The QRDecoder converts byte array to text string
// using this conversion
public static string ByteArrayToStr(byte[] DataArray)
{
Decoder = Encoding.UTF8.GetDecoder();
int CharCount = Decoder.GetCharCount(DataArray, 0, DataArray.Length);
char[] CharArray = new char[CharCount];
Decoder.GetChars(DataArray, 0, DataArray.Length, CharArray, 0);
return new string(CharArray);
}
例如,下图有两个二维码,一个嵌套在另外一种。大的二维码数据是:Big QR Code,小的二维码数据是:Small QR Code。大的将纠错设置为高。该程序将找到两个 QR 码并使用纠错来恢复大 QR 码的缺失区域以获得正确的内容。
QR Code 1
Big QR Code
QR Code 2
Small QR Code
另外一个三个二维码的例子。解码器在图片中找到了 9 个查找器。9 个查找器中的所有可能的 3 个都经过测试。结果是三组三个发现者测试有效的 二维码结构。结果如下图所示。
QR Code 1
Top left corner
QR Code 2
Top right corner
QR Code 3
Bottom left corner
QR Code Decoder Demo 是一个测试程序,展示了如何扫描图像文件或视频图像以获得 二维 码。接下来,它将展示如何将解码后的数据转换为文本字符串
。视频解码器是一个测试/演示应用程序,它将使用您系统中第一个找到的网络摄像头。结合二维码解码器和摄像机图像捕获的演示程序。摄像机软件基于 Direct Show Library
。
Image File
按钮或Video Camera
按钮。DirectShowLib
项目中的 是原始源模块的修改子集。请注意,我只在我自己的摄像机上测试过这个应用程序。我的相机是罗技高清网络摄像头 C615。我使用的帧大小为 640 x 480 像素。
该程序将相机软件设置为在屏幕的预览区域中显示视频流。扫描速度为每秒 5 帧。每个帧都被捕获并测试二维码。找到 二维码后,结果将显示在解码数据文本框中。如果解码后的数据是一个 URI,Go To URI 按钮被启用,你可以在你的默认网络浏览器上显示这个 URI。
为使视频解码成功,每个二维码模块必须由几个相机像素表示。例如,4 x 4 或更多像素。二维码必须相当锐利、平坦且与相机平行。下图说明了软件将图像转换为正方形的能力,取景器符号位于正确的位置。
本文以及任何相关的源代码和文件均已获得 The Code Project Open License (CPOL)的许可。
Written ByUzi Granot,坐标:加拿大 该会员尚未提供简历。假设它很有趣且多种多样,并且可能与编程有关。