二维码为什么能遮住一角还能扫?

· 约 2 分钟 二维码

你一定遇到过——二维码贴了个 Logo、破了一角、甚至被水印覆盖,居然还能扫出来。背后是 Reed-Solomon 纠错码,同一块数据会以冗余形式重复存储。容错等级决定了能破坏多少。

4 个容错等级

等级可恢复损坏面积数据容量典型用途
L(低)约 7%最大纯链接、干净环境
M(中)约 15%较大默认推荐
Q(四分位)约 25%较小工业标签、户外
H(高)约 30%最小叠加 Logo 必选

所谓”面积”是整个码的模块数(小方块),不是像素。25% 大约相当于四分之一被覆盖或污损。

贴 Logo 的数学

常见做法是在码中央挖一块放 Logo。Logo 覆盖的面积不能超过容错等级能恢复的比例

  • L 级:Logo 占码面积 ≤ 7%,几乎看不出 Logo
  • H 级:Logo 占码面积 ≤ 30%,能放显眼的品牌标

所以你看到的带 Logo 的二维码,几乎全是 H 级。提升容错会让码更密(同样的信息量需要更大的方块数),所以印刷面积也要更大。

容错 ≠ 免死金牌

三种情况容错也救不回来:

  1. 破坏了”定位码”(三个角的回字形方块)——扫码器连码在哪都找不到
  2. 连续大面积破坏——Reed-Solomon 擅长恢复分散错误,连续区域超过一定尺寸就失败
  3. 反色/低对比度——多数扫码器要求浅底深码,反过来的可能识别不了

贴 Logo 时要放中央,别碰三个定位角;遮挡时要分散而不是一整块。

版本和容量

二维码有 1-40 个版本,版本号越大方块越密、能存数据越多。常见场景:

  • URL 链接(30-80 字符):版本 3-5,M 级
  • 名片 vCard(200-400 字符):版本 7-10,M 级
  • 长文本(1000+ 字符):版本 15+,考虑改用 URL 指向网页而不是硬塞

一个误区:数据越长,码越复杂,反而越容易出错。链接长度能压短尽量压短(用短链服务或自己 301 跳转),用户扫码体验会明显好。

颜色、边框、静区

  • 静区:码周围必须留至少 4 个模块的空白,否则部分扫码器识别失败
  • 颜色:深色方块的对比度要足够,前景色不是全黑也行,但不能和背景色亮度太接近
  • 圆角/渐变:扫码器比你想的宽容,视觉设计空间很大

生成 + 配色

自定义容错等级、前景/背景色、边距,叠加 Logo 实时预览,生成的 PNG 可以直接打印或嵌入网页。

❓ 常见问题

二维码最多能存多少字符?

QR Code 版本 40、容错等级 L 下:纯数字最多 7089 位、字母数字最多 4296 位、字节数据最多 2953 字节、汉字(UTF-8 编码)约 984 个。但存得越多码面越密、扫描越难,实际用超过 300 字符就该考虑改存 URL 了。

二维码颜色能反过来用吗(浅色模块 + 深色背景)?

多数扫码器只认"深色前景 + 浅色背景"。反色需要扫码器支持"反色识别"——iOS 15+ 的相机和微信支持,部分老安卓 APP 不支持。做反色码前务必测试目标用户场景。

二维码会过期吗?

二维码本身不会过期——它只是一段信息的视觉编码,打印出来十年后扫出来的内容依然相同。但如果二维码指向一个短链需登录服务,短链服务关闭或链接失效,码就"废了"。重要场景用永久域名,别用短链接服务。

同样内容生成的二维码为什么每次图案不一样?

这是掩码(masking)的结果。QR Code 有 8 种掩码模式,编码器会从中选一种让黑白比例最均衡、最容易扫。不同实现选的掩码不同,所以"内容相同、生成工具不同"会得到不同的图,但它们扫出来的信息完全一样。

打开 二维码 生成 · 扫码识别 · 自定义配色