矩阵中的模块放置
在上一步(结构化最终消息)中,交错数据和纠错码字,得到最终的位串。下一步是将它们与所需的功能模式一起放 二维码矩阵中。功能图案是二维码规范所需的二维码的非数据元素,例如二维码矩阵角落的三个搜寻图案。本页说明何时以及如何放置功能图案和数据位。
术语:像素与模块
在此页面上,我将二维码的黑白方块称为模块而不是像素。这是为了区分屏幕上的像素和二维码的黑白方块。例如,版本 1 二维码始终是 21 x 21 个模块,即使它在计算机屏幕上占用 42 x 42 像素或 105x105 像素,依此类推。
函数模式概述
二维码必须包含功能图案。这些是必须放置在二维码的特定区域的形状,以确保二维码扫描仪可以正确识别和定向代码以进行解码。下图给出了功能模块是什么以及它们的位置的示例。
![notion image](https://www.thonky.com/qr-code-tutorial/function-patterns2.png?t=504c81b5-f3d9-4ae9-8856-ec02562ab85d)
查找器图案(finder patterns)是左上角、右上角和左下角二维码角落的三个块。
分隔符(separators)是查找器图案旁边的空白区域。
对齐图案(alignment patterns)类似于查找器图案,但较小,并放置在整个代码中。它们用于版本 2 及更大版本,它们的位置取决于 QR 码版本。
定位图案(timing patterns)是连接查找器图案的虚线。
暗模块(dark module)是一个黑色模块,始终放置在左下角的查找器图案旁边。
以下各节更详细地解释了如何定位功能模块。
第 1 步:添加查找器图案
首先,将查找器图案放入矩阵中。查找器图案(如下所示)由一个外部黑色方块(7 个模块 x 7 个模块)、一个内部白色方块(5 个模块 x 5 个模块)和中间的实心黑色方块(3 个模块 x 3 个模块)组成。
![notion image](https://www.thonky.com/qr-code-tutorial/finder.png?t=a6eb81c7-a4e1-4818-b97b-a2c8d752dd3e)
查找器图案被设计为不太可能出现在二维码其他部分中的模式。查找器图案的模块宽度比例为 1:1:3:1:1。二维码扫描仪可以搜索这种明暗模块的比例,以检测二维器图案并正确定位 QR 码以进行解码。
无论使用哪个版本,查找器图案始终放置在 QR 码的左上角、右上角和左下角。
为了说明这一点,下图显示了取景器图案的位置。左边是版本 1 二维码,右边是版本 18 二维码。
![notion image](https://www.thonky.com/qr-code-tutorial/finder_example_1.png?t=a0f11447-ed7f-475f-9d9d-99af6f8e374d)
![notion image](https://www.thonky.com/qr-code-tutorial/finder_example_18.png?t=256c7b11-bb15-43c5-8645-52028d26a885)
二维码的大小可以用公式计算,其中V是二维码版本。例如,版本 32 是 或 145 个模块乘以 145 个模块。因此,查找器图案的位置可以概括如下:
- 左上角查找器图案的左上角始终位于 (0,0)。
- 右上角查找器图案的左上角始终位于([(((V-1)*4)+21) - 7], 0)
- 左下角查找器图案的左上角始终位于(0,[(((V-1)*4)+21) - 7])
步骤 2:添加分隔符
分隔符是一行白色模块,一个模块宽,放置在查找器图案旁边,以将它们与 QR 码的其余部分分开。分隔符仅放置在接触 QR 码内部的查找器图案的边缘旁边。例如:
![notion image](https://www.thonky.com/qr-code-tutorial/separators.png?t=dfd1be11-27fd-4240-a536-cbf391ad1745)
![notion image](https://www.thonky.com/qr-code-tutorial/separators2.png?t=0efdd3c7-5acd-4004-8b36-d93fe6cf85a3)
步骤 3:添加对齐图案
版本 2 及更大的二维码需要具有对齐模式。如下所示的对齐模式由 5 模块 x 5 模块黑色方块、内部 3 模块 x 3 模块白色方块和中间的单个黑色模块组成。
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-pattern.png?t=60b0cdb6-d2fe-430a-ab1d-55425a975c92)
必须放置对齐模式的位置在对齐模式位置表中定义。这些数字将用作行坐标和列坐标。例如,版本 2 具有数字 6 和 18。这意味着对齐模式的中心模块将放置在(6, 6), (6, 18), (18, 6) 和 (18, 18)处。
对齐图案位置表但是,在放置查找器图案和分隔符后,必须将对齐模式放入矩阵中,并且对齐模式不得与查找器图案或分隔符重叠。下图显示了版本 2 代码,该代码在上一段中描述为具有以 (6, 6)、(6, 18)、(18, 6) 和 (18, 18) 为中心的对齐模式。但是,如左图所示,以红色突出显示的对齐图案不得放置在矩阵中,因为它们与取景器图案和分隔符重叠。与查找器图案或分隔符重叠的对齐模式只需从矩阵中省略即可。
![错误放置](https://www.thonky.com/qr-code-tutorial/alignment-exclusion.png?t=4ce7c42c-6d25-4edc-9bdb-92a50e605da5)
![正确放置](https://www.thonky.com/qr-code-tutorial/alignment-correct.png?t=86791565-767d-45de-8b18-50feeb9a1638)
为了进一步说明对齐图案的位置,下图显示了版本 8 二维码的对齐图案。对齐图案位置表列出了6、24和42作为版本8的对齐图案位置。这三个数字的所有组合被用作对齐模式的坐标。
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F931f9e35-f69a-42d5-a15e-fd85169f85d3%2FUntitled.png?table=block&id=1419b4cf-5ed6-48f7-9103-8d9765747f0b&t=1419b4cf-5ed6-48f7-9103-8d9765747f0b&width=241&cache=v2)
步骤 4:添加定位图案
定位图案是两条线,一条水平,一条垂直,交替的暗模块和亮模块。水平定位图案放置在分隔符之间的二维码的第 6 行。垂直定位图案放置在分隔符之间的 QR 码的第 6 列上。定位图案始终以暗模块开始和结束。对齐图案可能与定位图案重叠,因为它们的亮模块和暗模块始终与定位图案的明暗模块重合,如下图所示。下图显示了不同版本的二维码上的定位图案。
![notion image](https://www.thonky.com/qr-code-tutorial/timing-s.png?t=1c3630b6-8f4c-406e-ac1c-3fb008580bf7)
![notion image](https://www.thonky.com/qr-code-tutorial/timing-m.png?t=d4ce9d7e-7ed6-425f-8590-2d78e4a48d8f)
![notion image](https://www.thonky.com/qr-code-tutorial/timing-l.png?t=d7ffd23e-d1d5-4dc9-8753-33fdfac27bdc)
步骤 5:添加暗模块和保留区域
几乎是时候将数据位添加到二维码矩阵中了。但是,在此之前,必须添加暗模块,并且矩阵的某些区域必须保留用于格式和版本位,稍后将添加。
暗模块
如本页前面所述,所有二维码在左下角的查找器图案旁边都有一个深色模块。更具体地说,暗模块始终位于坐标([(4 * V) + 9], 8),其中 V 是二维码的版本。
保留格式信息区域
必须为格式信息区域保留分隔符旁边的模块条,如下所示:
- 在左上角查找器图案附近,必须在分隔符的下方和右侧保留一个模块条带。
- 在右上角查找器图案附近,必须在分隔符下方保留一个模块条带。
- 在左下角查找器图案附近,必须在分隔符的右侧保留一个单模块条带。
下图以蓝色显示保留区域。无论二维码是什么版本,它们始终沿着分隔符放置。
![notion image](https://www.thonky.com/qr-code-tutorial/format-reserved1.png?t=cc915135-dc3b-439a-b0ba-034093af4c6d)
![notion image](https://www.thonky.com/qr-code-tutorial/format-reserved2.png?t=335587e7-1123-4f10-89b6-6d0d368bd8e3)
保留版本信息区域
二维码版本 7 及更高版本必须包含放置版本信息位的两个区域。这些区域是左下角查找器图案上方的 6x3 块和右上角查找器图案左侧的 3x6 块。下图以蓝色显示保留区域的位置。
![notion image](https://www.thonky.com/qr-code-tutorial/version-area1.png?t=626f8490-45b6-4edf-8397-2cfd1bb87467)
![notion image](https://www.thonky.com/qr-code-tutorial/version-area2.png?t=025bae7a-218e-4427-a916-8ccf60f6d764)
步骤 6:放置数据位
现在是时候将数据位添加到二维码矩阵中了。位以特定模式放置。
放置方式
数据位从矩阵的右下角开始放置,并在 2 个模块宽的列中向上放置。对 0 使用白色像素,对 1 使用黑色像素。当列到达顶部时,下一个 2 模块列紧邻前一列的左侧开始并继续向下。每当当前列到达矩阵的边缘时,移动到下一个 2 模块列并更改方向。如果遇到功能图案或保留区域,则数据位将放置在下一个未使用的模块中。
下图显示了将数据位放置在二维码中的模式。请注意,当达到垂直定位图案时,下一列将从其左侧开始。
![notion image](https://www.thonky.com/qr-code-tutorial/data-bit-progression.png?t=ba18f274-0f4e-45ab-9dd0-8cc249bc26e5)
向上放置
下图显示了列向上移动时放置数据位的顺序。
![notion image](https://www.thonky.com/qr-code-tutorial/upward.png?t=b2dfbafd-8a96-4ccd-af08-0217d2030574)
下面的示例说明了位在第一个向上列中的位置。
![添加的第 1 个像素](https://www.thonky.com/qr-code-tutorial/qr-code-first-pixel.png?t=0a9d0acd-711c-4c0d-9322-3bfece43af75)
![添加的第 4 个像素](https://www.thonky.com/qr-code-tutorial/qr-code-fourth-pixel.png?t=04f8d561-626d-4338-a5d7-1ab35a2aa791)
![添加的第 2 个像素](https://www.thonky.com/qr-code-tutorial/qr-code-second-pixel.png?t=65cee21a-b26b-4c6a-adb5-16cc4c24559a)
![添加的第 5 个像素](https://www.thonky.com/qr-code-tutorial/qr-code-fifth-pixel.png?t=ef41bff8-5aa0-4cc3-af8b-f0fbdd9438af)
![添加的第 3 个像素](https://www.thonky.com/qr-code-tutorial/qr-code-third-pixel.png?t=4d6ca03e-ccb5-4353-b065-f5cea326e02c)
向下放置
下图显示了列向下放置数据位的顺序。
![notion image](https://www.thonky.com/qr-code-tutorial/downward.png?t=f045c686-6d0c-4e88-bc7f-2ca3382bd4f3)
下面的示例显示放置在向下列中的数据位。
![添加的向下的像素 #1](https://www.thonky.com/qr-code-tutorial/qr-code-down-1.png?t=3b3847b2-12f5-4711-9da7-4930b2e64222)
![添加的向下的像素 #4](https://www.thonky.com/qr-code-tutorial/qr-code-down-4.png?t=2c6f7b2b-1590-48dd-9c49-4e687801361d)
![添加的向下的像素 #2](https://www.thonky.com/qr-code-tutorial/qr-code-down-2.png?t=e31f33cf-174b-4d1f-b113-bf7d4d15d64a)
![添加的向下的像素 #5](https://www.thonky.com/qr-code-tutorial/qr-code-down-5.png?t=4a5b4b37-789b-4ff7-a0b8-505d981a200e)
![添加的向下的像素 #3](https://www.thonky.com/qr-code-tutorial/qr-code-down-3.png?t=1d07a7b7-501f-430b-a7df-ab023717d78b)
跳过功能图案
遇到功能图案时,跳过任何占用的模块,直到到达下一个未使用的模块。
在下图中,对齐图案下方的数据位正在向上列中前进。请注意,该列与对齐模式重叠。
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules1.png?t=b9ee66ff-bc96-43ff-b2fc-9bb61b997577)
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules2.png?t=1c79c8e0-0a39-4f42-8cf0-4309dccd72a7)
达到对齐图案后,只需跳过作为对齐图案一部分的模块并继续向上。
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules3.png?t=e8381f84-7f49-4029-b64b-3ed1d90710e1)
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules6.png?t=33d84989-5b06-4118-b9b0-8907f941e464)
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules4.png?t=a7904fc1-65b8-41de-a15e-66d9e1102a4c)
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules7.png?t=830107d7-6583-413a-ad17-61618cfbc1f1)
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules5.png?t=a4fc749a-575b-4bb2-8bee-cfc79fabe5f1)
然后继续以通常的方式将模块添加到列中。
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules8.png?t=a4620765-4ea6-4c16-91f0-a49d1e49393f)
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules9.png?t=a25c5fb3-c750-45d7-a085-1adacfae62ac)
![notion image](https://www.thonky.com/qr-code-tutorial/alignment-modules10.png?t=7c566728-7919-435a-bff6-b4bd28d18cd6)
总之,始终沿列正常进行,跳过功能图案或保留区域使用的任何模块。唯一的例外是垂直定位图案,如下所述。
例外:垂直定位图案
垂直定位图案是此规则的唯一例外。当达到垂直定位图案时,始终从其左侧的下一列开始。任何列都不应与垂直定位图案重叠。
在下面的图片中,前一列(向上)被突出显示。这一栏上面的其他模块被功能图案和保留区占据,所以必须开始下一列,并向下走。
![notion image](https://www.thonky.com/qr-code-tutorial/timing-modules1.png?t=33a5f52e-2cdf-4055-b67b-7a4f43615481)
如下图所示,下一列从垂直定位图案的左侧开始。该列不与垂直定位图案重叠。
![notion image](https://www.thonky.com/qr-code-tutorial/timing-modules2.png?t=d0968472-9007-42ee-94dd-d44fa0c81d98)
![notion image](https://www.thonky.com/qr-code-tutorial/timing-modules3.png?t=8280199b-e3d1-43f9-a6a7-79e8b3198547)
![notion image](https://www.thonky.com/qr-code-tutorial/timing-modules4.png?t=1eb29d89-4b23-421a-8ea5-de602b90dbca)
下一篇: 数据掩蔽
将数据和纠错位放入矩阵后,二维码规范要求对数据和纠错位应用掩码图案。此步骤的目的是减少矩阵中难以读取的模式的数量。继续下一部分,了解数据掩蔽。