二维码学习笔记(四) | 信息构建与模块放置
二维码笔记系列:
- 『二维码学习笔记(一) | 二维码概述』
- 『二维码学习笔记(二) | 数据分析与数据编码』
- 『二维码学习笔记(三) | 纠错编码』
- 『二维码学习笔记(四) | 信息构建与模块放置』
- 『二维码学习笔记(五) | 数据掩码与版本信息』
- 『二维码学习笔记(六) | 二维码解码』
唠唠闲话
上篇介绍了纠错编码和码字交织过程,至此已得数据区的内容,本篇将构建二维码框架,并将数据内容填入二维码矩阵。
构建二维码矩阵
本节说明如何放置功能区和数据位。
概述
-
我们将二维码的黑白色块称为“模块”而不是“像素”,为了与屏幕像素进行区分,比如版本 1 的二维码包含
21x21
模块。此外,二维码矩阵的原点取左上角作为 (0, 0)。 -
二维码必须包含功能图案,这些形状放置在 QR 码的特定区域,以确保 QR 码扫描仪能够正确识别和定位以进行解码。
-
下图举例说明了功能模式是什么以及它们的位置,分别为:
Finder Patterns
三个位置探测图形Separators
包围探测图形的分隔符Timing Patterns
时序图案,用于连接探测图形的虚线Dark Module
必要的深色模块Alignment Pattern
对齐图案,只有当二维码版本 ≥2 时需要,位置和数量取决于具体版本
第 1 步 添加探测图形和分隔符
-
首先,将三个探测图形放入矩阵,如下所示,其由
7 x 7
个模块的外部黑色方块、5 x 5
个模块的内部白色方块和中心的3 x 3
个模块的纯黑色方块组成。
-
探测图形被设计为不太可能出现在二维码的其他部分中的图案。其模块宽度比例为
1:1:3:1:1
,扫描仪可以搜索这种明暗比例的模块,以检测图案并正确定位二维码以进行解码。 -
无论使用哪个版本,探测图形始终位于二维码的左上角、右上角和左下角。
-
探测图形添加后,在其边缘添加一层白色模块,如下图
第 2 步 添加对齐图案
-
版本 ≥2 的二维码需添加对齐图案。如下所示,其为一个
5 x 5
模块黑色方块、一个内部3 x 3
模块白色方块和一个位于中心的黑色模块组成。
-
对齐图案必须按对齐图案位置表提供的位置信息放置,比如版本 2 的位置信息为
(6, 18)
,其代表四个位置:(6, 6), (6, 18), (18, 18), (18, 6)
,注意索引从 0 开始计数。 -
对齐图案需在位置探测图形和分割符之后放置,且当出现重叠时,略过该对齐图案。
- 错误放置方法(红色方块)
- 正确放置方法
- 错误放置方法(红色方块)
-
再比如,版本 8 的二维码位置信息为
(6, 24, 42)
,两两组合一共有3 x 3 = 9
个对齐图案。去掉三个重合的情况,一共需要 6 个对齐图案。
第 3 步 添加时序图案
-
时序图案是两条线,一条水平线,一条垂直线,由交替的暗模块和亮模块组成
-
水平时序图案位于分隔符之间的二维码的第 6 行,垂直时序图案位于分隔符之间的二维码的第 6 列
-
时序图案总是以暗模块开始和结束
-
对齐图案可能与时序图案重叠,但不影响时序图案的内容,比如下图
第 4 步 添加深色模块和保留区域
几乎是时候将数据位添加到二维码矩阵了。但是,在此之前,必须添加暗模块,并且矩阵的某些区域必须为格式和版本位保留,将在最后步骤添加。
-
深色模块:如下图,在左下角探测图形的分隔符的右上边缘添加一个深色模块
-
格式信息区域:分隔符旁边的一条模块,规则如下:
- 在左上角的探测图案附近,分隔符下方和右侧保留一个单模块条
- 在右上角的探测图案附近,分隔符下方保留一个单模块条
- 在左下角的探测图案附近,分隔符右侧保留一个单模块条
下图蓝色为格式信息区域,无论二维码是什么版本,它们总是沿着分隔符放置
-
版本信息保留区域:二维码码版本 7 及更高版本必须包含两个放置版本信息位的区域,分别为左下角探测图案上方的
6x3
块和右上角探测图案左侧的3x6
块,如下图蓝色区域
第 5 步 放置数据位
现在是时候将数据位添加到二维码矩阵了,这些信息以特定的模式放置。
-
数据位从矩阵的右下角开始放置,并在 2 个模块宽的列中向上移动。使用白色像素为 0,黑色像素为 1。当列到达顶部时,下一个 2 模块列从前一列的左侧开始并继续向下。以此类推,每当当前列到达矩阵边缘时,移动到下一个 2 模块列并改变方向,如果遇到功能模式或保留区域,则将数据位放置在下一个未使用的模块中。
-
整体的放置规则如下图所示
-
当列向上时,数据按如下方式进行放置
-
类似地,当列向下时,按以下方式进行
-
当遇到功能图案时,跳过所有被占用的模块,直到到达下一个未使用的模块,比如碰到对齐图案,2 模块列变成 1 模块列
-
总之,始终沿着列正常进行,跳过功能图案或保留区域的模块,但有唯一例外:垂直时序图案
-
当达到垂直时序图案时,始终从其左侧的下一列开始,任何列都不应与垂直时序模式重叠,例如下图,到达垂直时序图后,从2模块从左侧向下,继续保持2模块而不需要被占用1个模块。
将数据和纠错位放入矩阵后,二维码规范要求将掩码图案应用于数据和纠错位。此步骤的目的是减少矩阵中难以阅读的模式的数量,具体我们在下一篇中介绍。