跳到主要内容
AZ Tools

为什么你的二维码在有些手机上扫不出来

二维码不是你那条链接的照片。它是一张黑白格子,带着固定的骨架——角上的定位标记、定时线、设置信息的副本,以及散布在剩余位置上的数据——扫描器必须先找到这副骨架,才谈得上读出一个比特。凡是在一个地方能扫、换个地方就不行的码,几乎都是丢了骨架的一部分,或者丢了骨架所需要的条件。

扫描器最先找的东西

四个角里有三个各有一个大方块。它们的存在就是为了从任何角度都能被找到:无论你怎样画一条穿过它的直线,沿线的黑白比例都相同,这让相机在解码任何内容之前就先定出码的位置和方向。分布在其他位置的小校正方块,则用来修正瓶身的弧度或照片的倾斜。

所以损伤在不同位置的分量并不一样。划过数据区的一道划痕通常能被恢复,但盖在角上方块之上的标志,或者裁掉了一个角的码,就不是「受损的码」了——在相机看来,它压根不是码。

留白也是码的一部分

规范要求每一边都留出四个模块宽的空白作为静区,也就是四个小方块的宽度。这不是装饰。扫描器靠它判断格子在哪里结束,而紧贴边框、照片或一行文字的码,没有可靠的边界可找。

在印刷品里,这是最常见的失败,而且远远领先,因为设计师很自然地会沿着黑色像素裁切。如果把码贴在白纸上能扫、放进版面里就不行,先查这里。

纠错是一笔预算,而标志会花掉它

纠错分四个等级,在码被弄脏或遮挡时大约能恢复 7%、15%、25% 和 30%。正是这份冗余,才让标志可以放在码的正中间:被遮住的模块被当作损伤,然后重建出来。

问题在于,这份冗余本身是由多出来的模块构成的。在同样的物理尺寸下,等级越高,每个小方块就越小。于是印得小、把纠错开到最高、还压上一个标志,等于把同一笔预算花了三遍。想放标志就放小一点,把码留大一点,并且去解码成品图,而不是想当然。

明暗差、反色和反光表面

相机会把图像切分成明与暗,所以起作用的是亮度差,不是色相差。两种在眼里对比鲜明的颜色——中间调的蓝配中间调的绿——转成灰度后可能几乎一样,于是读不出来。

码也应当是浅底深块。深底白块的反色码,有的扫描器认,有的直接拒绝,这正是「我手机能扫、你手机不行」的典型成因。亮光油、烫金,以及强光下的屏幕会带来反射,抹掉格子的一部分;玻璃后面的码则常常只在某些角度失败。

尺寸、距离,以及印刷能承受的极限

规划时好用的经验法则是:码的边长约为扫描距离的十分之一。要在两米外扫的码,边长最好有二十厘米左右。按名片尺寸做出来的海报二维码,就是一张没人扫得动的海报。

印刷同时定下了下限。油墨在纸上会略微扩散,当单个模块小到零点三毫米上下,相邻的黑方块就开始粘连,相机再好,格子也不再是格子。刺绣、雕刻等任何有最小成形尺寸的工艺,同理。

放进去的内容决定了它有多密

数据量决定版本,版本决定每边有多少模块:最小的 21,最大的 177。带跟踪参数的长链接,会让码比短链接密上好几个版本,于是必须印得更大才读得出来。

编码方式也有影响。数字打包得最紧,大写字母和少数几个符号有自己的紧凑模式,其余一律退回按字节存。所以同一条链接,写成大写就能装进一个明显更简单的码里——印刷品上的网址有时全是大写,原因就在这儿。

要测的是你真正要发出去的那一版

去解码最终成品,而不是你生成的那个文件:问题通常是后来才混进去的——一次裁切、一次改色、一次把边缘弄糊的缩放,或者一次压缩。把码读回来,能同时确认它还能解码,以及它指向的确实是你以为的地方。

然后按它将来被使用的方式去测:按最终尺寸印出来,用别人的手机,在真实场地的距离和光线下扫。如果码指向的是短链接,别忘了纸的寿命会比跳转服务更长;一个改不了的码,等于承诺让那个网址一直活着。

相关工具