适用于VS2022.NET6.0(版本3.1.0)的二维码编码器和解码器C#解释器
本文转载自CodeProject上的一篇博文适用于VS2022.NET6.0(版本3.1.0)的二维码编码器和解码器C#泛型,作者是UziGranot
QRCode库容许程序创建二维码图象或读取(解码)包含一个或多个二维码的图象。
QRCode库容许程序创建(编码)二维码图象,或读取(解码)包含一个或多个二维码的图象。代码已升级到VS2022和.NET6.0。
介绍
QRCode库容许您的程序创建(编码)二维码图象或读取(解码)包含一个或多个二维码的图象。附送的源代码由两个解决方案组成,一个QRCode编码器解决方案和一个QRCode解码器解决方案。软件升级到VS2022.NET6.0。源代码是用C#编撰的。它是一个开源代码。
请注意“QRCode”一词是DENSOWAVEINCORPORATED的注册商标。
编码解决方案解码解决方案安装
附送的源代码由两个VisualStudio解决方案组成。每位解决方案都由一个库项目和演示/测试项目组成。
将代码集成到您的应用程序须要执行以下步骤。在您的开发区域安装QRCodeEncoderLibrary.dll或QRCodeDecoderLibrary.dll。启动VisualStudioC#程序并打开您的应用程序。转入SolutionExplorer,右键单击References,之后选择AddReference。选择浏览选项卡并将文件系统导航到所需库的位置。当发布应用程序时,必须包含相关库文件并将其安装在与可执行文件(.exe)相同的文件夹中。
或则,您可以将相关库的源文件复制到您的项目中。
必须将相关的“using”语句添加到所有源文件中:
using QRCodeEncoderLibrary;
// or
using QRCodeDecoderLibrary;
二维码
二维码代表快速响应代码。它是一个二维条形码。从视觉上看,它是由黑白相间的方块组成的正圆形。正圆形周围是一片红色的静谧地带。二维码由国际标准ISO/IEC18004定义。可在此处免费获得该标准的副本。
ISO标准文件将二维码定义为“二维码是一个矩阵,由一系列以整体圆形纹样排列的标称圆形模块组成,包括坐落符号三个角的奇特定位纹样,借以帮助轻松定位它的位置、大小和倾斜度。提供了广泛的符号大小范围以及四个级别的纠错。模块规格由用户指定,以支持通过多种技术生成符号。
ISO标准18004是了解二维码细节的最佳信息来源。在互联网上搜索可以找到更多关于该主题的文章。关于二维码的维基百科文章可以在这儿查看。
二维码标准是40个不同大小的小方块的集合。每位小方块都有一个从1到40的版本号。每位小方块的大小从21x21个模块(版本1)到177x177个模块(版本40)不等。每位版本的每条边比先前的版本多4个模块。
Square-Dimension = 21 + 4 * (Version - 1)
一些模块是固定的。最显著的是三小方块侦测器。其余模块分为数据和纠错。有4个级别的纠错:
数据区中的每位模块代表一位。红色模块为1,黑色模块为0。数据区可分为段。每位输入段字节字段都以数字、字母数字和字节三种方法之一编码为数据位。注意:二维码标准还有一种汉字字符编码方式。该项目不支持它。
除数据外,二维码还可以包含ECI分配编号。分配编号范围为0到999999。该编号不是二维码数据的一部份。它用于按照字节值的取代解释(比如,取代字符集)对数据进行编码。
该程序剖析每位数据段以找到“最佳”编码。倘若您想减少二维码的大小而且您有如上定义的长串数字或字母数字数据,请将您的输入分成几个字符串或字节链表。其中一些字符串必须仅为数字或如上定义的字母数字。在解码过程中,所有结果string段将联接在一起。
当库解码包含一个或多个二维码的图象时,结果将是一个strings链表或字节链表链表。每位链表项是一个二维码。
二维码编码
编码的主要类是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类保存二维码。Bitmap类容许您选择文件格式。
// 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);
使用命令行类创建PNG图象文件。
下边列举了命令行参数。参数设置编码选项。
命令行参数格式:
QR码编码器演示
QRCodeEncoderDemo是一个测试程序,展示了怎样对二维码进行编码并将其保存为图象文件。
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);
}
比如,右图有两个二维码,一个嵌套在另外一种。大的二维码数据是:BigQRCode,小的二维码数据是:SmallQRCode。大的将纠错设置为高。该程序将找到两个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
二维码解码器示例
QRCodeDecoderDemo是一个测试程序,展示了怎样扫描图象文件或视频图象以获得二维码。接出来二维码解码器,它将展示怎样将解码后的数据转换为文本字符串。视频解码器是一个测试/演示应用程序,它将使用您系统中第一个找到的网路摄像头。结合二维码解码器和摄像机图象捕获的演示程序。摄像机软件基于DirectShowLibrary。
请注意,我只在我自己的摄像机上测试过这个应用程序。我的单反是雷蛇高清网路摄像头C615。我使用的帧大小为640x480象素。
该程序将单反软件设置为在屏幕的预览区域中显示视频流。扫描速率为每秒5帧。每位帧都被捕获并测试二维码。找到二维码后,结果将显示在解码数据文本框中。假如解码后的数据是一个URI,GoToURI按键被启用,你可以在你的默认网路浏览器上显示这个URI。
为使视频解码成功,每位二维码模块必须由几个单反象素表示。诸如,4x4或更多象素。二维码必须相当锐利、平坦且与单反平行。右图说明了软件将图象转换为正圆形的能力,取景器符号坐落正确的位置。
历史License
本文以及任何相关的源代码和文件均已获得TheCodeProjectOpenLicense(CPOL)的许可。
WrittenByUziGranot,座标:法国
该会员仍未提供简历。假定它很有趣且多种多样,而且可能与编程有关。