• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
lingdu257
帮助1

二维码库允许您的程序创建(编码)二维码图像或读取(解码)包含一个或多个二维码的图像。代码已升级到 VS 2022 和 .NET 6.0。

介绍

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

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

编码器解决方案

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

解码器解决方案

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

此库的 QR 码编码器部分包含在PDF 文件编写器 C# 类库文章中。

安装

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

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

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

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

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#0000ff">using</span> QRCodeEncoderLibrary;
  2.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> or</em></span>
  3.  
    <span style="color:#0000ff">using</span> QRCodeDecoderLibrary;</span></span>

二维码

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

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

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

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

<span style="color:#000000"><span style="background-color:#fbedbb">Square-Dimension = <span style="color:#000080">21</span>   <span style="color:#000080">4</span> * (Version - <span style="color:#000080">1</span>)</span></span>

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

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

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

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

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

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

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

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

二维码编码

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

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

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> create QR Code encoder object</em></span>
  2.  
    QRCodeEncoder Encoder = <span style="color:#0000ff">new</span>();</span></span>

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

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> Error correction</em></span>
  2.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> error correction low (7%)</em></span>
  3.  
    Encoder.ErrorCorrection = ErrorCorrection.L;
  4.  
     
  5.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> or, error correction medium (15%) The Default</em></span>
  6.  
    Encoder.ErrorCorrection = ErrorCorrection.M;
  7.  
     
  8.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> or, error correction quarter (25%)</em></span>
  9.  
    Encoder.ErrorCorrection = ErrorCorrection.Q;
  10.  
     
  11.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> or, error correction high (30%)</em></span>
  12.  
    Encoder.ErrorCorrection = ErrorCorrection.H;
  13.  
     
  14.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> ECI Assignment Value (default is -1 not used)</em></span>
  15.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> The ECI value is a number in the range of 0 to 999999.</em></span>
  16.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> or -1 if it is not used</em></span>
  17.  
    Encoder.ECIAssignValue = -1;</span></span>
学新通

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

调用以下四种Encode方法之一:

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> single text string input</em></span>
  2.  
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Encode(<span style="color:#0000ff">string</span> StringDataSegment);
  3.  
     
  4.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> multiple text strings input</em></span>
  5.  
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Encode(string[] StringDataSegments);
  6.  
     
  7.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> single byte array input</em></span>
  8.  
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Encode(byte[] ByteDataSegment);
  9.  
     
  10.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> multiple byte arrays input</em></span>
  11.  
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">void</span> Encode(byte[][] ByteDataSegments);</span></span>

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

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> the encoder converts text string to byte array</em></span>
  2.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> using the conversion method</em></span>
  3.  
    byte[] ByteArray = Encoding.UTF8.GetBytes(Text);</span></span>

实际上,库软件会将第一种和第二种Encode方法分别转换为第三种和第四种方法。

QRCodeEncoderLibrary扫描每个传入数据字节数组段以确定最佳编码方法。该程序不会尝试断开单个段以最小化 QR 码矩阵的大小。您可以以利用长字符串数字或字母数字数据的方式提交段数组。

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

下一步是将二维码符号保存到文件中,或者创建一个Bitmap. 以下示例显示如何将其保存QRCodeMatrix为 PNG 图像文件。将二维码图像保存为 PNG 文件不需要使用Bitmap类,适用于 net-core 和 net-standard。PNG 图像文件比Bitmap.QRSaveBitmapImage

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> save image as png file</em></span>
  2.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> create save PNG image class </em></span>
  3.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> and load the QR Code matrix </em></span>
  4.  
    QRSavePngImage PngImage = <span style="color:#0000ff">new</span>(QRCodeMatrix);
  5.  
     
  6.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> set the module size in pixels</em></span>
  7.  
    PngImage.ModuleSize = ModuleSize;
  8.  
     
  9.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> set the quiet zone in pixels</em></span>
  10.  
    PngImage.QuietZone = QuietZone;
  11.  
     
  12.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> save the QR Code PNG image to file name</em></span>
  13.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> or to open file stream</em></span>
  14.  
    PngImage.SaveQRCodeToPngFile(Dialog.FileName);</span></span>

Bitmap使用类保存二维码。Bitmap类允许您选择文件格式。

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> save image as any file format supported by Bitmap class.</em></span>
  2.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> create image class for the QR Code matrix </em></span>
  3.  
    QRSaveBitmapImage Image = <span style="color:#0000ff">new</span>(QRCodeMatrix);
  4.  
     
  5.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> set the module size in pixels</em></span>
  6.  
    Image.ModuleSize = ModuleSize;
  7.  
     
  8.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> set the quiet zone in pixels</em></span>
  9.  
    Image.QuietZone = QuietZone;
  10.  
     
  11.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> save the QR Code image to file name</em></span>
  12.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> or to open file stream</em></span>
  13.  
    Image.SaveQRCodeToBitmapFile(Dialog.FileName, ImageFormat);</span></span>

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

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

命令行参数格式:

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

二维码编码器演示

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

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

学新通

二维码保存对话框

学新通

保存特殊二维码图片

二维码解码

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

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

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> create QR Code decoder object</em></span>
  2.  
    QRDecoder Decoder = <span style="color:#0000ff">new</span> QRDecoder();
  3.  
     
  4.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> call image decoder method with file name</em></span>
  5.  
    QRCodeResult[] ResultArray = Decoder.ImageDecoder(FileName)</span></span>

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

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> QR Code result </em></span>
  2.  
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">class</span> QRCodeResult
  3.  
    {
  4.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> QR Code Data array</em></span>
  5.  
    <span style="color:#0000ff">public</span> byte[] DataArray;
  6.  
     
  7.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> ECI Assignment Value</em></span>
  8.  
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> ECIAssignValue;
  9.  
     
  10.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> the next members are for information only</em></span>
  11.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> QR Code matrix version</em></span>
  12.  
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> QRCodeVersion;
  13.  
     
  14.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> QR Code matrix dimension in bits</em></span>
  15.  
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">int</span> QRCodeDimension;
  16.  
     
  17.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> QR Code error correction code (L, M, Q, H)</em></span>
  18.  
    <span style="color:#0000ff">public</span> ErrorCorrection ErrorCorrection;
  19.  
    }</span></span>
学新通

要将数据字节数组转换QRCodeResult.DataArray为文本,请string使用:

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> convert binary result to text string</em></span>
  2.  
    <span style="color:#0000ff">string</span> TextResult = QRCode.ByteArrayToStr(ResultArray[Index].DataArray);</span></span>

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

  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb"><span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> The QRDecoder converts byte array to text string </em></span>
  2.  
    <span style="color:#008000"><em>//</em></span><span style="color:#008000"><em> using this conversion</em></span>
  3.  
    <span style="color:#0000ff">public</span> <span style="color:#0000ff">static</span> <span style="color:#0000ff">string</span> ByteArrayToStr(byte[] DataArray)
  4.  
    {
  5.  
    Decoder = Encoding.UTF8.GetDecoder();
  6.  
    <span style="color:#0000ff">int</span> CharCount = Decoder.GetCharCount(DataArray, <span style="color:#000080">0</span>, DataArray.Length);
  7.  
    char[] CharArray = <span style="color:#0000ff">new</span> char[CharCount];
  8.  
    Decoder.GetChars(DataArray, <span style="color:#000080">0</span>, DataArray.Length, CharArray, <span style="color:#000080">0</span>);
  9.  
    <span style="color:#0000ff">return</span> <span style="color:#0000ff">new</span> <span style="color:#0000ff">string</span>(CharArray);
  10.  
    }</span></span>

例如,下图是两个 QR 码一个内一个。大一数据是:大二维码,小一数据是:小二维码。大的将纠错设置为高。该程序将找到两个 QR 码并使用纠错恢复大的缺失区域以获得正确的内容。

学新通

复制代码
  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb">QR Code 1
  2.  
    Big QR Code
  3.  
    QR Code 2
  4.  
    Small QR Code</span></span>

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

学新通

复制代码
  1.  
    <span style="color:#000000"><span style="background-color:#fbedbb">QR Code 1
  2.  
    Top left corner
  3.  
    QR Code 2
  4.  
    Top right corner
  5.  
    QR Code 3
  6.  
    Bottom left corner</span></span>

二维码解码器演示

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

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

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

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

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

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhggbcib
系列文章
更多 icon
同类精品
更多 icon
继续加载