二维码容错率怎么选:L、M、Q、H 与对比度、留白

更新于 7 分钟阅读

最常见的翻车场景是:预览里扫得好好的,印到传单、贴纸或者彩色包装盒上就没反应了。原因几乎总是那么几个设置:容错率对这种载体来说偏低;两种颜色人眼看着区别明显,相机却分不开;内容太长,每个模块印出来小到分辨不了。

容错率到底是什么

二维码把数据存成一个个字节,叫码字,然后再用里德-所罗门码算出额外的冗余码字。模块被划花、弄脏或者盖住一部分时,解码器可以靠冗余码字把丢掉的码字还原回来。四个等级就是在选加多少冗余:

等级大致可恢复适合场景
L约 7% 码字屏幕显示、干净的印刷、要装最多内容
M约 15%均衡的默认档
Q约 25%会被手摸、易脏的标签
H约 30%环境恶劣,或者码上面还要叠印东西

「大致可恢复」要按字面理解。这个百分比算的是码字,不是看得见的面积;而且角上三个大方块(定位图案)和记录格式信息的细条,被破坏一块造成的损失,比同样大小的普通数据区要大。H 级也不会让二维码在丢掉三分之一画面时照样能扫,它只是比 L 级多留了一些余量,仅此而已。

代价是容量,也就是模块变小

冗余要占地方。字节模式下,最大的 40 版(177 × 177 的网格)在 L 级最多放 2953 字节,H 级只有 1273 字节;本站工具实测了中间两档:M 级 2331,Q 级 1663。小尺寸时同样如此:1 版是 21 × 21 的网格,L 级能放 17 字节,H 级只有 7 字节,所以一段 10 字节的内容在 L 级是 1 版,到 H 级就被挤到 25 × 25 的 2 版。

网格变大对印刷很要紧,因为码的实际宽度是定死的。2 版每边 25 个模块,3 版每边 29 个,同样一块纸被切成更小的格子。模块越小,相机在远处或粗糙纸张上越难分辨。链接变长也有同样的效果:版本升高,每个模块都缩小。想腾出空间有两个办法:

  • 缩短内容。 去掉追踪参数,用短路径。省下足够的字节就能降一个版本,这往往比调颜色或者调等级都管用。
  • 按字节而不是字符数算。 UTF-8 里一个拉丁字母占 1 字节,一个汉字占 3 字节。按这个编码器的实测,984 个汉字就把 L 级装满了。纯数字则紧凑得多:同一个编码器实测 L 级能放 7089 个数字。

内容超出上限时,工具会告诉你当前字节数和所选等级的上限,并建议改用更低的等级。

怎么选等级

场景建议起点
在手机或显示器上近距离扫L 或 M
印在纸上、丝印的标签上M 或 Q
户外、包装、曲面或经常被碰的贴纸Q 或 H
内容很长、勉强装得下能装下的最低等级,再实测

网页上展示的短链接用 H 级,换来的只是更小的模块。会被磨损的东西用 L 级,余量又太小,第一道划痕就可能扫不出来。

对比度:测的是什么,测不到什么

扫码器靠明暗差异分辨深色和浅色模块,所以关键是两种颜色的亮度差,而不是色相。工具用无障碍规范里的对比度比值来测,范围是 1:1(完全相同)到 21:1(黑白)。规则是:

  • 低于 3:1:预览照常显示,但 PNG、SVG 导出和复制到剪贴板都会被拒绝。
  • 3:1 到 4.5:1 之间:给出警告,建议印刷前用真机测试。
  • 高于 4.5:1:只报告比值。

有些人喜欢的颜色比看上去糟糕得多。纯黄配白底约 1.07:1;纯红配白底约 4.0:1,能扫但余量很小;#999999 这样的中灰配白底约 2.85:1,低于门槛;黑配白是 21:1。

这个检查有两个限度值得知道。第一,它测的是亮度差,不管哪种颜色更深。很多扫码器默认「深色模块、浅色背景」,遇到反色码会失败,有的则两种都认,所以浅色模块配深色背景的二维码可以通过比值检查,在某一台手机上仍然扫不出。第二,默认颜色取自本站的主题变量,深色模式下可能变成深色背景上的浅色模块。导出之前先看一眼两个颜色分别填在哪个框里,要印刷的话,请改成浅色背景上的深色模块。

印刷还会改变对比度。亮面纸会把光反射进镜头,浅色油墨在粗糙纸张上会变淡,屏幕在低亮度下也和印出来的纸不是一回事。由两个十六进制颜色算出来的比值看不到这些,所以拿真机去扫印出来的实物,才是真正管用的检查。

留白不要省

码的四周需要一圈空白,扫码器才能判断从哪里开始。二维码标准要求 4 个模块,工具默认值就是 4,可调范围是 0 到 8。为了省地方把它设成 0,是「屏幕上能扫、印出来扫不了」的常见原因:印刷品上彩色方块或照片的边缘直接贴到码边。如果码要放在有颜色的底上,请把浅色那一块当作真正的背景,并且保留这圈边,不要把码直接画在图片上。

尺寸与文件格式

生成器会选一个整数的「每模块像素数」,所以每个模块一样大,边缘保持清晰。因此尺寸框填的只是目标值,状态栏里显示的才是实际宽度,也就是(模块数加两侧留白)乘以这个整数倍率。印刷请优先用 SVG:它是矢量格式,放到多大都不会让模块边缘发虚,PNG 的像素则是固定的。

内容里有汉字时要多留意什么

这个工具把文本按 UTF-8 的字节来计算容量,汉字每个占 3 字节,所以同一等级下能放的汉字只有字母的三分之一。一条 100 字的中文说明约 300 字节,用 M 级完全放得下,但会得到一个比短链接大得多的网格,每个模块也会相应变小。如果只是想让人访问一段中文内容,更稳妥的做法是把内容放在网页上,二维码里只放一个短链接,这样码的模块更大、更容易扫。

工具支持表情符号和中文,但请注意:二维码本身只是承载字节,如何显示出来由扫码的应用决定。不同的应用对 UTF-8 的处理偶尔不一致,含中文的文本码请在你预期会用到的那几种手机和扫码应用上都试一次。

印刷前的实测清单

  • 用至少两台不同的手机,各用系统相机和一个常用的扫码应用扫一遍。
  • 在实际使用的距离和光线下扫,而不是凑在眼前扫。室内灯光、背光和反光都会改变结果。
  • 把印出来的实物放在最终的位置上扫,而不是只扫打印机刚出来的那一张。
  • 如果要缩小印刷,先按最终尺寸打一张出来再决定。

扫不出来时按这个顺序查

先看状态栏里的版本和模块数。数字大说明内容太长,先缩短内容,再考虑降低容错率。其次看留白是不是被裁掉了,打印软件缩放时常把边缘留白一起切走。再看颜色:深色是否在浅色上,对比度是否在 4.5:1 以上。最后看实物:码是否被印在折痕、曲面或反光的位置上,是否被缩得过小。逐项排除以后再去调容错率,而不是一开始就把它拉到 H。多数时候,问题出在前面几项,而不在容错率。

另外,二维码里的内容一旦印出去就改不了。链接以后可能要换地址的话,可以先编码一个自己控制的短链接,再让它跳转到真正的目标;这种做法需要你自己有一个能做跳转的域名,本工具只负责生成静态的码。

网址、电话和 Wi-Fi 怎么填

「自动判断」模式会识别 https:// 这样的协议头。链接需要有协议头,并且主机名要带点号,否则工具会提示不完整,因为相机会把它当作普通文本。电话号码要求 7 到 20 位数字。Wi-Fi 常用的格式是一段纯文本:

WIFI:T:WPA;S:网络名称;P:密码;;

名称或密码里出现 ;、,、:、\ 时,这个格式要求在前面加反斜杠转义。并不是所有扫码应用都会自动连上网络,请在你预期的设备上实际试一遍。

编码在本页完成:编码库只在第一次使用时下载并缓存,之后你输入的文字不会被发送到任何地方。

打开工具: 二维码生成器

返回指南列表

更多指南