二维码笔记系列:

唠唠闲话

上篇介绍了纠错编码和码字交织过程,至此已得数据区的内容,本篇将构建二维码框架,并将数据内容填入二维码矩阵。


构建二维码矩阵

本节说明如何放置功能区和数据位。

概述

  1. 我们将二维码的黑白色块称为“模块”而不是“像素”,为了与屏幕像素进行区分,比如版本 1 的二维码包含 21x21 模块。此外,二维码矩阵的原点取左上角作为 (0, 0)。

  2. 二维码必须包含功能图案,这些形状放置在 QR 码的特定区域,以确保 QR 码扫描仪能够正确识别和定位以进行解码。

  3. 下图举例说明了功能模式是什么以及它们的位置,分别为:

    • Finder Patterns 三个位置探测图形
    • Separators 包围探测图形的分隔符
    • Timing Patterns 时序图案,用于连接探测图形的虚线
    • Dark Module 必要的深色模块
    • Alignment Pattern 对齐图案,只有当二维码版本 ≥2 时需要,位置和数量取决于具体版本
      20220602230150

第 1 步 添加探测图形和分隔符

  1. 首先,将三个探测图形放入矩阵,如下所示,其由 7 x 7 个模块的外部黑色方块、5 x 5 个模块的内部白色方块和中心的 3 x 3 个模块的纯黑色方块组成。
    20220602231038

  2. 探测图形被设计为不太可能出现在二维码的其他部分中的图案。其模块宽度比例为 1:1:3:1:1,扫描仪可以搜索这种明暗比例的模块,以检测图案并正确定位二维码以进行解码。

  3. 无论使用哪个版本,探测图形始终位于二维码的左上角、右上角和左下角。

  4. 探测图形添加后,在其边缘添加一层白色模块,如下图
    20220602231405

第 2 步 添加对齐图案

  1. 版本 ≥2 的二维码需添加对齐图案。如下所示,其为一个 5 x 5 模块黑色方块、一个内部 3 x 3 模块白色方块和一个位于中心的黑色模块组成。
    20220603084730

  2. 对齐图案必须按对齐图案位置表提供的位置信息放置,比如版本 2 的位置信息为 (6, 18),其代表四个位置:(6, 6), (6, 18), (18, 18), (18, 6),注意索引从 0 开始计数。

  3. 对齐图案需在位置探测图形和分割符之后放置,且当出现重叠时,略过该对齐图案。

    • 错误放置方法(红色方块)
      20220603085618
    • 正确放置方法
      20220603085635
  4. 再比如,版本 8 的二维码位置信息为 (6, 24, 42),两两组合一共有 3 x 3 = 9 个对齐图案。去掉三个重合的情况,一共需要 6 个对齐图案。
    20220603085842

第 3 步 添加时序图案

  1. 时序图案是两条线,一条水平线,一条垂直线,由交替的暗模块和亮模块组成

  2. 水平时序图案位于分隔符之间的二维码的第 6 行,垂直时序图案位于分隔符之间的二维码的第 6 列

  3. 时序图案总是以暗模块开始和结束
    20220603091254

  4. 对齐图案可能与时序图案重叠,但不影响时序图案的内容,比如下图
    20220603090203

第 4 步 添加深色模块和保留区域

几乎是时候将数据位添加到二维码矩阵了。但是,在此之前,必须添加暗模块,并且矩阵的某些区域必须为格式和版本位保留,将在最后步骤添加。

  1. 深色模块:如下图,在左下角探测图形的分隔符的右上边缘添加一个深色模块
    20220603091025

  2. 格式信息区域:分隔符旁边的一条模块,规则如下:

    • 在左上角的探测图案附近,分隔符下方和右侧保留一个单模块条
    • 在右上角的探测图案附近,分隔符下方保留一个单模块条
    • 在左下角的探测图案附近,分隔符右侧保留一个单模块条

    下图蓝色为格式信息区域,无论二维码是什么版本,它们总是沿着分隔符放置
    20220603091217

  3. 版本信息保留区域:二维码码版本 7 及更高版本必须包含两个放置版本信息位的区域,分别为左下角探测图案上方的 6x3 块和右上角探测图案左侧的 3x6 块,如下图蓝色区域
    20220603091647

第 5 步 放置数据位

现在是时候将数据位添加到二维码矩阵了,这些信息以特定的模式放置。

  1. 数据位从矩阵的右下角开始放置,并在 2 个模块宽的列中向上移动。使用白色像素为 0,黑色像素为 1。当列到达顶部时,下一个 2 模块列从前一列的左侧开始并继续向下。以此类推,每当当前列到达矩阵边缘时,移动到下一个 2 模块列并改变方向,如果遇到功能模式或保留区域,则将数据位放置在下一个未使用的模块中。

  2. 整体的放置规则如下图所示
    20220603141320

  3. 当列向上时,数据按如下方式进行放置
    20220603141430

  4. 类似地,当列向下时,按以下方式进行
    20220603141509

  5. 当遇到功能图案时,跳过所有被占用的模块,直到到达下一个未使用的模块,比如碰到对齐图案,2 模块列变成 1 模块列
    20220603141634
    20220603141644

  6. 总之,始终沿着列正常进行,跳过功能图案或保留区域的模块,但有唯一例外:垂直时序图案

  7. 当达到垂直时序图案时,始终从其左侧的下一列开始,任何列都不应与垂直时序模式重叠,例如下图,到达垂直时序图后,从2模块从左侧向下,继续保持2模块而不需要被占用1个模块。
    20220603142131
    20220603142137
    20220603142142


将数据和纠错位放入矩阵后,二维码规范要求将掩码图案应用于数据和纠错位。此步骤的目的是减少矩阵中难以阅读的模式的数量,具体我们在下一篇中介绍。

相关链接

矩阵中的模块放置
对齐图案位置表