zoukankan      html  css  js  c++  java
  • C#二维码生成解析

    C#二维码生成解析工具,可添加自定义Logo

    二维码又称 QR Code,QR 全称 Quick Response,是一个近几年来移动设备上超流行的一种编码方式,它比传统的 Bar Code 条形码能存更多的信息,也能表示更多的数据类型:比如:字符,数字,中文等等。今天就来跟大家分享一下我的二维码生成解析工具,主要功能就是生成二维码,并且可以添加自定义的Logo。当然,网络上面生成二维码的工具多如牛毛,生成二维码早已不再新鲜。这个工具的一个亮点就是可以识别二维码,下面就来具体看看吧,不过首先要补充一点二维码的知识。

     一、二维码基础知识

    一、二维码的版本

      首先,我们先说一下二维码一共有 40 个尺寸。官方叫版本 Version。Version 1 是 21 x 21 的矩阵,Version 2 是 25 x 25 的矩阵,Version 3 是 29 的尺寸,每增加一个 version,就会增加 4 的尺寸,公式是:(V-1)*4 + 21(V是版本号) 最高 Version 40,(40-1)*4+21 = 177,所以最高是 177 x 177 的正方形。

    下面我们看看一个二维码的实例:

    二、QR码的容错处理

    二维码支持纠错处理;纠错处理相对复杂,按照QR码的标准文档说明,QR码的纠错分为4个级别,分别是:

    • level L : 最大 7% 的错误能够被纠正;
    • level M : 最大 15% 的错误能够被纠正;
    • level Q : 最大 25% 的错误能够被纠正;
    • level H : 最大 30% 的错误能够被纠正;

     三、二维码(QR Code)的容量

      对于不同版本的二维码,容量也是不同的。理论上内容经过压缩处理后可以存7089个数字,4296 个字母和数字混合字符,2953个8位字节数据,1817个汉字;在上面我们看到,不同的Version的QR Code是不同的矩阵,Version版本越过,也就意味着容量越大。关于容量的计算我没有找到比较权威的算法,这里以第一版的来进行计算,第一版(21×21)的格式如下:

    其中的只有黄色的是存储数据的内容,在第一版本中只有217(21×21 - 8*9*3 -8)个存储数据的数空间,而其中有用的数据是 217 - 1个数据结尾标志 = 216 ,在216bit 

    216bit/8 = 27Byte 在版本一的QR码中只能够存储27Byte的数据(要是有校验容错就更少了),当然在不同的容错级别下,容量也是有变化的。

    所以,version为1的QR Code大概也就能容下十几个字符。

    四、二维码的编码

    QR 码支持如下的编码:

      Numeric mode 数字编码,从 0 到9。如果需要编码的数字的个数不是 3 的倍数,那么,最后剩下的 1 或 2 位数会被转成 4 或 7bits,则其它的每 3 位数字会被编成 10,12,14bits,编成多长还要看二维码的尺寸(下面有一个表 Table 3 说明了这点)

      Alphanumeric mode 字符编码。包括 0-9,大写的A到Z(没有小写),以及符号$ % * + – . / : 包括空格。这些字符会映射成一个字符索引表。如下所示:(其中的 SP 是空格,Char 是字符,Value 是其索引值) 编码的过程是把字符两两分组,然后转成下表的 45 进制,然后转成 11bits 的二进制,如果最后有一个落单的,那就转成 6bits 的二进制。而编码模式和字符的个数需要根据不同的 Version 尺寸编成9, 11 或 13 个二进制(如下表中 Table 3)

    Byte mode, 字节编码,可以是0-255 的 ISO-8859-1 字符。有些二维码的扫描器可以自动检测是否是 UTF-8 的编码。

     二、QRCode生成解析工具简介

       这个工具是用WPF基于ThoughtWorks.QRCode.dll开发的,没有复杂的生成二维码的算法,无论你是新手还是大牛,都能看的懂。看到这里有些使用过的ThoughtWorks.QRCode.dll的大牛们可能就失望了,不过研究二维码生成的算法确实需要学习很多的东西,还要参考很多的资料,大家有兴趣的可以自己下载资料研究,下面给出了一些参考资料。下面来先来看看工具的截图:

    界面很简单,下面简单来说明一下:

    二维码的内容:生成的二维码内容,可以输入任何的字符串,比如网址之类的,支持中文。

    二维码尺寸:生成二维码的大小,默认值为4,数字越大,生成的二维码越大,可以根据需求填写。

    二维码版本:二维码的Version,值为1~40,version越高,二维码信息容量越大。但是目前30以上的版本生成的二维码,由于手机摄像头等原因会造成手机无法识别。

    生成:生成指定内容的二维码,然后显示在左下方的图片框中。

    保存:保存二维码,将二维码另存为png格式的图片。

    打开二维码:打开二维码图片,显示在左下方的图片框中。

    解析:解析左下方中图片框中的二维码,解析结果会显示在二维码内容后面。

    自定义Logo:点击添加图片作为Logo,不添加则生成的二维码中没有Logo.

    下面来生成一个二维码看看吧,如图:

    然后我们添加一个Logo来看看吧,如下图:

    由于Logo的尺寸可以自由调节,有时候Logo设置的过大,会覆盖二维码中的部分信息,造成无法识别。这个时候,我们可以点击解析按钮,来测试我们的二维码是否有效,如图:

    我们看到解析出来的内容出现了乱码,这个就是因为我们的Logo尺寸太大了,我们可以减小Logo的尺寸或者增大二维码的尺寸,这里我修改二维码尺寸为6,然后就可以正常识别了。然后我们点击保存按钮,打开另存为对话框,会保存为png格式的图片,实际生产的二维码尺寸如图:

     下面我们来看一下解析二维码,我们从百度上面随便下载一个二维码图片,看看里面保存了什么,如图:

    这里我们可以鼠标选择文本复制,或者直接点击复制到剪切板来复制二维码的内容。

    下面来说说一些Bug处理,首先要说的是二维码的容量问题,Version为1的二维码容量约为十几个字符,超出容量就会出现下面错误,如图:

    当然,如果你随便打开一张无效的二维码图片当做二维码来解析,会出现如下错误,如图:

    当然,如果图片中含有二维码还是可以解析成功的,如图:

     三、GitHub开源地址

     Github地址:https://github.com/yunfeifei/QRCodeTools

    当然,软件还有很多要优化的地方,存在许多未知的Bug,后面会不断修改更新。欢迎大家进行评测,指出bug和不足之处。经过测试,如果二维码太大或者版本太高都会出现识别不了的情况,当然选择合适的尺寸和版本还是正常使用的。

     参考链接

     二维码的生成细节和原理

    QR码生成原理(一)

     作者:雲霏霏

    QQ交流群:243633526

     博客地址:http://www.cnblogs.com/yunfeifei/

  • 相关阅读:
    手机号码正则表达式
    POJ 3233 Matrix Power Series 矩阵快速幂
    UVA 11468
    UVA 1449
    HDU 2896 病毒侵袭 AC自动机
    HDU 3065 病毒侵袭持续中 AC自动机
    HDU 2222 Keywords Search AC自动机
    POJ 3461 Oulipo KMP模板题
    POJ 1226 Substrings KMP
    UVA 1455 Kingdom 线段树+并查集
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4314797.html
Copyright © 2011-2022 走看看