原文:[开源]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的大牛们可能就失望了,不过研究二维码生成的算法确实需要学习很多的东西,还要参考很多的资料,大家有兴趣的可以自己研究一下ThoughtWorks.QRCode的源码,下面给出了一些参考资料。下面来先来看看工具的截图:

ThoughtWorks.QRCode源码地址:http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library

ThoughtWorks.QRCodeGithub地址:https://github.com/aaronogan/QR.NET

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

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

二维码尺寸:生成二维码的大小,默认值为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/

声明:本博客原创文字只代表本人工作中在某一时间内总结的观点或结论,与本人所在单位没有直接利益关系。非商业,未授权,贴子请以现状保留,转载时必须保留此段声明,且在文章页面明显位置给出原文连接。

如果大家感觉我的博文对大家有帮助,请推荐支持一把,给我写作的动力。

[开源]C#二维码生成解析工具,可添加自定义Logo相关推荐

  1. QRCode二维码生成方案及其在带LOGO型二维码中的应用(2)

    QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 续前:QRCode二维码生成方案及其在带LOGO型二维码中的应 ...

  2. QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)

    提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一种办法将上述区域预先"抠空"出来(以便专门放置LOG ...

  3. jquery-qrcode客户端二维码生成类库扩展--融入自定义Logo图片

    淘宝就不多说了,全球最大的中文假货销售平台(尽管淘宝没有打出全球中文等字样,可是其必须当之无愧).百度,当当等厚颜无耻之徒的明智之举就在于此,老外做的再大也很少会有直接支持中文的,因此他们都会在其名称 ...

  4. QRCode二维码生成方案及其在带LOGO型二维码中的应用

    很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别.那么,有没有一种办法将上述区域预先"抠空"出来(以便专门放置LOGO), ...

  5. springBoot二维码生成案例

    1.首先引入谷歌开源项目依赖: <!-- 二维码支持包 --> <dependency><groupId>com.google.zxing</groupId& ...

  6. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍  这里我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream o ...

  7. JAVA基础--QR_Code二维码生成

    2019独角兽企业重金招聘Python工程师标准>>> 项目中我们经常会用到二维码,今天就来讲讲二维码的生成: 1, 二维码的概念:            二维条码/二维码(2-di ...

  8. libqr--简单好用的c++二维码生成库

    libqr简介 libqr是github上开源的二维码生成库,地址:https://github.com/rsky/qrcode.使用c语言写成,但是用在c++代码里面毫无违和感,api简单好用,自带 ...

  9. 通用二维码生成 API 接口

    通用二维码生成 API 接口 提供通用的二维码生成接口. 1. 产品功能 支持分类字符生成: 直接返回存储在 CDN 中的二维码链接,可直接使用: 网址内容直接识别,生成网址类型的二维码,扫描后可直接 ...

最新文章

  1. 全面解析并实现逻辑回归(Python)
  2. VTK:图片之ImageEllipsoidSource
  3. github 提交报403 forbidden的错误解决
  4. 孙正义举债豪购ARM的3个理由:潜伏物联网时代
  5. 中国自研数据库拿下世界第一,背后这十年都经历了什么?
  6. 苹果机的时间格式转换为时间搓
  7. 写一个Windows上的守护进程(4)日志其余
  8. 并发编程之多线程操作
  9. 用户登陆进去后,没有权限操作
  10. 210.课程表II(力扣leetcode) 博主可答疑该问题
  11. UID PID PPID 分别是什么
  12. 牛顿柯特斯公式及复合形式、龙贝格求积公式,高斯勒让德求积公式
  13. 计算机组成原理菊花链是什么,计算机组成原理试题解析8
  14. 一段让你虎躯一震的代码
  15. 数据库修改用友U8账套
  16. 老程序员教你如何提高开发效率、成为大神1——人文思维进化与信众
  17. 服务器系统如何重装?
  18. 《java与模式》中模式总结
  19. 大数据DataX(三):DataX安装及使用
  20. 全志melis系统 - 8080接口CPU屏调试

热门文章

  1. 如何制止OpenSSH漏洞?
  2. Linux 命令行敲命令 光标移动快捷键
  3. .NET Core程序中使用User Secrets存储敏感数据
  4. Spring.Net+NHibenate+Asp.Net mvc +ExtJs 系列 6 ----asp.net MVC+Extjs
  5. qt 软件发布在别的机器不能运行(IDE为vs2005)
  6. Deleted表用于存储DELETE和UPDATE语句所影响的行的复本
  7. 福师计算机导论在线作业一,福师《计算机导论》在线作业一..doc
  8. vuel路由间通讯_vue嵌套路由之间的通信(非vuex方法实现)
  9. vscode配置C/C++ windows编译环境。
  10. altium designer pcb文件大