前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >适用于 VS 2022 .NET 6.0(版本 3.1.0)的二维码编码器和解码器 C# 类库

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

作者头像
ccf19881030
发布2023-04-18 10:38:19
1.8K0
发布2023-04-18 10:38:19
举报
文章被收录于专栏:ccf19881030的博客

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

本文转载自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.dllQRCodeDecoderLibrary.dll 。启动 Visual Studio C# 程序并打开您的应用程序。转到Solution Explorer,右键单击References,然后选择Add Reference。选择浏览选项卡并将文件系统导航到所需库的位置。当发布应用程序时,必须包含相关库文件并将其安装在与可执行文件 (.exe ) 相同的文件夹中。

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

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

代码语言:javascript
复制
using QRCodeEncoderLibrary;
// or
using QRCodeDecoderLibrary;

二维码

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

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

ISO 标准 18004 是了解二维码细节的最佳信息来源。在互联网上搜索可以找到更多关于该主题的文章。关于二维码的维基百科文章可以在这里查看

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

代码语言:javascript
复制
Square-Dimension = 21 + 4 * (Version - 1)

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

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

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

  • 数值数据:段仅由数字 0-9 组成。三位数将转换为 10 位。
  • 字母数字数据:该段由数字 0–9、大写字母 A–Z 和其他九个字符 [space, $ % * + - . / :]。两个字母数字字符将被转换为 11 位。
  • 8 位字节数据。该段未转换。输入位和模块之间存在一一对应关系。 要对二维码进行编码,您需要提供要编码的数据和四个纠错码之一。系统将计算表示数据所需的最小版本号。

除数据外,二维码还可以包含 ECI 分配编号。分配编号范围为 0 到 999999。该编号不是二维码数据的一部分。它用于根据字节值的替代解释(例如,替代字符集)对数据进行编码。

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

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

二维码编码

编码的主要类是QREncoder. 它将字节数组或文本字符串转换为二维码图像。要创建二维码图像,请按照以下步骤操作:

创建·QREncoder·对象。设置两个可选参数。纠错码和 ECI 分配编号。这个对象是可重用的。如果你想创建很多二维码,就复用这个对象。没有初始化或处置要求。可选参数将保留上次运行时的值。

代码语言:javascript
复制
// create QR Code encoder object
QRCodeEncoder Encoder = new();

如果需要,设置两个可选参数:

代码语言:javascript
复制
// 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方法之一:

代码语言:javascript
复制
// 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);

如果输入数据是文本字符串,或文本字符串数组。文本将使用以下方法转换为字节数组。

代码语言:javascript
复制
// 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

代码语言:javascript
复制
// 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类允许您选择文件格式。

代码语言:javascript
复制
// 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 [可选参数] 输入文件 输出文件
  • 输出文件必须有.png扩展名
  • 选项格式 /code:value 或 -code:value(: 可以是 =)
  • 纠错级别。code=[error|e], value=low|l|medium|m|quarter|q|high|h], 默认值为m
  • 安静区域。code=[quiet|q], value=[4-400], default=8, min=4*width
  • ECI赋值:code=[value|v],value=[0-999999],默认没有ECI值。
  • 文本文件格式。code=[text|t] 见下面的注释。
  • 除非指定文本文件选项,否则输入文件是二进制文件如果输入文件格式是tex或 t,则字符串将被编码为字节数组。

QR 码编码器演示

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

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

QR 码编码器演示

QR Code Save Dialog
QR Code Save Dialog

QR 码保存对话框

Save Special QR Code Image
Save Special QR Code Image

保存特殊二维码图像

二维码解码

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

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

代码语言:javascript
复制
// create QR Code decoder object
QRDecoder Decoder = new QRDecoder();

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

每个二维码符号解码成功,则将返回一个QRCodeResult元素。在大多数情况下,它将是一个元素的数组。结果定义如下。DataArray代表二维码的内容。但是在某些情况下,您可能对其他成员感兴趣。如果返回值为null,则没有检测到二维码。

代码语言:javascript
复制
// 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转换成为文本字符串,请使用:

代码语言:javascript
复制
// convert binary result to text string
string TextResult = QRCode.ByteArrayToStr(ResultArray[Index].DataArray);

ByteArrayToStr 方法按照如下方式将字节数组转换为字符串

代码语言:javascript
复制
// 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 码的缺失区域以获得正确的内容。

代码语言:javascript
复制
QR Code 1
Big QR Code
QR Code 2
Small QR Code

另外一个三个二维码的例子。解码器在图片中找到了 9 个查找器。9 个查找器中的所有可能的 3 个都经过测试。结果是三组三个发现者测试有效的 二维码结构。结果如下图所示。

代码语言:javascript
复制
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按钮。
  • 对于图像文件,将显示一个打开文件对话框。
  • 将显示图像。
  • 对于视频,请将您的二维码放在摄像头前。
  • 如果解码成功,解码数据区会显示结果。
  • 如果解码不成功,Decoded data 区域将为空白。
  • 如果图像中包含多个二维码,则解码数据将显示所有二维码的结果。 供您参考,视频捕获使用了在 CodeProject.com 和Github上发布的Camera_Net项目的一些源模块。该项目基于DirectShowLib。.请注意,DirectShowLib项目中的 是原始源模块的修改子集。

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

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

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

QRCodeDecoder 3.0.0
QRCodeDecoder 3.0.0

历史

  • 2018 年 6 月30 日:版本 1.0.0 原始版本
  • 2018 年 7 月20 日:版本 1.1.0·DirectShowLib·合并
  • 2019 年5月15 日:版本 2.0.0 该软件分为两个解决方案。编码器解决方案和解码器解决方案。编码解决方案是一个多目标解决方案。它将生成 net462 netstandardapp2.0 库。
  • 2019 年 7 月22 日:添加了版本 2.1.0 ECI 分配值支持。
  • 2022 年3 月1 日:版本 3.0.0 升级到 VS 2022 和 .NET 6.0。
  • 2022 年 3 月 8 日版本 3.1.0 修复视频解码器。防止在使用演示时拔下相- 机。编码器没有变化。
  • 2022 年 3 月 17 日版本 3.1.0 编码器演示程序。添加复制到剪贴板功能。

License

本文以及任何相关的源代码和文件均已获得 The Code Project Open License (CPOL)的许可。

Written ByUzi Granot,坐标:加拿大 该会员尚未提供简历。假设它很有趣且多种多样,并且可能与编程有关。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 适用于 VS 2022 .NET 6.0(版本 3.1.0)的二维码编码器和解码器 C# 类库
    • 介绍
      • 编码解决方案
      • 解码解决方案
    • 安装
      • 二维码
        • 二维码编码
          • 使用命令行类创建 PNG 图像文件。
            • QR 码编码器演示
              • 二维码解码
                • 二维码解码器示例
                  • 历史
                    • License
                    领券
                    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档