Qraft

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

二维码是「二维的条形码」

超市商品上的条形码仅通过横向线条的粗细来表达信息。而二维码通过在纵横两个方向排列黑白单元格(模块),可以存储远多于条形码的信息。这就是它被称为「二维码」的原因。

黑色模块代表「1」,白色模块代表「0」,这些 0 和 1 的排列就是数据。由于计算机处理的所有数据都可以用 0 和 1 表示,因此可以存储 URL、文本、电话号码等各种信息。

三个大方块是定位标记

二维码三个角上的大方块被称为「定位图案」,是扫描器最先寻找的标记。通过找到这三个方块,扫描器可以瞬间确定二维码的位置、大小和倾斜角度。

由于只有三个角有方块,剩余的一个角(右下)的位置也可以推算出来,因此无论二维码以什么方向呈现都能正确读取。即使从斜角扫描也能读取,就是得益于这一机制。

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

二维码除了数据本身外,还包含称为「纠错码」的修复用数据。这使得即使二维码部分被污损或破坏,也能通过数学方法恢复丢失的数据。

纠错强度有 4 个等级(L、M、Q、H)可选,最强的 H 等级即使整体约 30% 损坏也能读取。中央叠加 Logo 的二维码能够读取,也是得益于这一纠错功能。

从扫描到显示的流程

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

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

这一系列处理在零点几秒内完成,因此感觉扫描的瞬间页面就打开了。