适用于 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”语句添加到所有源文件中:

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 个级别的纠错:

  • 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 分配编号。这个对象是可重用的。如果你想创建很多二维码,就复用这个对象。没有初始化或处置要求。可选参数将保留上次运行时的值。

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

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

命令行参数格式:

  • 命令行: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 码保存对话框

保存特殊二维码图像

二维码解码

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 arraypublic byte[] DataArray;// ECI Assignment Valuepublic int ECIAssignValue;// the next members are for information only// QR Code matrix versionpublic int QRCodeVersion;// QR Code matrix dimension in bitspublic 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按钮。
  • 对于图像文件,将显示一个打开文件对话框。
  • 将显示图像。
  • 对于视频,请将您的二维码放在摄像头前。
  • 如果解码成功,解码数据区会显示结果。
  • 如果解码不成功,Decoded data 区域将为空白。
  • 如果图像中包含多个二维码,则解码数据将显示所有二维码的结果。
    供您参考,视频捕获使用了在 CodeProject.com 和Github上发布的Camera_Net项目的一些源模块。该项目基于DirectShowLib。.请注意,DirectShowLib项目中的 是原始源模块的修改子集。

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

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

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

历史

  • 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,坐标:加拿大
该会员尚未提供简历。假设它很有趣且多种多样,并且可能与编程有关。

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

  1. 最新转转+闲鱼源码2.0版本带独立后台+个人二维码收款

    介绍: PHP5.6 后台/admin.php 账号admin密码123456. 网盘下载地址: https://zijiewangpan.com/CRyBag36oo9 图片:

  2. 基于opencv3.0和zbar下条形码和二维码的识别与解码

    其中对条码与二维码的识别分为以下4个步骤 1. 利用opencv和Zbar(或者Zxing)对标准的条形码图片(即没有多余背景干扰,且图片没有倾斜)进行解码,将解码信息显示出来,并与原始信息对比. 2 ...

  3. CTF练习题[MISC]-0和1的故事(二维码生成)

    练习题地址:https://ctf.bugku.com/challenges/detail/id/216.html 拿到题目,txt中是01字符串 Excel手动生成 在字符后插入空格 用Excel打 ...

  4. android 6.0 权限程序崩溃,扫二维码崩溃与按键事件

    1.权限 解决困扰我两天的问题,项目调用一些.so文件,demo,和老版本的在华为 6.0系统运行正常,但是我的项目在6.0以下的手机上运行正常,在6.0系统上程序直接崩溃,6.0系统自然想到了权限问 ...

  5. opencv4.0.1 qr二维码定位识别源码详解(一)

    一.概述 opencv4.0版本以后,加入了二维码定位解码的功能,其主要功能基于quirc开源库,下载地址GitHub.约1200行代码,识别与定位占了约800行,解码部分不作赘述,直接调用quric ...

  6. java(spring boot2.x版本)实现二维码生成(可以插入中间log和底部文字)

    1.创建一个spring boot项目(非必须): 项目结构: 2.导入maven依赖: <dependency><groupId>org.springframework.bo ...

  7. tp5.0 生成二维码 + 合并海报图

    一. 生成二维码 1.下载phpqrcode类 phpqrcode类库官网下载地址:https://sourceforge.net/projects/phpqrcode/ 2.在tp下extend创建 ...

  8. 金蝶k3 wise 15.0单据序时簿二维码打印后打印预览时提示没有注册类

    金蝶K3 wise 15.0 销售出库单打开二维码打印后这个界面在点击布局设计或打印预览时提示没有注册类,提示如下: 解决方案: 请在K3安装目录C:\Program Files (x86)\King ...

  9. 微信公众号开发完整教程(一) PHP7.0版本,TP5.0框架

    因为工作的需要,这一两年对微信公众号和小程序,项目制作的比较多.所以我才打算写一篇全面的制作教程,当然了,最好的教程是微信工作平台的文档.我这里只是讲述一下我的工作中的制作流程.所有相关文章的源码,我 ...

最新文章

  1. 【实用快捷键】设置WebStorm中Show in Explorer(在资源管理器中打开)快捷键Alt+Shift+R(类似VSCode)
  2. 计算机乐谱弱点,缺点简谱郑源
  3. PuTTy:PuTTy的简介、安装、使用方法之详细攻略
  4. VC6.0蕉HOOK_timeGetTime 达到变速效果
  5. 第1课贝贝的交通指挥系统(《聪明人的游戏:信息学探秘.提高篇-2017-06-C++版》)
  6. 值得关注的AI信息安全公司
  7. 电商设计师必备素材|快速组合自己想要的场景和落版文字
  8. 一步一步写算法(之图创建)
  9. 2021-04-06梦笔记
  10. 计算机网络基础实验(Cisco Packet Tracer 实验)
  11. 小程序开发工具_小程序开发工具都有哪些?
  12. Victor Zue教授的创新观
  13. 74HC595 芯片详细介绍
  14. linux内存96后无法连接,linux服务器因磁盘空间满导致oracle数据库无法连接问题探索...
  15. c语言程序数列问题,数列 (C语言代码)
  16. H3C 物联网路由器4G配置
  17. 【评测】小鼠肝细胞系(GHA1、AML12、BNL CL.2)培养实验操作步骤
  18. 密码全安控件OCX版本发布
  19. java荣誉勋章下载_荣誉勋章2011BT版
  20. HTML5CSS3基础:课程简介

热门文章

  1. Linux 存储 superblock
  2. 转:职场人必看十句话
  3. 面试怕被问“后端优化”问题?看看这套java性能调优手册吧!
  4. kmeans及模型评估指标_基于K-MEANS聚类模型和RFM价值分类模型的订单交易用户价值分析...
  5. Linux - Vim(Vi-Improved)
  6. 计算机系网络安全的教育方案,网络安全教育活动方案
  7. 日子一天天过........
  8. 【IAR】错误:Error while running Linker
  9. 中国网游新十年:或将进入大制作时代
  10. kernel busy的解决方法jupyter notebook