用于VS 2022 .NET 6.0(版本3.1.0)的QR码编码器和解码器C#类库

目录

介绍

编码器解决方案

解码器解决方案

安装

二维码

二维码编码

使用命令行类创建PNG图像文件。

二维码编码器演示

二维码解码

二维码解码器演示


介绍

二维码库允许您的程序创建(编码)二维码图像或读取(解码)包含一个或多个二维码的图像。随附的源代码由两个解决方案组成,一个二维码编码器解决方案和一个二维码解码器解决方案。软件升级到VS 2022 .NET6.0。源代码是用C#编写的。它是一个开源代码。

请注意“QR Code”一词是DENSO WAVE INCORPORATED的注册商标。

编码器解决方案

  • QRCodeEncoderLibrary:一个类库项目
  • QRCodeEncoderDemo:一个Windows窗体演示程序,演示如何将一个string或一个字节数组编码为QR码图像文件
  • QRCodeConsoleDemo:一个Windows控制台演示程序,演示如何将文本文件或二进制文件编码为QR码图像文件

解码器解决方案

  • QRCodeDecoderLibrary:一个类库项目
  • QRCodeDecoderDemo:演示如何解码包含二维码的图像文件并检索string或字节数组的演示程序。图像文件源可以是磁盘文件或实时摄像机输入。摄像机软件基于Direct Show Library

安装

随附的源代码由两个Visual Studio解决方案组成。每个解决方案都由一个库项目和演示/测试项目组成。

将代码集成到您的应用程序需要以下步骤。在您的开发区域中安装QRCodeEncoderLibrary.dllQRCodeDecoderLibrary.dll。启动Visual Studio C#程序并打开您的应用程序。转到解决方案资源管理器,右键单击References,然后选择Add Reference。选择浏览选项卡并将文件系统导航到所需库的位置。当您的应用程序发布时,相关的库文件必须包含并安装在与您的可执行文件(.exe )文件相同的文件夹中。

或者,您可以将相关库的源文件复制到您的项目中。

必须将相关的using语句添加到您的所有源文件中:

using QRCodeEncoderLibrary;
// or
using QRCodeDecoderLibrary;

二维码

二维码代表快速响应代码。它是一个二维条码。从视觉上看,它是一个由黑白相间的小方块模块组成的正方形。正方形周围环绕着一个白色的安静区域。二维码由国际标准ISO/IEC 18004定义。此标准的免费副本可在此处获得。

ISO标准文件将QR码定义为“QR码是一个矩阵,由以整体方形图案排列的名义上的方形模块阵列组成,包括位于符号三个角的独特定位器图案,旨在帮助轻松定位它的位置、大小和倾斜度。提供了范围广泛的符号大小以及四级纠错。模块尺寸由用户指定,可通过多种技术生成符号。

ISO标准18004是了解QR码详细信息的最佳信息来源。搜索互联网会产生更多关于此主题的文章。可以在此处查看有关QR码的维基百科文章。

二维码标准是40个不同大小的正方形的集合。每个方块都有一个从140的版本号。每个方块的大小从21 x 21模块(版本1)到177 x 177模块(版本40)不等。每个版本的每边比以前的版本多4个模块。

Square-Dimension = 21 + 4 * (Version - 1)

一些模块是固定的。最明显的是三方取景器。其余模块分为数据和纠错。有4个级别的纠错:

  • L- Low将纠正高达7%的错误
  • M- Medium将纠正高达15%的错误
  • Q- Quarter将纠正高达25%的错误
  • H-高将纠正高达30%的错误

数据区中的每个模块代表一位。黑色模块为1,白色模块为0。数据区可以划分为段。每个输入段字节数组以数字、字母数字和字节三种方式之一编码为数据位。注意:二维码标准对汉字字符多了一种编码方法。本项目不支持。

  • 数字数据:该段仅由数字 0-9 组成。三位数字将转换为 10 位。
  • 字母数字数据:该段由数字0–9、大写字母A–Z和其他九个字符[空格、$ % * + - . / :]组成。两个字母数字字符将转换为11位。
  • 8位字节数据。该段未转换。输入位和模块之间是一一对应的。

要编码QR码,您需要提供要编码的数据和四个纠错码之一。系统将计算表示数据所需的最小版本号。

除了数据之外,QR码还可以包含ECI分配编号。分配编号范围是0999999。该编号不是QR码数据的一部分。它用于对受字节值的替代解释(例如,替代字符集)的数据进行编码。

该程序分析每个数据段以找到最佳编码。如果您想减小QR码的大小并且您有如上定义的长数字字符串或字母数字数据,则将您的输入分成几个字符串或字节数组。其中一些字符串必须是纯数字或上面定义的字母数字。在解码过程中,所有结果string段将连接在一起。

当库解码包含一个或多个二维码的图像时,结果将是一个string数组或字节数组数组。每个数组项是一个二维码。

二维码编码

编码的主要类是QREncoder。它将字节数组或文本string转换为二维码图像。要创建QR码图像,请执行以下步骤:

创建QREncoder对象。设置两个可选参数。纠错码和ECI分配编号。这个对象是可重复使用的。如果您想创建许多QR码,只需重用此对象即可。没有初始化或处置要求。可选参数将保留上次运行时的值。

// 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;

更高的纠错百分比为您提供更好的保护,防止损坏的QR码图像。成本是增加的QR符号的大小。

调用以下四种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将扫描每个传入数据字节数组段以确定最佳编码方法。该程序不会尝试断开单个段以最小化QR码矩阵的大小。您可以以利用长字符串数字或字母数字数据的方式提交段数组。

Encode方法返回bool[,],一个布尔元素数组的方阵。返回的二维bool数组也可作为QREncode类的公共成员QRCodeMatrix使用。每个元素将黑色模块表示为true,将白色模块表示为false。矩阵维度在公共方法QRCodeDimension中给出。如果编码失败,将抛出异常。

下一步是将二维码符号保存到文件中,或者创建一个Bitmap。以下示例显示如何将其QRCodeMatrix保存为PNG图像文件。将二维码图像保存为PNG文件不需要使用Bitmap类,适用于net-corenet-standardPNG图像文件明显小于QRSaveBitmapImageBitmap类创建的PNG文件。

// 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图像文件。

下面列出了命令行参数。参数设置编码选项。

命令行参数格式:

  • 命令行:exefile [可选参数] input-file output-file
  • 输出文件必须具有.png扩展名
  • 选项格式 /code:value-code:value (:可以是=)
  • 纠错级别code=[error|e], value=low|l|medium|m|quarter|q|high|h], default=m
  • 模块尺寸。code=[module|m], value=[1-100], default=2
  • 安静区域。code=[quiet|q], value=[4-400], default=8, min=4*width
  • ECI赋值:code=[value|v], value=[0-999999], default is no ECI value
  • 文本文件格式。code=[text|t] 见下面的注释。
  • 除非指定了文本文件选项,否则输入文件是二进制文件如果输入文件格式是文本或t,则字符串将被编码为字节数组。

二维码编码器演示

QR Code Encoder Demo是一个测试程序,展示了如何对QR码进行编码并将其保存为图像文件。

  • 选择纠错级别。
  • 设置ECI分配值或将其留空。
  • 在数据框中输入文本。您可以使用竖线|字符将string分割为数字、字母数字和一般文本段。
  • 按编码。将显示二维码。
  • QRCodeMatrix将被创建。
  • 保存图像按钮或复制到剪贴板按钮。
  • 如果按下复制到剪贴板,模块宽度为2、静区为8QR图像将被加载到剪贴板。
  • 如果按保存图像,将显示保存二维码图像对话框。
  • 设置模块大小。
  • 设置静区。
  • 设置图像格式(压缩PNG不需要)。
  • 按四个保存按钮之一。
  • Save Compressed PNG以不使用位图的PNG格式保存图像。
  • 或者,按位图图像
  • 或者,按Save Special。将显示保存特殊屏幕。此选项用于创建用于解码测试的图像文件。保存QR码图像屏幕允许您将QR码图像保存在画笔或图像背景上。您可以旋转二维码或将其显示为好像它是由相机拍摄的,以产生透视图。您可以在图像上随机添加圆形点。
  • 或者,按复制到剪贴板。此按钮将创建具有指定模块大小和静区大小的图像。

二维码编码器演示

二维码保存对话框

保存特殊二维码图片

二维码解码

QRDecoder将包含QR码符号的图像文件或位图转换为QRCodeResult数组。每个结果项包含QR码数据字节数组和ECI分配值。要解码包含一个或多个QR码图像的图像文件,请执行以下步骤。

创建QRDecoder对象。这个对象是可重复使用的。如果你想解码一些图像,只需重用这个对象。没有初始化或处置要求。

// create QR Code decoder object
QRDecoder Decoder = new QRDecoder();

// call image decoder method with file name
QRCodeResult[] ResultArray = Decoder.ImageDecoder(FileName)

每个成功解码的QRCode符号都会返回一个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转换为string文本,请使用:

// convert binary result to text string
string TextResult = QRCode.ByteArrayToStr(ResultArray[Index].DataArray);

ByteArrayToStr方法将字节数组通过以下方式转换为string

// 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);
	}

例如,下图是两个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是一个测试程序,展示如何扫描图像文件或视频图像以获取QR码。接下来,它将展示如何将解码后的数据转换为string文本。视频解码器是一个测试/演示应用程序,它将使用系统中第一个找到的网络摄像头。一个结合了二维码解码器和摄像机图像捕获的演示程序。摄像机软件基于Direct Show Library

  • 单击图像文件按钮或摄像机按钮。
  • 对于图像文件,将显示一个打开文件对话框。
  • 将显示图像。
  • 对于视频,请将您的二维码放在相机前面。
  • 如果解码成功,解码数据区会显示结果。
  • 如果解码不成功,Decoded data区域将为空白。
  • 如果图像包含多个二维码,解码数据将显示所有二维码的结果。

供您参考,视频捕获使用了在CodeProject.comGithub上发布的Camera_Net项目的一些源模块。该项目基于DirectShowLib。请注意,这个项目中的DirectShowLib是原始源模块的修改子集。

请注意,我只在我自己的摄像机上测试过这个应用程序。我的相机是罗技高清网络摄像头C615。我正在使用640 x 480像素的帧大小。

该程序设置相机软件在屏幕的预览区域显示视频流。扫描速度为每秒5帧。每个帧都被捕获并测试一个QR码。找到QR码后,结果将显示在解码数据文本框中。如果解码的数据是URI,则启用转到URI”按钮,您可以在默认Web浏览器上显示此 URI

为了使视频解码成功,每个QR码模块必须由几个摄像头像素表示。例如,4 x 4或更多像素。QR码必须相当清晰、平坦且与相机平行。下图说明了该软件将图像转换为正方形的功能,其中取景器符号位于正确的位置。

https://www.codeproject.com/Articles/1250071/QR-Code-Encoder-and-Decoder-Csharp-Class-Library-f

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值