← 返回文章
技术笔记

二维码的三个大方块,不是装饰

2026-09-11 · M 写

拿起一张二维码,先别扫。把中间密密的黑白小格暂时看成噪声,最先跳出来的是三个角上的大方块。它们长得几乎一样,偏偏右下角少一个。这个不对称不是装饰上的留白,而是二维码能被迅速找到和辨认方向的关键。

二维码里的最小黑白方格叫“模块”。角上的大方块也由模块组成:黑色外框、白色内框、黑色中心层层套在一起。若让一条直线穿过方块中心,会依次经过黑、白、黑、白、黑五段,宽度比例是 1:1:3:1:1。扫描器寻找的并非“像方框的图案”这么含糊,而是这种可以计量的明暗节奏。

这个比例的来历很朴素。二维码开发方 DENSO WAVE 的历史资料记载,团队担心表格、文字或图案被误认成定位标记,于是把传单、杂志、纸箱等印刷物转成黑白区域,调查其中不常出现的比例,最后选中了 1:1:3:1:1。设计的目标不是让标记显得特别,而是让它在杂乱背景里少遇到冒牌货。

三个定位标记一旦被找到,就给出三个彼此分开的参照点。机器据此可以判断二维码在画面里的位置、尺度和朝向。手机歪着拿,二维码旋转了九十度,或者拍摄角度略有倾斜,识别程序仍有机会先确定“这是一块码,边界大致在这里”,然后再处理里面的数据模块。

这也解释了右下角为什么不能照样补一个大方块。三个相同标记形成的排列已经是不对称的:其中一个角同时邻近另外两个,另外两个则分别位于两条边的末端。旋转后,这组关系仍能帮助辨认方向。若四个角完全相同,外观更整齐,方向信息反而少了一层。

不过,找到二维码不等于读出了内容。定位标记解决的是“码在哪里、朝哪边”;数据区还要解析版本、格式与实际编码。尺寸也并非永远相同:官方资料列出的二维码从版本 1 到版本 40,边长由 21 个模块增加到 177 个模块,每升一个版本,每边增加 4 个模块。码里内容越多,通常需要更多模块来容纳。

另一项常被混在一起的是纠错。二维码可以加入基于 Reed-Solomon 码的冗余数据,在部分模块污损时恢复内容;纠错等级越高,能用于冗余的数据越多,同样内容所需的码也可能更大。它并不意味着角上的定位标记可以随意遮盖。入口都难以可靠找到时,后面的恢复能力没有稳定的起点。

因此,给二维码加头像、文字或花纹时,“还能被某一部手机扫出”不是充分的检验。图案可能侵入定位区域,缩放也可能把方格边缘弄得模糊。某次识别成功,只说明那次距离、光线、镜头和算法容忍了改动,不能替代在实际尺寸和不同设备上的检查。

我喜欢这个设计的一点,是它把顺序写在了表面上。二维码先用少量、醒目而罕见的结构回答“我在哪里”,再把大量细小模块交给后续解析。对读者而言,三个方块几乎没有内容;对机器而言,它们先建立了阅读内容所需的坐标。

这是一种值得借用的安排:面对一团高密度信息,最先需要的未必是塞入更多内容,而是提供几个稳定的参照点。参照点本身不替人完成理解,却能减少误认,并告诉阅读从哪里开始。

参考:DENSO WAVE:二维码开发史二维码的版本与模块数二维码纠错机制

—— M-C