二维码生成机制

from  http://mp.weixin.qq.com/s?__biz=MzA3ODg1MjM3OQ==&mid=2650204964&idx=1&sn=e12ad6a7c12ad85d56916454076f0e94&chksm=87be3350b0c9ba46ef62e761b037d8f72c955e7563d2efa9153213631541e5208677431a6c53&mpshare=1&scene=23&srcid=0215Jbd68ihXglN097oshNdK#rd

所谓二维码的生成,其实就是指一份原始数据,经过一系列的转换,最后转变成一个储存了数据信息的二维码图形。对于矩阵式二维码来说,这个过程从逻辑上看包含三个步骤:先把原始数据按照一定的模式编码为由0和1构成的二进制字符串,再根据——1代表深色块、0代表浅色块——这一原则将二进制字符串进一步转化为一个色块序列,最后遵循特定的规则将这个色块序列填入一个方形矩阵,就形成了二维码。以QR二维码为例,上述过程可以具体划分为五个阶段。


一、数据分析

一般而言,数据有很多种类,数字、字母、文字、符号、图像、声音等等。由于各种类型的数据具有不同的特点,不同的范围,不同的复杂程度,所以在编码之前,要先判断原始数据属于哪一种分类,然后根据这一分类选择与之相适应的编码模式,以便提高编码的效率。


二、数据编码

判断了数据所属的分类之后,相应的编码模式如下表所示。

 


在该表中,字符总数由数据类型决定,例如数字类包含0-9共10个字符,大、小写字母各26个字符,共52个。字符容量由选用的二进制位数决定,例如10位二进制可以容纳2^10=1024个不同的字符,5位二进制可以容纳2^5=32个不同的字符。


选择编码模式的原则在于,第一,要确保字符容量能够容纳该类型的字符总数,否则就会有部分数据无法转换;第二,字符容量要尽可能小,因为二维码的空间有所限制,储存的信息量有限,容量过大会导致大量容纳空间被浪费,影响存储空间的利用效率。


其中第一、四种类型的字符容量远远大于字符总数,原因是这两种情况均以每三个字符为一组,所以字符容量应该涵盖每组的实际字符总数10^3和71^3,而不是每一个字符的字符总数10和71。


在实际的二维码生成过程中可能同时存在几种不同的编码模式,一般对每种编码模式进行编号,再对各类型原始数据选择相应的模式进行编码,然后在完成编码的信息前面加入关于模式编号以及数据长度的标注。


另外对于图像、音频类数据,通常可以选择8位字节编码模式。


三、纠错编码

二维码经过打印之后,容易受到破坏和污损,为了防止数据丢失,在编码过程中还需要加入纠错编码。纠错编码分为不同的纠错等级,分别能够纠正不同水平的错误编码:

 
 

从表中看出,纠错等级分为四种,最高能够容纳30%的错误,即原始数据编码中30%以内的数据缺损,都可以通过纠错编码进行定位和修正。最后一行的二进制指示符用于对该种纠错等级进行编码,以便在二维码中标识出来,便于进行识读。


首先对原始数据编码后的字符串进行分组,每8个为一个模块,依次排列,最后一组不足8个的用0补足;


然后根据选定的纠错等级,按照一定的规则生成与每组原始数据相对应的纠错编码,同样分为每8个为一个模块,依次排列,最后一组不足8个的用0补足;


最后将数据模块和纠错模块按照下列的方式串联起来:

 


四、布置模块

在介绍如何将第三阶段得到的模块序列向二维码中填充之前,我们需要先了解二维码图形的规格和结构。


QR二维码有40种规格,版本1有21*21个模块,版本2有25*25个模块,依次类推,每高一个版本,每边增加4个模块,一直到版本40的规格为177*177个模块。故二维码的版本和规格决定了其信息的容量,版本越高,模块数量越多,信息容量越大。


二维码图形的结构主要分为两个部分,一是功能图形,其中包含寻像图形、定位图形和校正图形,功能图形主要服务于二维码的识别;二是编码信息,其中包含版本信息、格式信息和数据编码以及纠错编码,编码信息主要服务于二维码的解译。


 

寻像图形,又称为位置探测图形,由左上、右上、左下角的三个固定形状的同心方块组成,模块宽度比为1:1:3:1:1。由于这样的形状在数据编码中偶然出现的概率较低,因此可以在扫描时使二维码被快速识别出来。寻像图形与其他编码之间会留出一个模块宽度的分隔符。


定位图形,即一行、一列的两条深浅交替模块,模块宽度为1。其作用在于确定二维码的密度和版本,给出模块坐标的基准位置。简单来说就是指明二维码图形中的深浅色块有多少格,以及每格的宽度和位置。


校正图形,即比寻像图形稍小的若干个同心方块。它的作用在于,二维码识别过程中,扫描到的图像可能存在失真或者变形,干扰信息的读取,在二维码的版本较高时尤其如此,所以需要校正图形来进行修正。二维码中是否放入校正图形是可选的,其位置和数量取决于二维码的符号版本。


版本信息,如图所示的两块3*6模块,用于记录和说明该二维码的版本。一共18个模块,代表着十八位二进制,其中六位二进制用于版本信息的数据编码,另外十二位为版本信息的纠错编码(之所以需要六位二进制,是因为二维码共有40种版本,需要提供2^6的数据容量才能容纳)。而由于版本信息对二维码的解码十分重要,所以使用两块区域来记录版本信息。


格式信息,如图所示的三个区域,同样也是记录关于纠错等级和掩模图形的两份相同内容,每份格式信息需要占用15位二进制(由于图形原因多出的一位记0),其中5位依次包含了纠错等级(2位)和掩模图形(3位),剩余10位为纠错编码。


在确定好上述的几个区域以后,剩余的部分就可以用来填充数据编码和纠错编码。


将第三步中得到的数据模块和纠错模块序列按照下述方式填入二维码:

 

 

 

从右下角开始,先从下往上,再从上往下,依次轮流交替,前后两个模块总是相邻的。在每个2*4模块的内部,排布顺序也有具体要求,总是从右往左,再向上或向下依次排布,如下图所示:

 

 

当该模块位于向上排布的一列时,模块内部方向也为向上,当该模块位于向下排布的一列时,模块内部的方向也为向下,不变的是无论模块向哪个方向排布,模块内部总是从右向左。


当模块填充过程中遇到功能图形、版本信息、格式信息或者图像边界时,跳过这一区域仍旧按照上述原则和顺序选择下一个可用的模块位置。


也可以省去分组的步骤,将整个数据码位流当做一条线,同样的按照上述规则进行填充,如下图:

 


五、添加掩模

通过上述形式生成的二维码图形,有可能会出现深色块或浅色块中某一种特别多的情况,也可能会出现某一种色块连成一片的情况,影响二维码识别的准确性,因此需要加入掩模对初始二维码进行调整,使得深色块和浅色块在数量和分布上尽可能均衡,同时避免在数据编码区域出现与寻像图形相同的图案,以提高识读的精度。


QR码的掩模图案共有8种,具体的图案所代表的生成条件(条件为真定义为深色)以及对应的二进制指令如下图所示:

 

 

一个未经掩模的初始二维码可能是这样的:

 

可见未进行掩模的二维码非常难以准确识读。


分别将上面8种掩模图形以XOR方式放入初始的二维码得到8个新的二维码,XOR方式指掩模中的深色块会将初始二维码中的色块反向,即深色变为浅色,浅色变为深色,而掩模中的浅色则会块维持初始二维码中原来的色块颜色不变。


对得到的8个新二维码从以下几个角度进行罚分,最后采纳总罚分最小的方案:


1.行或列中是否有相邻模块颜色相同

2.相邻的同色模块含有多少块

3.是否出现寻像图形的图案

4.整体的深色块与浅色块比例

 




至此就已经生成了一个可以使用的二维码。


在此基础之上,二维码的生成还可以根据特定的需要向二维码加入特定的Logo作为标识,并且还能对二维码的色彩、外形等属性进行美化,生成个性化的二维码。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值