二维码本质上就是一张由黑白方块组成的网格,摄像头把它读成一长串二进制数。三个角落里的大方块告诉手机二维码的位置和方向,其余图案则承载你的数据,外加内置的备份信息,让二维码在划痕、污渍甚至贴纸遮挡下仍能被读出。下面用通俗的语言讲清每个部分的作用。
从摄像头图像到模块网格
当你把摄像头对准二维码,软件的第一步是把照片变成计算机能处理的东西。它会按一个亮度阈值把图像变成黑白:比阈值暗的像素算黑色,亮的算白色。照片模糊或有阴影会让这一步变难,所以清晰、光线充足的二维码扫起来更可靠。
图案中最小的方块叫模块。对读取器来说,每个模块就是一位信息——深色模块代表一个二进制值,浅色代表另一个。下文提到的一切,从角落的大方块到数据本身,都只是网格上排列的模块。
二维码四周留有一圈空白边距,习惯上称为静区,宽度为四个模块。它给摄像头一个干净的边缘用于检测,并把二维码与花哨的背景隔开。紧贴其他图形印刷的二维码难扫描,原因正在于此。
三个定位图案
在左上、右上和左下三个角落,你会看到二维码最有辨识度的特征:一个由嵌套圆环组成的大方块——外圈深色、中间一圈浅色、中心是实心深色 3×3 区域。这就是定位图案,它解决每个扫描器遇到的第一个问题:二维码在哪里?方向朝哪?
扫描器通过在图像上滑动检测线来寻找一种非常特定的节奏。穿过定位图案中部的一条线会依次经过深、浅、深、浅、深五个区域,宽度比为 1:1:3:1:1——一个模块深色、一个浅色、三个深色、再一个一个。这种特征足够独特,几乎不会与照片里的其他东西混淆。
为什么是三个定位图案而不是四个?三个角足以确定一个正方形,而缺少的那个角本身也有含义:它告诉读取器哪边是“上”。即使你倒着或侧着扫描,读取器也知道该把网格旋转多少度再解码。
时序图案与校正图案
只知道三个角的位置还不够。如果二维码是斜着拍的,或印在曲面上,中间的网格可能被拉伸或倾斜。另外两种结构负责纠正这一点。
时序图案是一条深浅模块交替排列的虚线,连接各个定位图案——一条沿顶边,一条沿左边。它像一把尺子:通过数交替的次数,读取器确认模块的确切尺寸,以及整个网格应当如何分布。
校正图案是一个更小的嵌套方块,边长五个模块,从版本 2 起出现,位于右下方附近。更大的二维码会带好几个。每一个都像额外的地标,让读取器测量并修正其所在区域的变形——当二维码贴在瓶身上或印在略微起皱的标签上时,这一点至关重要。
版本 1 到 40
二维码有 40 种尺寸,称为版本。版本 1 是 21×21 的模块网格。每升一版,每边增加四个模块,所以版本 2 是 25×25,版本 3 是 29×29,依此到版本 40 的 177×177。
网格越大,能装的数据越多。按经验估算,最大的版本可容纳约 7000 个数字,而一个短网址用小得多的二维码就装得下。确切容量还取决于你编码的内容——数字比文字更省空间——以及你选择的纠错级别。
这也是为什么生成的二维码外观差异很大。编码工具会选择能装下内容的最小版本,所以短链接生成稀疏、方块粗大的二维码,长链接则生成致密、细颗粒的图案。
数据码字与纠错码字
结构图案占完各自的位置后,剩下的区域用来放有效载荷。这些比特每八个一组,称为码字——每个码字就是一字节信息。
码字分两种。数据码字承载实际内容:网址、文字或其他任何信息。纠错码字则是一种聪明的备份,用里德–所罗门码(Reed–Solomon)这一数学方法从数据计算而来——CD 和 DVD 保护数据用的也是同一类技术。读取器用它们来校验数据并修复缺失的部分。
二维码提供四个纠错级别:L、M、Q、H。大致来说,它们分别能恢复约 7%、15%、25% 和 30% 的码字。代价是空间:级别越高,留给备份的码字越多,留给数据的越少,同样的内容可能需要更大的版本。
这就是为什么中央叠加 logo 的二维码仍能扫描:设计者选了高纠错级别,让备份码字吸收被遮挡的区域。
掩模
如果放任不管,原始数据可能排出很难看的网格:大片空白,或恰好长得像定位图案的方块群,让扫描器误判。解决办法是掩模。
编码工具从八个预定义的掩模图案中取一个——棋盘格、横条纹、竖条纹等重复图案——并在掩模为深色的位置翻转每个模块。数据本身不变,只是外观变了,而且翻转完全可逆。
工具会尝试全部八个掩模,用惩罚规则给每种结果打分(同色长条、酷似定位图案的形状、深浅面积失衡),保留惩罚最低的那个。用了哪个掩模,记录在定位图案旁的一小段格式信息里——为保险起见写了两遍,这样即使一角磨损,读取器也不会猜错。
这也是为什么同一个链接用两个不同工具编码会得到外观不同的二维码。两者都正确,只是选了不同的掩模。
一个小例子
以文字"HI"为例。编码器先写几个设置比特——后面是什么类型的数据、长度多少——再写内容本身。每个字符占八个比特:H 变成 01001000,I 变成 01001001。这十六个比特对应网格上的十六个模块,一比特一个。
这些比特按两列一组从右下角开始蛇形上下填入网格,跳过定位、时序和格式信息区域。数据之后是一段由它算出的纠错码字,紧挨着放好。最后套用选定的掩模,翻转部分模块,打散任何不巧的图案。
这就是全部配方:先结构,再数据,然后备份,最后掩模。你扫过的每一个二维码,都是同一套流程在更大尺度上的重复。
核心要点
二维码是一幅自我描述的图片。定位图案说“我在这里,这边朝上”;时序和校正图案把网格摆正;版本决定尺寸;码字带着你的数据和内置备份;掩模保证整体图案易于读取。下次扫码时——或在 QRCodeMax.Vip 生成自己的二维码时——放大看看,你会发现这些部件全都在协同工作。