Qraft

二维码的工作原理 - 黑白方块如何传递信息

二维码是「二维的条形码

超市商品上的条形码,只靠横向线条的粗细与间隔来表达信息,纵向无论拉得多高,承载的内容都不会增加。二维码则在纵横两个方向上排列黑白单元格(模块),同样的面积里可以存放约为条形码 200 倍的信息量。这正是它被称为「二维码」的原因。

差距在用途上一目了然。条形码通常只够放下十几位数字的商品编号,还要另外查数据库才知道那是什么商品;二维码可以把完整的网址或联系人信息直接写进图形本身。

黑色模块代表「1」,白色模块代表「0」,这些 0 与 1 的排列就是数据本体。由于计算机处理的一切数据最终都能用 0 和 1 表示,所以网址、文本、电话号码等信息都能装进同一种黑白方块。

三个大方块是定位标记

二维码三个角上的大方块称为「定位图案」,是扫描器最先寻找的标记。每个方块都是黑框套白框、白框再套黑心的同心结构,沿任何一条直线穿过去,黑白宽度的比例都固定为 1:1:3:1:1。这种比例在日常画面里极少出现,因此设备能从杂乱的背景中迅速把它挑出来。

找到这三个方块之后,扫描器就能瞬间掌握二维码的位置、大小与倾斜角度。三个角有标记、剩下一个角(右下)没有,这种不对称本身就是信息:设备可以由三点推算出第四个角的位置,于是二维码无论以什么方向出现都能正确读取。

把手机斜着对准也能扫上,正是得益于这一机制——设备先算出图形被拍歪了多少,再把画面「掰正」,然后才逐格读取。

即使损坏也能读取的「纠错

二维码里除了数据本身,还一并写入了称为「纠错码」的修复用数据。它不是单纯的备份,而是按数学方法算出的冗余信息,因此即使二维码被污损、刮花或缺了一角,设备也能反推出丢失的部分。

纠错强度分 4 个等级(L、M、Q、H):L 约可修复 7% 的损坏,M 约 15%,Q 约 25%,最强的 H 等级可以复原约 30% 的码字缺损。这个 30% 是相对码字而言的比例,并不表示可以遮住 30% 的面积。等级越高越耐脏,代价是同样的信息量需要更多模块,码面更密。

中央叠加 Logo 的二维码之所以还能扫出来,也是得益于这一纠错功能——被 Logo 盖住的模块相当于「损坏」,只要不超出所选等级的余量就不影响读取。

定时图案与位置的确定

要正确读取二维码,必须准确掌握数量众多的单元格分别排列在什么位置。承担这一任务的,是以连接三个大方块的方式横竖各排一列、黑白交替的点线状图案。它被称为定时图案,为读取设备提供推算单元格间隔与坐标的基准——哪怕拍摄距离各不相同,只要数一数这串交替的黑白格,就能算出一格有多宽。

此外,尺寸较大的码还会在内部加入用于定位的小方块。码印在瓶身、包装袋这类曲面上,或者从斜角拍摄时,图形会发生不均匀的弯曲变形,仅凭四角无法还原网格;这些小方块相当于散布在码内的坐标钉,让设备分区域校正,把歪斜的画面拉回方格。

黑与白表示信息的机制

二维码的每一个单元格,都只用「是黑还是白」来表示信息的最小单位。把黑视为 1、白视为 0,单元格的排列就被换算成一长串数字,再按规格规定的编码方式组装成文字或网址。某一格属于数据、纠错码还是控制信息,由规格中固定的排布顺序决定,因此设备事先不知道内容也能正确拆解。

码周围留出的空白,对读取的成立同样不可或缺。这块空白称为静区,宽度需要相当于 4 个模块,它把码与背景分隔开,告诉读取设备「从这里开始才是码」;如果紧贴着码印上文字或花纹,设备就可能把背景误当成模块,出现怎么扫都没有反应的情形。

二维码风靡世界的原因

二维码最初是在日本为提高汽车零部件管理的效率而开发的。生产线上要在短时间内读取大量零件信息,条形码的容量与速度都不够用,于是有了把数据铺展到纵横两个方向的思路。

它得以走向全世界的一大原因,是规格被公开、任何人都能自由使用。由于开发方没有主张专利权,各行各业的企业都可以不必顾虑授权成本地采用,读取软件与生成工具也随之大量出现。

加之无论从哪个方向都能快速读取的便利,与手机的普及相结合,从支付到店头的引导标识,二维码在世界各地都扎下了根。

从扫描到显示的流程

用手机扫描二维码时,内部依次进行以下处理:

  1. 相机从画面中检测定位图案,确定二维码的位置与方向
  2. 逐个读取二维码内的模块(黑白单元格),转换成 0 与 1 的数据序列
  3. 用纠错码修复读取失误与污损造成的缺失
  4. 把修复后的数据序列解码为字符串(网址或文本)
  5. 根据解码结果执行打开浏览器、保存联系人等相应动作

这一连串处理在零点几秒内就能完成,因此使用者会觉得扫到的瞬间页面就已经打开了。

读取二维码只是一瞬间的事,而这一瞬间的背后,运行着高度的图像处理与数学算法。