二维码产生的原理(二维码的生成原理和工作原理)
在1994年,这个类似于一个正方形马赛克的图片由日本DENSO WAVE公司发明----两位程序员为了追踪汽车零部件而设计。而现在,应用更为广泛的是由美国人设计的pdf417,datamatrx..其中的pdf417是由留美华人王寅敬博士发明。
其实很长时间里二维码应用于产品追踪,物品识别和库存管理等工业用途。直到智能手机和微信在中国普及,二维码才变成了一个可以被大众随时“扫一扫”的工具,或者说人人手里都有了一个“二维码扫描器”。二维码在中国应用的范围比较广,而在网上支付方面,二维码也存在一定的风险。其实,直接扫码很危险。有网友称其在街头张贴的广告上扫描了一个二维码之后, 手机刚充的100元话费就不翼而飞。他扫描了一个贴在墙上的交友类二维码后,并未下载安装交友软件,然后就被通知手机欠费。结果检测手机发现,被安装了手机病毒软件,导致刚充的话费被偷走。央行在2014年叫停二维码支付后时隔两年,于2016年8月3日官方才重新承认二维码的支付地位。
生成原理:该原理是,用特定的几何图形按编排规律在二维方向上分布,采用黑白相见的图形来记录数据符号信息。为了利用计算机内部逻辑,用数字“0”和数字“1”作为代码,同时使用若干个与二进制相对应的几何形体表示文字数值信息。
这里面我有几个小知识点想提一提。
知识点一:二维码共有40个尺寸
也就是版本version,Version 1.0是21 x 21的正方形,Version 2.0是 25 x 25的(公式:(V-1)*4 21)。所以最大的尺寸就是177 x 177 的正方形。
知识点二:三个点确定一个面
二维码只有三个角上有位置探测图案,就是这个就是为了更好的读取二维码。那有人问为什么不是四个能,这个角也不是多余的,可以镶嵌别的信息。
知识点三:旋转二维码,也可以识别
因为有知识点二中所说的位置探测图案和分隔符,所以,无论是正着扫码,还是竖着扫码,或者斜着扫码,信息都可以被识别。
再来看看,二维码的工作原理:通过常见的图象输入设备或光电扫描设备,它们可以自动读取,并且会对识别出的信息进行自动处理。因为每个码制有自己的字符集,一个一个的字符占据自己的位置。所以,通过扫描能读取的数据信息在二维码中的位置是由定位图形和分隔符决定的。才能够快速地识别和处理图形旋转、变化等问题。
二维码可以在水平和竖直方向上进行编码,用正方形的黑白格来记录信息,原理是利用了二进制的0和1,打个比方,现在有一个10乘10格子的二维码,每一行都有黑白格,如果用1表示白色的格子,0表示黑色的格子,那么我们可以用类似“0100101100”这样的一行数字来表示每一行的代码,那么将10个这样的数字行排列起来,就组成了一个二维码,我们扫码就相当于解码的过程,可以识别二维码上的信息。
二维码还具有容错性,一些二维码只需要扫前面几行就可以识别出信息,哪怕二维码局部破损丢失都可能识别信息,不需要扫全,它比普通条形码译码错误率50万分之1还要低,误码率低于1000万分之1。
数据编码
我们先来说说数据编码。QR码支持如下的编码:
假如我们有个HELLO WORLD的字符串要编码,根据上面的示例二,我们可以得到下面的编码
我们还要加上结束符:
按8bits重排
如果所有的编码加起来不是8个倍数我们还要在后面加上足够的0,比如上面一共有78个bits,所以,我们还要加上2个0,然后按8个bits分好组:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000
补齐码(Padding Bytes)
最后,如果如果还没有达到我们最大的bits数的限制,我们还要加一些补齐码(Padding Bytes),Padding Bytes就是重复下面的两个bytes:11101100 00010001 (这两个二进制转成十进制是236和17,我也不知道为什么,只知道Spec上是这么写的)关于每一个Version的每一种纠错级别的最大Bits限制,可以参看QR Code Spec的第28页到32页的Table-7一表。
假设我们需要编码的是Version 1的Q纠错级,那么,其最大需要104个bits,而我们上面只有80个bits,所以,还需要补24个bits,也就是需要3个Padding Bytes,我们就添加三个,于是得到下面的编码:
00100000 01011011 00001011 01111000 11010001 01110010 11011100 01001101 01000011 01000000 11101100 00010001 11101100
上面的编码就是数据码了,叫Data Codewords,每一个8bits叫一个codeword,我们还要对这些数据码加上纠错信息。
纠错码
上面我们说到了一些纠错级别,Error Correction Code Level,二维码中有四种级别的纠错,这就是为什么二维码有残缺还能扫出来,也就是为什么有人在二维码的中心位置加入图标。
错误修正容量
L水平 7%的字码可被修正
M水平 15%的字码可被修正
Q水平 25%的字码可被修正
H水平 30%的字码可被修正
那么,QR是怎么对数据码加上纠错码的?首先,我们需要对数据码进行分组,也就是分成不同的Block,然后对各个Block进行纠错编码,对于如何分组,我们可以查看QR Code Spec的第33页到44页的Table-13到Table-22的定义表。注意最后两列:
Number of Error Code Correction Blocks :需要分多少个块。
Error Correction Code Per Blocks:每一个块中的code个数,所谓的code的个数,也就是有多少个8bits的字节。
生成二维码图片
首先,先把Position Detection图案画在三个角上。(无论Version如何,这个图案的尺寸就是这么大)
然后,再把Alignment图案画上(无论Version如何,这个图案的尺寸就是这么大)
关于Alignment的位置,Table-E.1的定义表(部分)
下图是根据上述表格中的Version8的一个例子(6,24,42)
接下来是Timing Pattern的线
再接下来是Formation Information,下图中的蓝色部分。
Format Information是一个15个bits的信息,每一个bit的位置如下图所示:(注意图中的Dark Module,那是永远出现的)
这15个bits中包括:
5个数据bits:其中,2个bits用于表示使用什么样的Error Correction Level, 3个bits表示使用什么样的Mask
10个纠错bits。主要通过BCH Code来计算
然后15个bits还要与101010000010010做XOR操作。这样就保证不会因为我们选用了00的纠错级别和000的Mask,从而造成全部为白色,这会增加我们的扫描器的图像识别的困难。
下面是一个示例:
关于Error Correction Level如下表所示:
再接下来是Version Information(版本7以后需要这个编码),下图中的蓝色部分。
Version Information一共是18个bits,其中包括6个bits的版本号以及12个bits的纠错码,下面是一个示例:
而其填充位置如下:
然后是填接我们的最终编码,最终编码的填充方式如下:从左下角开始沿着红线填我们的各个bits,1是黑色,0是白色。如果遇到了上面的非数据区,则绕开或跳过。
这样下来,我们的图就填好了,但是,也许那些点并不均衡,如果出现大面积的空白或黑块,会告诉我们扫描识别的困难。所以,我们还要做Masking操作QR的Spec中说了,QR有8个Mask你可以使用,如下所示:其中,各个mask的公式在各个图下面。所谓mask,说白了,就是和上面生成的图做XOR操作。Mask只会和数据区进行XOR,不会影响功能区。(注:选择一个合适的Mask也是有算法的)
其Mask的标识码如下所示:(其中的i,j分别对应于上图的x,y)
下面是Mask后的一些样子,我们可以看到被某些Mask XOR了的数据变得比较零散了。
Mask过后的二维码就成最终的图了。
这里同样有几个有趣的小知识点。
首先,二维码不但只有黑白色的,普遍使用黑白色是为了提高其工作效率。
其次,二维码源于日本,但在我国被发扬光大。
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com