QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)
原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)
提要:很多公司为商业宣传之需,常将企业LOGO加入二维码中,但如果LOGO遮挡区域足够地大,二维码就变得无法识别。那么,有没有一种办法将上述区域预先“抠空”出来(以便专门放置LOGO),而其他区域则专门来放置二维码的有效数据呢?——这就是本文想探讨的问题。
本文重点探讨的是二维码的高级应用及改进,其主要的思路是通过掩码等手段,提前对二维码生成进行改进。
由于二维码通常是黑白方块型的,人眼无法直接识别,但为了商业和宣传的需要,很多公司都乐意将自己的LOGO标识加入到二维码中,以更方便直接识别。
为了便于理解,先比较以下两图:

图1 未加LOGO的彩色二维码 图2 加LOGO后的彩色二维码
但一旦LOGO加入到二维码中特别是LOGO足够显眼而遮挡住二维码本身而影响其本身的可识别性时,问题随之产生。下图就标识出了上面所加LOGO所遮盖的二维码区域。

图3 LOGO所遮盖的二维码区域示意
我们可以想像,如果LOGO遮挡区域足够地大,二维码就变得无法识别。那么,有没有一种办法将上述区域预先“抠空”出来(以便专门放置LOGO),而其他区域则专门来放置二维码的有效数据呢?——这就是本文想探讨的问题。
众所周知,为了增加QR码阅读的可靠性,最好均衡地安排深色与浅色模块。应尽可能避免类似“位置探测图形”的位图1011101出现在符号的其他区域。
为了满足上述条件,应按以下步骤进行掩模:
1)掩模不用于功能图形;
2)用多个矩阵图形连续地对已知的编码区域的模块图形(格式信息和版本信息除外)进行XOR操作。XOR操作将模块图形依次放在每个掩模图形上,并将对应于掩模图形的深色模块的模块取反(浅色变成深色,或相反);
3)对每个结果图形的不合要求的部分记分,以评估这些结果;
4)选择得分最低的图形。
下表给出了掩模图形的参考(放置于格式信息中的二进制参考)和掩模图形生成的条件。掩模图形是通过将编码区域(不包括为格式信息和版本信息保留的部分)内那些条件为真的模块定义为深色而产生的。所示的条件中,i代表模块的行位置,j代表模块的列位置,(i,j)=(0,0)代表符号中左上角的位置。

图4 掩模图形参考及条件

图5 QRCode的八种掩模方案

图6 掩模结果(版本1符号的所有的掩模图形,用掩模图形参考000到111的掩模结果)。
下图为掩模过程:

图7 符号的掩模过程
这些掩模方案的特征是黑点与白点呈形状的均匀地几何分布。将它们与原有图案进行异或操作后,掩模后的图像会对原有图像有明显的改进,有利于更好地识别。
罚点记分:
在依次用每一个掩模图形进行掩模操作之后,要通过对每一次如下情况的出现进行罚点记分,以便对每一个结果进行评估,分数越高,其结果越不可用。在下表中,N1到N4为对不好的特征所罚分数的权重(N1=3,N2=3,N3=40,N4=10),i为紧邻的颜色相同模块数大于5的次数,k为符号深色模块所占比率离50%的差距,步长为5%。虽然掩模操作仅对编码区域进行,不包括格式信息,但评价是对整个符号进行的。
最终,应选择掩模结果中罚分最低的掩模图形用于符号掩模。

图8 罚点记分表
从上表可以看出,该罚点记分方法有一定的人为性,特别是N1到N4为对不好的特征所罚分数的权重(N1=3,N2=3,N3=40,N4=10)。有人利用统计学中的方差来解决此类通用问题,其方法是:对每小块的黑点与白点数进行统计,若与期望的平均分布的值相差越大,则其越不可用。其采样的样本越多,采样窗口越小,所获得的数据就越精确。根据上述八种掩模方案的均方差,对计算结果进行比较,最终选取最优掩模。
类似这样:
double CompareVariance(bool[][] matrix)
{
int S=0;
for(int i = 0; i < matrix.Length; i++)
for(int j = 0; j < matrix[0].Length; i++)
if(!(matrix[i][j]^matrix[i][j+1])) S++;
for(int j = 0; j < matrix[0].Length; i++)
for(int i = 0; i < matrix.Length; i++)
if(!(matrix[i][j]^matrix[i][j+1])) S++;
double s = S/(2n(n-1));
return s;
}
为了实现本文所述的上述目标,我们在掩码实施前对二维码的生成方案进行改进,提前根据需要预留特定位置给LOGO标识。
鉴于篇幅太长,请看后续:
QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) http://blog.csdn.net/johnsuna/article/details/8525743
QRCode二维码生成方案及其在带LOGO型二维码中的应用(1)的更多相关文章
- QRCode二维码生成方案及其在带LOGO型二维码中的应用(2)
原文:QRCode二维码生成方案及其在带LOGO型二维码中的应用(2) 续前:QRCode二维码生成方案及其在带LOGO型二维码中的应用(1) http://blog.csdn.net/johnsu ...
- C#生成带logo的二维码
带logo的二维码生成分为两步骤:首先根据输入的内容生成二维码图片,然后读取本地的logo图片,通过图片处理生成带logo的二维码. 生成的二维码效果如下: 下面直接贴出二维码生成类 QRCode ...
- .NET生成带Logo的二维码
使用ThoughtWorks.QRCode生成,利用这个库来生成带Logo的二维码(就是中间嵌了一个图片的二维码),直接见代码: HttpContext context = HttpContext.C ...
- java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例
java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍 我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...
- 生成二维码、条形码、带logo的二维码
Nuget安装ZXing.Net,帮助类: using System; using System.Collections.Generic; using System.Drawing; using Sy ...
- jQuery-qrcode.js 生成带Logo 的二维码
引入文件 jQuery-qrcode.js 地址:https://blog-static.cnblogs.com/files/kitty-blog/jquery-qrcode.js https:// ...
- 涛哥的Python脚本工具箱之生成带Logo的二维码
近期须要在二维码上加Logo,网上没有找到好用的,于是自己用python写了一个. 须要安装qrcode,PIL库 二维码简称 QR Code(Quick Response Code),学名为高速响应 ...
- phpqrcode生成带logo的二维码图片及带文字的二维码图片
<?php require_once "./phpqrcode/phpqrcode.php"; /** * 这样就可以生成二维码了,实际上在png这个方法里还有几个参数需要使 ...
- 建议收藏备用:.net core使用QRCoder生成普通二维码和带Logo的二维码详细使用教程,源码已更新至开源模板
随着互联网越来越生活化,二维码的使用越来越普遍,不论是扫码支付还是扫码关注引流,似乎我们总是离不开二维码,那么很多需要推广的文章或社区想要自己的二维码,那么你是不是需要在网站直接提供给用户呢?很多开发 ...
随机推荐
- 证明的手段 —— 不失一般性的(WLOG)
不失一般性是数学中一个常见的表达.不失一般性(Without loss of generality,缩写:WLOG.WOLOG 或 w.l.o.g.)是数学中一个常见的表达. 如果给不相等的两数,a, ...
- 在windows下远程访问linux服务器
在网络性能.安全性.可管理性上,Linux有着其他系统无法比拟的强大优势,而服务器对这些方面要求特别高,因此Linux常常被用来做服务器使用.而当我们需要维护linux服务器的时候,就需要远程访问li ...
- Windows Phone 8.1 数据处理
Windows Phone 8.1 应用的数据存储位置包括: Installation Folder ApplicationData Credential Locker Known Folders S ...
- spring mvc redirect 重定向 跳转并传递参数
在项目中做form表单功能提交时,防止用户客户端后退或者刷新时重复提交问题,需要在服务端进行重定向跳转,具体跳转方式有以下几种方式: 公用代码: @RequestMapping(value=" ...
- js如何动态创建表格(两种方法)
js如何动态创建表格(两种方法) 一.总结 一句话总结: 1.方法一:写好创建表格的html代码,将之赋值给div的innerHTML. 2.方法二.直接用创建好的table元素的方法insertRo ...
- 病毒软件,导致DNS失效的解决办法
问题症状,DNS失效了,ping域名总是失败. 问题回顾:几个周之前,某群友在群里上传了一个病毒软件,我想去测验下,最后果然中毒.前几天,把软件卸载了,上周末解决了删除最后一款软件导致无法上网的问题. ...
- C++程序员经常问的11个问题
下面的这些要点是对所有的C++程序员都适用的.我之所以说它们是最重要的,是因为这些要点中提到的是你通常在C++书中或网站上无法找到的.如:指向成员的指针,这是许多资料中都不愿提到的地方,也是经常出错的 ...
- 【9206】 奖学金(NOIP2007)
Time Limit: 10 second Memory Limit: 2 MB 问题描述 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金.期末,每个学生都有3门课的成 ...
- WebHost failed to process a request.Memory gates checking failed because the free memory (140656640 bytes) is less than 5% of total memory
WebHost failed to process a request. Sender Information: System.ServiceModel.ServiceHostingEnvironme ...
- dotnet core 通过修改文件头的方式隐藏控制台窗口
原文:dotnet core 通过修改文件头的方式隐藏控制台窗口 在带界面的 dotnet core 程序运行的时候就会出现一个控制台窗口,本文告诉大家使用最简单方法去隐藏控制台窗口. 最近在使用 A ...