二维码扫不出来:容错级别、尺寸与印刷的坑
办公与文档发布于 2026-10-31
设计稿上看着挺清楚,打印出来扫三次才成功一次——问题几乎总是同样三个:单个模块太小、对比度不够、静区被裁。
先看清二维码是什么:它是一张黑白方格矩阵,每个格子叫一个模块,模块只有「黑」和「白」两种状态。扫码器要做的事是「把每个模块认出来」,只要它认错一个模块,整串数据就可能校验失败。所有扫不出来的原因,都可以归结为「模块变得难以辨认」。
三个参数在互相牵制
生成二维码时有三个东西可以调,它们不是独立的:
| 参数 | 作用 | 变大之后 |
|---|---|---|
| 内容长度 | 决定版本(模块数) | 模块变多、格子变小 |
| 容错级别 | 决定能坏掉多少 | 模块变多、格子变小 |
| 输出尺寸 | 决定物理大小 | 单个模块变大,好扫 |
关键就是那句「模块变多,格子变小」。二维码的版本从 1(21×21 模块)到 40(177×177 模块),内容每长一点、容错每提一档,版本就可能往上跳。
所以「把容错调到最高更保险」是错的。容错调高确实能容忍更多污损,但它同时让码变密——在固定 2cm 的印刷尺寸下,H 级的单模块可能只有 0.15mm,印刷出来就糊成一片,比 M 级更难扫。
容错级别怎么选
| 级别 | 可恢复比例 | 什么时候用 |
|---|---|---|
| L(低) | 约 7% | 屏幕显示、电子版、图像质量可控 |
| M(中) | 约 15% | 默认选项,普通印刷品 |
| Q(较高) | 约 25% | 小幅面印刷、可能被折压 |
| H(高) | 约 30% | 要叠 logo、户外、易脏易磨损 |
实际建议只有三条:
- 电子屏、网页、PPT → L 或 M 就够,越低级模块越少,反而更容易扫
- 普通纸质印刷(传单、名片、海报)→ M 起步,纸面粗糙或有底色用 Q
- 中间要放 logo、贴在户外、可能被摸脏 → H,但要同时把尺寸放大一档来补偿密度
如果放了 logo,覆盖率别超过码面的 25%,并且别压在三个定位角上(左上、右上、左下那三个「回」字形方块,是扫码器用来定位的,压了直接废)。
尺寸定多少
有个流传很广的经验法则:二维码的边长 ≈ 扫码距离 ÷ 10。
扫一次的距离是 30cm(手机正常持握),边长 3cm 左右比较稳;贴在店门口、人要站 2 米外扫,边长就得 20cm。
常见场景的参考值:
| 场景 | 建议最小边长 |
|---|---|
| 名片、工牌 | 1.5 cm |
| 传单、宣传页 | 2 cm |
| A4 海报 | 3 cm |
| 展架、门贴 | 8~10 cm |
| 户外广告、围挡 | 按距离算,不小于 20 cm |
还有一条硬约束:印刷时单个模块的边长不要小于 0.3mm。低于这个值,胶印的网点会糊在一起,激光打印的墨粉会扩散。按这个反推——一个 33×33 模块的二维码(版本 4),做 2cm 边长时单模块约 0.6mm,很安全;一个 177×177 的版本 40,2cm 边长时单模块只有 0.11mm,基本扫不出来。
所以内容能短就短。一个带一堆跟踪参数的 URL 可能有 200 个字符,换成短链只要 30 个字符,版本能掉好几级,同样的印刷尺寸下模块大一倍。
静区:最容易被设计稿吃掉的部分
二维码四周必须留出至少 4 个模块宽的空白,这块空白叫静区(quiet zone)。它的作用是让扫码器知道「码到哪儿结束」——没有静区,扫码器分不清边缘的模块和背景。
设计稿里最容易犯的三个错:
- 把二维码放在深色色块上,四周没有留白
- 给二维码加一个贴边的装饰边框
- 二维码铺满整个卡片,边缘被裁掉
生成工具里的「边距(margin)」参数就是控制这个的。用 二维码生成器 时把边距保持默认(通常就是 4 个模块),别为了「码大一点」把它调成 0——看着大了,扫不出来。
对比度:深码浅底,别反色
扫码器靠明暗差识别模块。三个原则:
- 深色码 + 浅色底。黑码白底是最稳的,深蓝、深绿、深褐都可以。
- 不要反色。浅色码 + 深色底(比如白码黑底)在理论上可识别,但很多老设备和部分扫码引擎不支持,实测成功率明显下降。
- 不要渐变底、不要花底图、不要半透明。二维码下方的背景必须均匀,反差要足够(明度差建议在 40% 以上)。
如果品牌要求用彩色码,记住一条:码的深色部分承担识别,浅色部分承担反差。浅色部分被改成米色、浅灰还能用,深色部分被改成浅黄、浅粉就废了。
条形码和二维码不是一回事
| 一维条形码 | 二维码 | |
|---|---|---|
| 存储 | 少(EAN-13 只有 13 位数字) | 多(版本 40-L 可存 2953 字节) |
| 方向 | 只能横向扫 | 任意角度 |
| 破损容忍 | 极低,缺一根线就废 | 有容错,可恢复 7%~30% |
| 典型用途 | 商品码、物流单号 | 网址、支付、名片 |
商品包装上的 EAN-13 是固定 13 位(12 位数据 + 1 位校验),校验位由前 12 位算出来,算错了打印机或商超系统会拒收。条形码生成 会自动补算校验位,省得手算出错。
收款码合并,合并的是图不是码
「微信支付宝二合一收款码」这个需求很常见——摆摊、小店、前台放一张纸,顾客扫哪边都能付。
需要说清一件事:技术上不存在「一个码同时被微信和支付宝识别」的方案。两个平台的码里编的是各自的协议地址,内容完全不同,物理上不可能塞进同一张码。
所谓合并,是把两张收款码图片排版拼到一起:二合一收款码 会自动定位并裁出各自图片里的二维码区域,套统一模板重排成一张卡片,左右并排或上下堆叠,导白底 PNG 直接打印。
所以:
- 合并后是「一张纸上两个码」,不是一个码
- 打印时把这张图放大到 A6 以上(约 10cm×15cm),每个码不小于 4cm
- 全程在浏览器本地合成,收款码图片不上传服务器
打印前用手机在正常光线下试扫两遍——这一步别省,很多「扫不出来」是因为打印出来颜色偏了。
上线前的检查清单
- 内容长度是否已精简(长 URL 换短链)
- 容错级别是否与印刷条件匹配(不是越高越好)
- 边距是否保留了 4 个模块
- 单模块边长是否 ≥ 0.3mm
- 是否深码浅底、背景均匀无渐变
- 有无 logo,覆盖率是否 ≤ 25% 且没压定位角
- 打印样品在自然光下实测(至少两台不同手机)
最后一条最重要。屏幕上 100% 显示正常的二维码,缩到 2cm 印在铜版纸上、再覆一层哑膜,对比度会掉一大截——只有打样能发现。
相关工具
- 二维码生成与识别:可调尺寸、边距、容错级别与颜色,导出 PNG / SVG(矢量图印刷不糊)
- 条形码生成与识别:Code128 / EAN-13 / UPC-A 等,自动补算校验位
- 微信支付宝收款码合并:二合一收款码排版,本地合成
- 图片压缩与缩放:调整收款码图片的输出尺寸与清晰度