我们怎样确认二维码扫得出来,你又该怎么自己验证
在电脑屏幕上能扫的码,印到菜单上未必能扫。PaintQR 的每一个设计背后都是同一套方法:每个码过两个软件解码器,实验室里模拟十四种拍摄条件,再用真手机扫打印出来的测试页。这套方法的精简版,就是你自己验证打印件时该做的事。
更新于 2026年11月10日
三道关,不是一道
没有哪一项测试能单独证明一个二维码一定扫得出来。电脑上的解码器比一臂之外的手机摄像头宽容得多;同一部手机,在灯光刺眼的店里又比在书桌前更挑剔。所以 PaintQR 分三道关来查,一道比一道便宜、也一道比一道频繁:每个设计在可以下载之前都先由软件解码;软件所依据的设计规则,来自用手机扫打印页得到的结果;而我们用来比较风格和参数的实验台,会让一个码经历摄像头会制造的各种状况。
每一道关拦住的是不同的问题。软件解码器拦下的是本身就错的码。源自手机的规则拦下的是电脑能读、真机却读不出的设计。实验台则在规则形成之前就告诉我们,哪些选择会让一个码变得脆弱。
第一关:每个设计都过两个解码器
你在生成器里看到的每个设计,都已经被解码过两遍。第一个解码器是 zxing-cpp,大多数安卓扫码应用都源自这个库。第二个是 OpenCV 的检测器,它按区块对图像做二值化,失败的方式和前者不同:大面积实心填充就是它的弱项。每个解码器都会拿到彩色版、黑白版,以及一份模糊到每格三像素的副本,用来代替偏小或偏糊的打印件。
如果基准解码器连干净的渲染图都读不出,这个设计会被直接拒绝,生成器会说明原因。这种情况本不该发生,也是唯一没有例外的检查。其余解码器在模糊副本上的结果会被记录并写进报告;它们用来支撑下面的规则,而不单独拦截,因为它们在模糊图像上的表现起伏不定,和手机的表现对不上。
第二关:140 次手机扫描得出的规则
2026 年 9 月,我们把一批设计打印成测试页,用一部 iPhone 和一部摩托罗拉安卓手机的自带相机,在室内光线下、一臂距离处扫描,屏幕和纸面都试,总共约 140 次。所有被手机拒绝的设计,在电脑上照样能解码。因此规则是根据那些能预示手机失败的设计特征建立的,而不是根据软件解码器。
失败的有三类。第一类:深色方格占数据区一半以上、而且大多连成实心块的设计,在版本 15 及以上会失败,案例是一朵木槿花和一颗心。第二类:图库里一个深色彩色图标,在版本 15 时 8 次有 6 次失败,而在版本 10 时 5 次全部通过。第三类:版本 15 的强调色设计,把超过五分之一的纠错能力花在了图案上。除此之外,字母、logo 和照片在版本 6 到 15、默认设置下,每一次都通过了。
符合这三类之一的设计会被标为“脆弱”。生成器不会就这样卖给你:它会降低细节或图案预算,重新生成,再查一遍,并告诉你改了什么。唯一的例外是版本 20,也就是最高细节:它在版本 15 适用的尺寸下失败,但印得更大就能扫,所以保留它,只是给出更大的最小打印尺寸。
第三关:实验台
比较一种风格、一个参数或引擎的一处改动时,干净图像能解码说明不了什么。实验台会把渲染好的码放进十四种模拟摄像头的状况里:码在画面里很小,每格只有 3 像素和 2.4 像素;模糊;25 度和 40 度的俯仰,以及 30 度的侧倾;光照不均;低对比度;传感器噪点;JPEG 压缩;屏幕翻拍;纸上的油墨扩散;还有倾斜、光照和模糊叠加的组合。每张图都交给我们能装上的所有解码器:zxing-cpp、OpenCV、OpenCV 的微信检测器、zbar,以及经典的 Java 版 ZXing——它那套老式二值化最不宽容,也最接近老旧的扫码应用。
扫描得分是“条件 × 解码器”组合中解出正确文本的比例,报告会点出最薄弱的条件。打印尺寸规则和扫描安全档位就是这样调出来的;任何会影响图案的改动,上线前都要先跑这一套。
打印尺寸是怎么测出来的
打印出来的普通二维码,在一臂距离下小到每格约 0.4 毫米仍能解码。带图案的码需要大约一倍半:版本 15 在每格 0.66 毫米时正常,0.5 毫米时失败。版本 20 在 0.5 毫米时同样失败;对它和更高的版本,我们标注每格 0.8 毫米,在失败点之上留出余量,直到用 6.5、8.5 和 10 厘米的打印测试把估计值换成实测值。每个设计下方显示的尺寸,就是它的格数(含边距)乘以相应数值再向上取整。按版本列出的完整表格在打印尺寸指南里。
花五分钟验证你自己的打印件
我们的检查让糟糕的设计很难漏网,却看不见你的打印机、你的纸张和你店里的灯光。在批量印菜单或名片之前,做一次下面的事:
- 按预定尺寸只印一份,拿尺子量一下。选了“适合页面”打印出来的页面会比设计的小,而处在最小尺寸的码没有再缩的余地。
- 用两部不同品牌的手机,用它们自带的相机,而不是某个可能比顾客手机更宽容的扫码应用。
- 在码将来所处的光线下,先在一臂距离扫,再退到一倍半的距离扫,最后把手机倾斜约三十度再扫。
- 别把屏幕测试当成打印测试。屏幕有背光,也比纸张清晰;能在显示器上扫出来,只说明设计本身有效。
- 如果表面有光泽或覆了膜,就在顶灯下扫。反光压在三个大角标中的任意一个上,就扫不出来。
- 只要有一次扫描失败:先印大一点;再选平衡档的扫描安全或更低的细节;最后再简化图案。前两步之一几乎总能解决。
我们不做的承诺
两部手机和五个解码器,不等于所有手机和所有应用。基于经典 ZXing 二值化的老旧扫码应用,读取能力不如现代相机应用,这一点我们在实验室里测,而不是在真机上。你的打印机、油墨和纸张会以任何模型都算不全的方式改变对比度。上面的检查是一张过滤网,筛掉我们已知会失败的设计;打印测试才是证明,而这一步要你来做。
有一个现阶段的局限,直说:那个让 logo 形状保持完整、把码的纹理放在形状之外的选项,在“图案优先”档位下已经通过了软件解码器和实验台,但用手机扫打印页的测试还在进行中。在它完成之前,这类标志请印大一些,并在大批量印刷前做那五分钟的验证;或者选平衡档的扫描安全,它用少量空间换来更多纠错。
常见问题
我的码在屏幕上能扫,印到纸上就不行,为什么?
纸比屏幕更暗、更糊、也更小。常见原因依次是:打印出来比最小尺寸小,多半是“适合页面”造成的;表面反光把灯光打进了摄像头;或者设计正处在手机容忍度的边缘,印大一点或改用平衡档就能解决。
你们用什么手机和应用测的?
打印页用一部 iPhone 和一部摩托罗拉安卓手机的自带相机扫描,2026 年 9 月约 140 次,10 月又补测了版本 20。实验台另外加入五个软件解码器,包括经典的 Java 版 ZXing,用来代表较老的扫码应用。
彩色的码和黑白的一样好扫吗?
手机分辨的是深和浅,不是颜色。PaintQR 把每个深色格压在一个亮度阈值之下、每个浅色格抬在阈值之上,所以颜色是给人看的,对比度是给摄像头的。唯一在手机上失败过的彩色模式——版本 15、图案预算很大的强烈强调色——现在已被规则拦下。
图案会用掉多少纠错能力?
标准二维码在最低纠错级别下可以修复约 7% 的方格,中等级别约 15%。扫描安全档位决定图案可以动用这份修复预算的多少:“安全”约十分之一,“平衡”约五分之一,“图案优先”约三分之一。剩下的留给折痕、反光和抖动的手。