二维码的工作原理 - 结构与扫描原理详解
什么是二维码
二维码(Quick Response Code)是 1994 年由日本电装(现在的电装 Wave)开发的二维条码。传统的条形码只能沿横向排列数据,而二维码在纵横两个方向上都能放置信息,因此可承载的数据量达到条形码的几十倍甚至几百倍。名称中的「Quick Response」正说明了它的设计目标:以最快的速度被读出来。
今天只要把手机相机对准它,几乎瞬间就能完成解码,用途覆盖打开链接、连接 Wi-Fi、电子支付、门票验证、物流追踪等各个场景。据称全球每天的扫描次数已达数十亿次,说它是社会基础设施的一部分并不夸张。
解析二维码的结构
二维码乍看只是一堆随机的黑白点,实际上每一块区域的职责都由规格(ISO/IEC 18004、JIS X 0510)严格定义。主要构成要素如下。
数据编码方式
放进二维码的数据会根据内容自动选用最合适的编码模式。QR 码规格(ISO/IEC 18004)定义了四种编码模式,各自对应的字符种类与压缩效率都不同。
- 数字模式:只处理 0 至 9 的数字。3 位数字压缩进 10 个比特,效率最高,最多可存 7,089 个字符。适合电话号码、会员编号这类纯数字的数据。
- 英数字模式(Alphanumeric Mode):可处理 0 至 9、A 至 Z(仅大写)、空格以及 $、%、*、+、-、.、/、: 共 45 种字符。2 个字符转换为 11 个比特,最多可存 4,296 个字符。需要注意的是这一模式不能使用小写字母(a 至 z),含小写的链接会自动切换到字节模式。它适合放全大写的短网址或序列号。
- 字节模式:存放 UTF-8 等任意字节序列。链接、日文文本、邮箱地址等超出那 45 种字符范围的数据都走这一模式,最多可存 2,953 字节。
- 汉字模式:把 Shift_JIS 的汉字以每字 13 个比特高效编码,对含大量汉字与假名的数据有利,最多可存 1,817 个字符。
模式的选择由生成工具自动完成,但只要对字符种类稍加留意,就能把二维码的尺寸压得更小。例如把网址全部写成大写字母,就会套用英数字模式,比字节模式多放约 45% 的字符。
编码后的数据会变成比特串,按规则铺排成码面上的模块(黑白单元格)。数据越多,二维码的版本(尺寸)就越大,从最小的版本 1(21×21 个模块)到最大的版本 40(177×177 个模块)共分 40 级。
纠错机制
二维码最大的特色之一,是强悍的纠错能力。凭借名为里德-所罗门码的数学算法,即使码面的一部分被弄脏或撕破,仍能把原始数据复原。
规格(ISO/IEC 18004)规定了四个纠错级别。
- L(Low):可复原约 7% 的损伤
- M(Medium):可复原约 15% 的损伤
- Q(Quartile):可复原约 25% 的损伤
- H(High):可复原约 30% 的损伤
级别越高,复原能力越强,但相应地会有更多区域被冗余数据占用,能装的信息量随之减少。在中央叠放标志的设计款二维码里,标志覆盖处的数据等于读不到,所以通常会选择级别 H。
智能手机如何读取二维码
手机相机读取二维码的处理,按以下步骤进行。
- 1. 检测:从相机画面中找出定位图案(三个大方块),确定二维码的位置、尺寸和倾斜角度。
- 2. 归一化:以校正图案为基准,修正从斜侧拍摄造成的透视变形。
- 3. 采样:以定时图案为基准算出模块的网格,逐格判定是黑还是白。
- 4. 解码:从格式信息中读出纠错级别与掩码图案,解除掩码后取得数据比特串。
- 5. 纠错:用里德-所罗门码检测并纠正数据中的错误。
- 6. 解释:把解码结果转换成链接、文本、Wi-Fi 设置等格式,并执行对应的动作。
这一连串处理在极短的时间内就能走完,所以用户几乎在举起相机的同一瞬间就拿到了结果。
越了解二维码的原理,越能靠设计和摆放上的用心把读取成功率提上去。
相关文章:二维码的种类比较,欢迎一并阅读。
二维码的实用技巧
理解了原理,用起来就能更有把握。以下是在实际操作中最管用的几点。