图 102感官馆

QR 二维码:遮挡后如何读取

用手遮住 QR 码的 30%,手机仍能读取。遮住一个角,却读不出来。

QR 二维码:遮挡后如何读取
正在加载模型

这台设备无法显示 3D 模型。下面的讲解步骤可以直接阅读文字。

1 / 20 手下的 30%这是你的文字生成的 H 级、版本 9 的 QR 码:53 x 53 个模块。模型手从上方滑过。观察读数与右侧手机:手遮住约 30% 的模块时,码仍能读取。

拖动可旋转,滚轮或双指缩放。

更新于 资料核对于
广告

用手遮住也能读取的码

把手机对准 QR 二维码,片刻就能读出内容,即使贴纸脱落、边角折皱,或被拇指挡住也一样。对麦片盒上的条形码这样做,收银机就会发出提示音。区别不在相机。QR 码带有额外的码字,让读取器重建看不到的部分,还带有三个标记,让读取器在开始解码之前,就能从任何角度找到它。

展台打开时,你输入的文字或本页地址会被编码成 H 级、版本 9 的 QR 码:一个由 53 × 53 个模块组成的正方形,放在展厅的桌上。一只人体模型的手从边缘滑过,遮住 53 列中的 16 列后停下。这是 2,809 个模块中的 848 个,占码图的 30.2%。读数仍显示「可读取」,右侧手机仍能找到码并显示你的文字。此时,码图的 8 个纠错块都到了极限:每块有 12 个错误码字,而这种大小的块最多只能纠正 12 个。把遮挡再加宽一列,到 32.1%,就无法读取了。

接着撕掉一个角。撕去的三角形只占码图的 3.2%,远小于手遮住的面积,却完全无法读取。下文会用展台所用的数字解释这两种现象。这些数字来自 QR 码国际标准 ISO/IEC 18004 的规则,以及在 1994 年开发 QR 码的 DENSO WAVE 公司公开的设计资料。

桌上的码图不是一张 QR 码图片。页面把输入框里的文字逐个模块编码,采用与打印机驱动程序相同的 Reed-Solomon 运算,再由遵循标准参考步骤的解码器读回。你可以将干净的码图保存为图片,用自己的手机读取。编码器经过两个独立读取器及另一个编码器的核对:在 160 种版本与等级组合中,矩阵的每个模块都完全一致。

如何操作展台

在展台底部输入框中输入,码图会随输入即时重建。左上角读数先显示结果(「可读取」,或「无法读取」及原因),再显示版本与尺寸、纠错等级、掩模及其罚分、模式与文字所需的比特数、码字、遮挡量以及当前错误码字数。下方的小条代表纠错块:错误码字数越接近可纠正上限,小条就越满,超过上限便变红。

右侧手机屏幕展示相机如何处理图像:红线向下扫描,绿色标记指出条纹比例符合 1:1:3:1:1 的各行,圆圈显示是否找到了三个定位图案。下方显示读出的文字,或放弃读取的原因。

控件中的「最低版本」设置使用的最小版本(文字装不下时,编码器会增大码图);「纠错等级」选择 L、M、Q 或 H;「掩模」强制使用八种掩模中的一种,而不采用罚分最少的那种。「遮挡宽度」和「遮挡位置」移动手,「遮挡物」把手换成纸条或黑胶带。「按功能分层」按模块的作用将其抬到不同层;「按功能着色」只着色、不抬起。「放置顺序」画出比特的放置路径,并按块为码字着色。「显示掩模」标出掩模翻转的模块。「旋转」转动桌上的码图。「对照」把 EAN-13 条形码或 Micro QR 码放在画架上,或把版本 1 到 40 挂在墙上。「空白区」可移除白色边缘。

「涂画」让你拖动鼠标,用墨水、涂改液、孔洞或橡皮擦修改码图。「撕掉一角」和「油污」可以快速损坏它。「当前时间」把当前时间填入码图,每秒重绘。点击任意模块,可查看其行列、功能;若为数据模块,还能查看所属的块、码字与比特。某些模块和桌上物件会打开隐藏卡片。

控件下方有文字的比特表示、每块码字的十六进制表示、当前版本四个等级的表格、并排展示的八种掩模、版本表、12 项任务、46 个案例、以「实际上」开头的卡片、收藏,以及相关展品链接。

三个正方形如何帮助相机定位

读取二维码最难的部分不是数据,而是在充满其他物体的相机画面中找到码,判断它的朝向,以及每个模块有多大。条形码容易找到:激光或一行像素只需横穿它。矩阵码则必须在二维平面中定位。

DENSO WAVE 的办法是在角上放三个正方形,标准称之为定位图案。每个图案有 7 × 7 个模块:一个深色环、一个浅色环,以及 3 × 3 的深色中心。从任意方向穿过中心的直线,都会依次经过深、浅、深、浅、深,宽度为 1、1、3、1、1。码图旋转、缩放或斜着观察时,这一比例都不变,因此读取器可以逐行扫描像素,记录最近五段深浅区域,检验是否匹配。

为什么用这个比例?据 DENSO WAVE 介绍,开发者将传单、杂志和纸箱上印的图画与文字化为黑白图案,统计各种比例出现的次数。印刷品中最少见的是 1:1:3:1:1。在 DENSO 于 2024 年发布的访谈中,项目负责人 Masahiro Hara 说,找到它用了约六个月,他们逐页拍摄报纸与杂志,让测量软件整夜运行。

展台上的手机对看到的像素执行同样的操作。它逐行移动,数出连续色段,并接受各段宽度与 1:1:3:1:1 的偏差不超过半个模块的五段组合。每次命中后,它都沿中间色段的中心竖直检查同一比例。相符的命中成为候选中心。随后需要找到三个中心,其中与另外两个形成直角的中心就是左上角。这个角度也告诉读取器码图转了多少。用「旋转」转动码图,观察圆圈跟随各角移动。

数据中的某片区域也可能偶然形成同样的条纹。读取器会排除这些误报,因为它们所暗示的网格无法吻合。展台只有在检测结果落到真正的定位图案上时,才算找到一个。

分隔符、边缘与深色桌面

只有外侧深色环两边都是浅色时,1:1:3:1:1 检验才成立。码图内部由分隔符保证这一点:每个定位图案周围都有一圈宽一个模块的浅色环。码图外部则由空白区负责,标准要求四周都保留四个模块宽的浅色边缘。

展台上的码图印在一张边缘恰好宽四个模块的纸上。下方桌面是深色板岩。关闭「空白区」,纸的边缘就会消失,每个定位图案的外侧深色环会直接连到深色桌面。此时穿过定位图案的一行,读起来是一长段深色,接着是浅、深、浅、深:第一段有很多个模块宽,比例检验失败。手机找不到定位图案,读数显示「无法读取,缺少定位图案」。数据本身没有任何变化。

DENSO WAVE 的打印指南把边缘计入标签尺寸。其示例是 M 级的 50 个字母数字字符,需要版本 3(29 个模块;M 级版本 2 只能容纳 38 个)。用 400 dpi 打印机、每模块 4 个打印点,模块大小为 0.254 mm,码图为 7.366 mm,加上共 8 个模块的边缘后,标签区域是边长 9.398 mm 的正方形。只有一个定位图案的 Micro QR 码需要两个模块宽的边缘,而不是四个。

印在码里的尺子

每个 QR 码的第 6 行和第 6 列从一个定位图案延伸到另一个,深浅交替。这些叫作定时图案。它们告诉读取器各行各列在哪里,这在印刷图案被拉伸、纸张起伏或相机斜着拍摄时很重要。知道定位图案位置的读取器可以估算模块尺寸,但数出交替模块,才能得到定位图案之间准确的模块数。

模块数也能确定版本。版本 V 每边有 17 + 4V 个模块,因此版本 1 是 21 × 21,版本 40 是 177 × 177。展台上,码图始终占满纸上同样的 30 cm 宽度,所以版本越大,模块越小:版本 9 为 5.7 mm,版本 40 为 1.7 mm。

定时图案位于码图内部,也会占用本可存放数据的模块。在版本 1 中,功能图案(定位图案、分隔符、定时图案、格式信息与深色模块)之外,还剩 208 个模块存放码字:26 个码字,每个 8 比特。

为弯曲纸张设置的靶标

1994 年最早的 QR 码,如今称为 Model 1,没有其他辅助标记。DENSO WAVE 说,Model 1 最大为版本 14,即 73 × 73 个模块,可存 1,167 位数字。如今使用的 QR 码 Model 2 增加了校正图案,使印在曲面上或以很大倾角拍摄的码仍可读取。它还把范围扩展到版本 40,可存 7,089 位数字。

校正图案是一个 5 × 5 的小靶标:深色环、浅色环和中心深色模块。版本 1 没有校正图案。版本 2 到 6 有一个,靠近右下角;版本 7 到 13 有六个;数量逐渐增加,在版本 35 到 40 中达到 46 个。它们的中心位于标准所列的行列网格上;行列使用相同的位置,三个会与定位图案重叠的位置被省略。展台根据版本计算这些位置:版本 9 为 6、26、46,得到 3 x 3 = 9 个位置,减去 3 个,剩下 6 个图案。

找到三个定位图案的读取器已知道码图的三个角。第四个角没有标记,所以读取器先估计它,再寻找最近的校正图案来修正估计。有了第四个点,就能消除倾斜照片的透视变形。在大型码图上,多个校正图案能让读取器跟踪鼓起的纸面。

说明其余部分如何读取的十五比特

读取任何数据之前,读取器必须知道两件事:纠错等级,以及八种掩模中用了哪一种。它们占 5 比特:等级占 2 比特(L 为 01,M 为 00,Q 为 11,H 为 10),掩模编号占 3 比特。

这 5 比特受到的保护远强于数据。它们通过 BCH 码扩展为 15 比特;这类纠错码由 Bose 和 Ray-Chaudhuri 于 1960 年发现,Hocquenghem 于 1959 年独立发现。10 个校验比特,是将那 5 比特左移 10 位,再除以多项式 x^10 + x^8 + x^5 + x^4 + x^2 + x + 1 所得的余数。32 个可能的 15 比特码字中,任意两个至少相差 7 比特,因此即使有 3 比特出错,读取器仍能选出最接近的那个。

接着将这 15 比特与固定图案 101010000010010 异或。没有这一步,M 级配掩模 0 就会成为 15 个浅色模块,读取器无法分辨格式信息和空白纸张。

格式信息写两遍:一份围绕左上定位图案,另一份分布在另外两个定位图案旁,右上旁边有 8 比特,左下旁边有 7 比特。遮挡藏住一份时,另一份仍可使用。点击展台上的格式模块会打开隐藏卡片;撕掉左上角后只剩一份,但这时定位图案也已丢失。

左下那份旁边有一个在所有 QR 码中都为深色的模块:深色模块,位于第 4V + 9 行、第 8 列。它属于格式区域,不携带信息。

版本 1 到 40

小码图不必声明版本:读取器数模块即可。大码图中,模块尺寸估计的一点误差就可能导致计数错误,因此从版本 7 起会明确写出版本。6 比特的版本号通过另一个 BCH 码扩展成 18 比特,生成多项式为 x^12 + x^11 + x^10 + x^9 + x^8 + x^5 + x^2 + 1,写入两处:右上定位图案旁的 6 × 3 区块,以及左下旁的 3 × 6 区块。版本 7 写成 000111110010010100,版本 40 写成 101000110001101001。这里也能纠正 3 个错误比特。

一个版本能装多少内容,取决于等级和字符类型。DENSO WAVE 的表格给出,L 级版本 1 可容纳 41 位数字、25 个字母数字字符、17 字节或 10 个汉字;H 级版本 1 则为 17 位数字、10 个字母数字字符、7 字节或 4 个汉字。另一端,L 级版本 40 可容纳 7,089 位数字、4,296 个字母数字字符、2,953 字节或 1,817 个汉字。本页编码器能复现这些数字,实验室中的表格给出当前等级下每个版本的容量,以及按你输入的模块尺寸计算的打印宽度。

DENSO WAVE 建议不要要求手机读取过多内容:它给出约 271 字节,即 L 级版本 10,作为手机相机的实际参考值,具体取决于机型。用「对照」把各版本挂到墙上,就能看出原因。采用桌上相同的模块尺寸,版本 40 的宽度超过一米。

从文字到比特

输入的文字并不是以字母形式进入码图,而是成为由若干数据段构成的比特流,每段都以 4 比特模式指示符开头。

数字模式(0001)每三位数字打包成 10 比特,因为 1,000 种组合能装进 1,024 种取值。末尾剩两位数字用 7 比特,一位用 4 比特。字母数字模式(0010)涵盖 45 个字符:数字、大写字母、空格,以及 $ % * + - . / :。它用 45 x 第一字符 + 第二字符,把两个字符打包成 11 比特,因为 45 x 45 = 2,025 能装进 2,048 种取值;末尾单个字符用 6 比特。字节模式(0100)每字节用 8 比特。汉字模式(1000)把一个双字节 Shift JIS 字符压缩成 13 比特,因此 QR 码从一开始就能紧凑地存储日文。

模式指示符之后是字符计数。其长度取决于模式和版本:版本 1 到 9 中,数字模式为 10 比特,字母数字为 9,字节为 8,汉字为 8;更大的版本使用更长的计数。随后才是字符。最后,编码器加入最多 4 个零比特作为终止符,再补零到下一个字节边界,接着交替加入填充字节 11101100 和 00010001(236 和 17),直至填满数据容量。

标准给出一个演算示例:版本 1、M 级的八位数字 01234567。模式为 0001,计数为 0000001000(八),随后 012 为 0000001100,345 为 0101011001,67 为 1000011。加上终止符和填充后,16 个数据码字用十六进制表示为 10 20 0C 56 61 80 EC 11 EC 11 EC 11 EC 11 EC 11。本页编码器产生完全相同的字节,以及标准随后列出的纠错码字。

字节模式本身不说明字节使用哪种字符集。2006 年及之后的标准版本默认使用 ISO 8859-1;2000 年首版使用日文 8 比特字符集。其他文字可以加入带编号 26 的 ECI 头(扩展信道解释,模式 0111),表示 UTF-8。只要文字中有普通 ASCII 以外的内容,展台就会加入它,因此韩文或表情符号可以完整传递。输入日文假名时,编码器则改用汉字模式,每字符 13 比特,而不是 UTF-8 的 24 比特。

实验室会把你的文字拆成这些数据段,并显示各段比特数。全大写的 URL 可以使用字母数字模式,节约近三分之一的比特,这也是部分印刷码使用大写地址的原因之一。

广告

QR 码中的 Reed-Solomon 码

数据码字之后是 Reed-Solomon 码生成的纠错码字。Irving Reed 和 Gustave Solomon 于 1960 年用五页论文描述了这种码。DENSO WAVE 将其描述为音乐 CD 所用的数学方法,最初为应对与卫星和行星探测器通信中的噪声而开发,按字节纠错,适合成片突发的错误。

运算发生在有 256 个元素的有限域中,每个元素对应一种字节值。两个字节相加就是异或。相乘则使用由多项式 x^8 + x^4 + x^3 + x^2 + 1 构成的表,这是标准为 QR 码规定的多项式。将一块数据码字视为多项式的系数,乘以 x^n,再除以具有 n 个根,即 1、a、a^2 直到 a^(n-1) 的生成多项式。余数给出 n 个纠错码字。这样,整个块(数据加余数)就是生成多项式的倍数,因此代入这 n 个根时,值均为零。

读取器在这些根处求接收块的值。如果每个称为伴随式的结果都为零,块就是干净的;否则,伴随式包含足够的信息,可以找出最多 n/2 个错误码字及其正确值。本页解码器采用编码理论中的三个标准步骤:Berlekamp-Massey 算法寻找最短的错误定位多项式(Massey,1969),Chien 搜索逐个尝试所有位置以求其根(Chien,1964),Forney 公式给出每个错误的大小(Forney,1965)。

还有一条规则。在最小的码图中,如果解码器用满 n/2 的纠错能力,就会过于频繁地落到错误但合法的块上。因此,标准保留一些码字作为误解码保护:版本 1 在 L 级保留 3 个,M 级 2 个,Q 级 1 个,H 级 1 个;版本 2-L 保留 2 个,版本 3-L 保留 1 个。此时每块能纠正 (n - p)/2 个码字,p 为保留数。版本 1-L 有 7 个纠错码字,却只能纠正 2 个,而不是 3 个。实验室在每块可纠正数旁列出 p。

码字中无论是一个比特出错,还是八个全部出错,都算一个错误码字。因此 Reed-Solomon 码适合处理污渍和撕裂:遮住一片模块的损坏会毁掉少数完整码字,而不是许多分散的比特。

分块与交织

除最小的几个版本外,码字会分成多个块,每块都有自己的纠错码字。H 级版本 9 有 292 个码字,分成 8 块。四块各有 12 个数据码字,四块各有 13 个,每块再配 24 个纠错码字,合计 100 个数据码字和 192 个纠错码字。每块能纠正 12 个错误码字,因此整个码图能纠正 292 个码字中的 96 个。

这些块并非依次放置。先放每块的第一个数据码字,再放每块的第二个,以此类推,随后以同样方式放纠错码字。打开「放置顺序」,颜色就能显示这一点:纸上相邻的码字属于不同块。因此,几个码字大小的污渍只会让若干块各损失一两个码字,而不会让一个块承担全部损坏。

开场的手展示的正是这一点。手下的 16 列改变 96 个码字,8 个块中每块各 12 个。交织将损坏分配得如此均匀,以至于 8 个块同时达到上限。再加一列,每块都会新增错误码字,于是一起失败。

涂一团墨水,观察读数下的条形:通常几个块都会略有增加。「让一块超限」任务要求恰好让一个块失败,其他块仍完好;这比听起来更需要仔细操作,因为交织会与你作对。

码字的放置

数据码字和纠错码字交织后,其比特沿固定路径填入码图。从右下角开始,沿一对列向上,先右模块,再左模块,再上一行。到顶部后转向,沿下一对列向下,如此横贯码图。所有功能图案都被跳过,第 6 列的竖直定时图案整列跳过,以保持列对的节奏。

这条路径解释了展台上能看到的一些现象。最初四个比特,也就是模式指示符,总在右下角。大多数码字占据 2 × 4 个模块,但路径在顶部、底部折返,或绕过校正图案时,码字会弯成其他形状。点击右下角附近的模块,卡片会说明它属于模式指示符。

码字不能恰好填满数据区域时,剩下的模块称为剩余比特:版本 2 到 6 有 7 个,版本 14 到 20 及 28 到 34 有 3 个,版本 21 到 27 有 4 个,其他版本没有。加掩模前它们为浅色,读取器会忽略它们。

掩模与罚分

直接按路径放置的码图可能有大片深色、长串同色,或偶然出现类似定位图案的数据区域。这些都会增加读取难度。因此编码器使用掩模:对于行 i、列 j 满足某个规则的所有数据模块,翻转其深浅。八条规则从棋盘格的 (i + j) mod 2 = 0,到 ((i + j) mod 2 + (i j) mod 3) mod 2 = 0。功能图案从不加掩模。

编码器尝试全部八种,再按标准的四类罚分为结果评分。同一行或列中连续 5 个及以上同色模块扣 3 分,超过 5 后每多一个再扣 1 分。每个 2 × 2 同色块扣 3 分。每个类似定位图案的图案,即一侧带 4 个浅色模块的 1011101,扣 40 分。深色模块占比每偏离一半 5%,扣 10 分。罚分最少的掩模胜出,其编号写入格式信息。

实验室并排画出你的码图的八种结果及其分数。用「掩模」控件选另一种,码仍能读取,因为读取器从格式信息中取得掩模编号。这也解释了为什么两个生成器能根据同一文字产生不同外观的码,却都正确。DENSO WAVE 的 FAQ 也指出,数据相同,图案仍可能因模式及其他选择而不同。

「显示掩模」将当前掩模翻转的所有模块标成橙色。与实验室中的规则对照:它就是同一规则应用于整个数据区域的结果。

30% 究竟指什么

DENSO WAVE 给出的四个等级,分别可恢复约 7%、15%、25% 和 30% 的码字,并指出 M 级最常见。这句话里有两个重要的词:约,以及码字。

说「约」,是因为比例随版本变化。把所有块合计可纠正的码字数除以码字总数,在版本 1 到 40 中,L 级为 7.7% 到 10.5%,M 级为 15.4% 到 19.2%,Q 级为 23.1% 到 28.0%,H 级为 30.8% 到 33.2%。实验室表格给出展台当前版本的准确数值。

说「码字」,是因为遮挡按面积衡量,面积与码字并非简单对应。遮住一个码字的边缘,与遮住它全部,同样会毁掉它。落在浅色模块上的遮挡不会改变任何东西,因为手或纸条会被读成浅色:展台上,手遮住 30.2% 的模块,实际只改变约 16%。遮住功能图案不消耗码字,却可能使定位图案、定时图案或格式信息丢失。

因此,准确的说法是:在 H 级下,如果遮挡横跨数据区域,并让各块均匀分担损坏,就像手遮住的 16 列那样,码图可能承受约 30% 的面积遮挡。相同面积如果横跨行而不是列,即 16 行、30.2%,版本 9 就无法读取。放错位置的 3.2% 遮挡就能让它失效。「不到 10% 就使其失效」任务让你找出这个位置。

DENSO WAVE 从实际用途解释等级选择:易弄脏码图的工厂选 Q 或 H,干净且数据量大的环境选 L。对于东京线路的站台门系统,列车门上的码要承受日晒雨淋,DENSO 说它开发了特殊的 tQR 码,可容忍 50% 的损坏。

手机如何找到并读取码

标准描述了参考解码算法,真实读取器即使细节不同,也遵循这一顺序。实验室的测验要求你将步骤排列好。

首先将图像转为黑白。真实读取器为图像各部分分别选择阈值,因为亮面罐体上或台灯下的码受光并不均匀。接着按上文的 1:1:3:1:1 扫描寻找定位图案。读取器根据三个中心估算模块大小和朝向,再根据定位图案间距估算版本。版本 7 及以上还会读取版本信息确认。随后在预计的第四角附近寻找校正图案,拟合透视变换,将网格中的每个模块映射到图像上。

接着采样每个模块的中心,读取格式信息。在 32 个合法格式码字中,取与读取结果最接近的一个,必要时尝试两份副本。由此得到等级和掩模。再翻转相同模块,移除掩模;沿放置路径收集码字;重新分块;逐块纠错;最后解析比特流:模式、计数、字符,直到遇到终止符或数据用尽。

展台简化了其中两步。手机在真实像素上搜索定位图案,图像随「旋转」控件转动,可保留或去掉边缘,但不会弯曲或倾斜;读取器随后在已知位置采样网格,而不是拟合透视。遮挡则按浅色处理:手读作白纸,黑胶带读作深色。真实相机会看到手的阴影和皮肤纹理,表现可能更好,也可能更差。

DENSO WAVE 还给出一个与码本身无关的实际限制:颜色。其扫描器用红光照射,白纸上的红色码与纸反射同样多的红光,就会消失。因此建议黑码白底。

条形码、Micro QR 与 rMQR

QR 码最初想改进的是零售条形码:北美使用 UPC,其他地区使用 EAN-13。Norman Woodland 和 Bernard Silver 于 1949 年申请首项光学读取码专利,1952 年 10 月 7 日获批。据 European Patent Office 介绍,首次收银台 UPC 扫描发生在 1974 年俄亥俄州一家超市,商品是一包口香糖,这种条形码最多能装约 20 个字符。

EAN-13 条形码宽 95 个模块:两端各有 3 个模块的护栏图案,中间为 5 个,另外 12 位数字每位占 7 个模块。第十三位数字不直接印成条纹,而是编码在左侧数字的两类图案选择中。最后一位是校验位:各位数字交替乘以 1 和 3,校验位使总和成为 10 的倍数。这能检测多数错误,却不能纠正。用「对照」把条形码放上画架,遮住上半部仍可读取,因为扫描器只需一条横穿所有条纹的完整清晰扫描线。遮住一条竖向区域就无法读取。

2004 年 11 月获批为 JIS 标准的 Micro QR 走向相反方向。它去掉两个定位图案,只留一个,边缘宽两个模块,共四种尺寸:M1 为 11 × 11 个模块,容纳 5 位数字;M4 为 17 × 17,最多容纳 35 位。它只有四种掩模,格式信息携带的是 3 比特码图编号而非等级,M1 和 M3 的最后一个数据码字仅有 4 比特。文字装得下时,画架会显示你的文字的 Micro QR 版本,模块大小与桌上码图相同。即使 M4,容量也小于完整 QR 码的版本 1。

2022 年 5 月,ISO 发布了用于狭长标签的矩形 Micro QR 码 rMQR。DENSO WAVE 将其描述为采用一个半定位图案,最小 7 × 43 个模块,在 17 × 139 个模块中最多容纳 361 位数字。DENSO WAVE 还发布了允许矩形码图的更大系列 iQR、留有图片空位的 Frame QR,以及限制部分数据读取权限的 SQRC。研究者走得更远:Chu 及同事于 2013 年展示了如何把图像细节放入各模块,借助纠错,做出看似半色调图片却仍可读取的码。

模型与真实码及读取器的差异

编码器完整涵盖标准所称的 Model 2,支持数字、字母数字、字节和 ECI 数据段,版本 1 到 40,全部四个等级及八种掩模。每段文字只用一个数据段,不像精细的编码器那样混合模式以节约比特。汉字模式仅限假名,因为完整 Shift JIS 表很大;对支持的这些字符,比特与完整编码器相同。最多把一条消息分散到 16 个码图的结构链接功能未实现。

展台读取器在已知位置读取网格。它按定位图案剩余模块数检查图案,并像多数手机读取器一样要求三个齐全。它严格按标准解码格式和版本信息,移除掩模,对每块进行包含误解码保护的 Reed-Solomon 解码,再解析比特流。真实读取器还必须应对模糊、眩光、透视,以及印刷时深色模块向浅色扩散;展台没有这些问题。

手机的定位搜索针对像素运行,并随码图转动,但图像干净平整。涂画和油污工具都以完整模块为单位做标记。为便于观察,桌上码图始终宽 30 cm;真实码通常只有几厘米。

读数全部来自桌上的码图。核对时使用的两个独立读取器(一个 JavaScript 开源库和另一个 C++ 库)读取了版本 1 到 10 在各等级、各掩模下的全部 320 个测试码图、版本 11 到 40 的全部 120 个码图、全部八种尺寸与等级组合的 Micro QR 码,以及 EAN-13 条形码。

简史

当时还是 DENSO 部门的 DENSO WAVE 于 1992 年开始开发 QR 码。汽车工厂正转向多车型小批量生产,每件产品出货时约附有 10 个条形码;标签沾油后无法读取。DENSO 说开发团队只有两个人,开发用了约一年半。该码于 1994 年公布,据 DENSO WAVE 介绍,可容纳约 7,000 位数字、编码汉字,读取速度比其他码快 10 倍以上。European Patent Office 在 2014 年将 European Inventor Award 的 Popular Prize 颁给团队时,给出的速度约为早期矩阵码的 20 倍。

名称来自 quick response(快速响应),但 DENSO WAVE 说正式名称是 QR Code,而非首字母缩写。日本专利于 1994 年 3 月 14 日申请,以 2938338 号获批;对应美国专利 5,726,435 列出的发明人为 Masahiro Hara、Motoaki Watabe、Tadao Nojiri、Takayuki Nagaya 和 Yuji Uchiyama。DENSO WAVE 保留专利,但表示对标准化 QR 码不行使专利权,并称从一开始就采取这项政策。QR Code 是 DENSO WAVE 对文字注册的商标,不是对图案的注册商标。

汽车行业最先采用该码,用于电子看板,即调取零部件的卡片。BSE 等食品安全事件后,食品、药品和隐形眼镜制造商用它追溯产品。标准随后出现:1997 年 10 月 AIM International,1998 年 3 月 JEIDA-55,1999 年 1 月 JIS X 0510,2000 年 6 月 ISO/IEC 18004。现行第四版于 2024 年 8 月发布。

能读取 QR 码的手机于 2002 年在日本上市,把码带出工厂。2011 年 12 月,零售条形码背后的组织 GS1 批准其用于手机。EMVCo 于 2017 年 7 月发布 QR 支付规范;新加坡于 2018 年 9 月 17 日将 27 种支付方案合并为一个 SGQR 标签;巴西于 2020 年 11 月 16 日以 734 家机构启动 Pix。COVID-19 期间,韩国从 2020 年 6 月 10 日起用 QR 码记录入场,英格兰和威尔士从 2020 年 9 月 24 日起在场所门口张贴 NHS QR 海报,欧盟数字新冠证书则从 2021 年 7 月 1 日至 2023 年 6 月 30 日使用带数字签名的 QR 码。零售商目前计划让收银台在 2027 年底前读取二维码。

常见问题

QR 码真的能在遮住 30% 时读取吗?

H 级可以,条件是遮挡横跨数据区域,损坏分散到各块。展台上,手遮住 30.2% 的模块,码仍能读取;再多一列,达到 32.1%,就不行。同样面积若遮住 16 行而非 16 列,版本 9 就无法读取。遮住定位图案会使任何码停止读取。

L、M、Q、H 等级是什么意思?

它们是四个纠错等级。DENSO WAVE 给出的恢复比例约为码字的 7%、15%、25%、30%。等级越高,需要的纠错码字越多,同样文字会生成更大的码图。DENSO WAVE 说最常选用的是 M 级。

为什么是三个正方形而非四个?

三个点足以确定正方形的位置、尺寸与朝向,直角处的角告诉读取器哪一边向上。第四个相同标记会让两个朝向看起来一样。Model 2 在第四角附近增加较小的校正图案来修正透视。

右下角附近的小正方形是什么?

是校正图案。版本 2 到 6 有一个,更大版本有更多,版本 35 到 40 最多有 46 个。读取器用它们跟踪印在曲面上或斜着拍摄的码。

为什么 QR 码需要白色边框?

定位图案通过深、浅、深、浅、深的条纹识别,比例为 1:1:3:1:1。若码紧贴深色边缘印刷,外侧深色环就会与边缘融合,条纹消失。标准要求四个模块宽的边缘。关闭展台的空白区,就能看到手机读取失败。

QR 码能装多少内容?

L 级版本 40 可装 7,089 位数字、4,296 个字母数字字符、2,953 字节或 1,817 个汉字。对于手机相机,DENSO WAVE 建议按约 271 字节,即 L 级版本 10 规划。

QR 码能装韩文或中文吗?

可以。字节模式能携带任何字符集,但读取器必须知道是哪一种。编号 26 的 ECI 头表示字节为 UTF-8,展台会为任何非普通 ASCII 文字加入它。DENSO WAVE 还描述了中文 GB2312 字符的 13 比特压缩模式,部分手机可能无法读取。

为什么两个 QR 生成器会把相同文字做成不同码?

它们可能选择不同模式,加入或省略 ECI 头,选更大版本,或选不同掩模。这些选择都合法,读取器都能读取两个码。DENSO WAVE 的 FAQ 也有同样说明。

掩模起什么作用?

它按固定的行列规则翻转数据模块,打散大片同色、长串同色以及类似定位图案的图案。编码器尝试八条规则,为结果计算罚分,再选最优。掩模编号存于格式信息,因此读取器可以撤销它。

使用 QR 码免费吗?

免费。DENSO WAVE 说,使用按 JIS 或 ISO 标准制作的 QR 码不需要许可,也不收费。它保留专利,但不对标准化码行使专利权。文字 QR Code 是注册商标,图案不是。

QR 码最小能印多小?

DENSO WAVE 给出普通激光打印机的最小模块约为 0.17 mm,使版本 1 宽约 3.57 mm,并提到特殊打印机与读取器可用 0.03 mm 模块。它也提醒,过大的码可能超出读取器视野。

能制作彩色 QR 码吗?

有时可以。读取器需要在其使用的光线中有足够对比度。许多扫描器使用红光,所以红码白底会消失;深色底浅色码也可能让预期深色模块的读取器混淆。DENSO WAVE 建议黑码白底,其他组合都需测试。

QR 码会有危险吗?

码本身只是数据。风险在于它指向哪里:贴在真码上面的码可能把你带到假支付页面。打开前先核对手机显示的地址,尤其是付款时。

什么是 Micro QR 码?

它是更小的近亲,只有一个定位图案,边缘宽两个模块,四种尺寸从 11 × 11 到 17 × 17 个模块。最多可存 35 位数字,于 2004 年 11 月成为 JIS 标准。

为什么左下定位图案旁总有一个深色模块?

标准把它固定在第 4V + 9 行、第 8 列。它位于格式区域,不携带信息,因此同一版本的每个 QR 码都在相同位置有它。

QR 码的灵感来自围棋盘吗?

这个故事常被提起。在 DENSO 自己的 2024 年访谈中,Masahiro Hara 说,定位标记的想法是在火车上看着楼房窗户时产生的;他只在解释为什么放开专利取得成效时提到围棋。网格本身只是二维码所需的结构。

术语

  • 模块:网格中的一个方格,深色或浅色。
  • 版本:码图大小,从 1(21 × 21 个模块)到 40(177 × 177)。
  • 定位图案:角上的三个 7 × 7 正方形之一,比例为 1:1:3:1:1。
  • 分隔符:每个定位图案周围宽一个模块的浅色环。
  • 定时图案:第 6 行与第 6 列上深浅交替的模块。
  • 校正图案:从版本 2 开始使用的 5 × 5 靶标,用来修正透视与曲率。
  • 空白区:码图四周宽四个模块的浅色边缘。
  • 格式信息:含纠错等级与掩模的 15 比特,受 BCH 码保护,写两遍。
  • 版本信息:从版本 7 起说明版本的 18 比特,写两遍。
  • 码字:一组 8 比特,是纠错的单位。
  • 块:拥有各自纠错码字的一组码字。
  • 纠错等级:L、M、Q 或 H,决定能恢复多少码字。
  • Reed-Solomon 码:在 256 元素有限域上运算、修复整个码字的纠错码。
  • 伴随式:接收块在生成多项式一个根处的值;全零表示未发现错误。
  • 掩模:翻转数据模块的规则,用来避免难以读取的图案。
  • 模式:字符打包为比特的方式:数字、字母数字、字节或汉字。
  • ECI:说明后续字节字符集的头;26 表示 UTF-8。
  • 填充字节:236 和 17,重复填充未使用容量。
  • 剩余比特:最后一个码字之后剩下的模块。
  • Micro QR:只有一个定位图案的较小码图,版本 M1 到 M4。

参考资料

解说文章与模拟采用 CC BY-NC-SA 4.0 许可,另有说明的除外。

广告

嵌入此展品

将这段代码粘贴到网页或博客文章中,即可在那里显示可操作的模型。

非商业用途可免费使用,请保留出处行。 解说文章与模拟采用 CC BY-NC-SA 4.0 许可,另有说明的除外。

尺寸

嵌入的展品以简体中文打开。如需其他语言,请先把本页切换到该语言,再复制代码。