三、二维码的生成
既然已经知道了二维码的组成,接下来就来学习生如何生成二维码:
1、需求分析
需求分析主要是确定编码的字符类型, 选择纠错等级等。比如确定要生成的二维码的数据类型是什么?
2、数据编码
数据编码就是将数据字符转换为位流,每8位一个码字,整体构成一个数据的码字序列。其实知道这个数据码字序列就知道了二维码的数据内容。目前二维码支持的集中数据为:

ECI(Extended Channel Interpretation mode):用于特殊的字符集。并不是所有的扫描器都支持这种编码。
数字(Numeric mode):数字编码,从0到9。
字母数字(Alphanumeric mode):字符编码。包括 0-9,大写的A到Z(没有小写),以及符号$ % * + - . / : 包括空格。
8位字节(Byte mode):可以是0-255的ISO-8859-1字符。有些二维码的扫描器可以自动检测是否是UTF-8的编码。
日本汉字(Kanji mode):这是日文编码,也是双字节编码。同样,也可以用于中文编码。
中国汉字
结构链接(Structured Append mode):用于混合编码,也就是说,这个二维码中包含了多种编码格式。
FNC1(FNC1 mode):主要是给一些特殊的工业或行业用的。比如GS1条形码之类的。
3、纠错编码
QR码缺一部分或者被遮盖一部分也能被正确扫描,要归功于QR码在发明时的“容错度”设计,生成器会将部分信息重复表示(也就是冗余)来提高其容错度。QR码在生成时可以选择四种程度的容错度(可修正的字码量),分别是L,M,Q,H,对应7%,15%,25%,30%的容错度。也就是说,如果你在生成二维码时选择H档容错度,即使30%的图案被遮挡,也可以被正确扫描。这也就是为什么现在许多二维码中央都可以加上LOGO。
二维码的纠错码主要是通过Reed-Solomon error correction(里德-所罗门纠错算法)来实现的。大致的流程为对数据码进行分组,然后根据纠错等级和分块的码字,产生纠错码字。
4、构造最终数据信息
完成上述操作后,并不是就能直接生成二维码了,还需要进行处理的就是穿插放置数据,比如有4个区块的,那么统一把每一区块的第一列放在一起,然后是第二列。以此类推。
在规格确定的条件下,将上面产生的序列按次序放如分块中。按规定把数据分块,然后对每一块进行计算,得出相应的纠错码字区块,把纠错码字区块按顺序构成一个序列,添加到原先的数据码字序列后面。
5、构造矩阵
将探测图形、分隔符、定位图形、校正图形和码字模块放入矩阵中。

最终编码的填充方式如下:从左下角开始沿着红线填我们的各个bits,1是黑色,0是白色。如果遇到了上面的非数据区,则绕开或跳过。

6、掩摸图案
按照上面的方法生成的图片可能会不均匀,比如说出现大面积的黑白或黑快,使得扫描变得困难,解决方法是进行(XOR)掩摸操作。QR有8个Mask你可以使用,如下所示:

需要注意的是,掩摸只会和数据区进行XOR,不会影响功能区。具体可以查看里德-所罗门码。
7、格式和版本信息
最后一步就是生成格式和版本信息放入相应区域内。版本7-40都包含了版本信息,没有版本信息的全为0。二维码上两个位置包含了版本信息,它们是冗余的。版本信息共18位,6X3的矩阵,其中6位时数据为,如版本号8,数据位的信息时 001000,后面的12位是纠错位。