
QR码为什么刮花了还能扫?背后的容错原理
Diebug
为什么QR码刮花了还能扫
你有没有过这种经历:拿出手机扫描一个QR码,发现它已经被刮花了一半,或者中间被贴纸盖住,或者油污糊住了角落——但手机照样能扫出来。
这有点反直觉。一个二维码缺了几块,就像一本书撕了几页,你觉得应该读不懂了。
但QR码的设计者早就预料到了。他们故意在QR码里”浪费”一部分空间存储冗余信息,让扫描器有足够的数学备份,去重建那些被刮掉、遮挡或模糊不清的数据。
QR码的”骨架”
一个QR码看起来像一大块黑白马赛克,但里面的小方块有不同的职责。
三个定位方块。QR码三个角落的大方框是最醒目的特征。它们告诉扫描器”这是一个QR码”,并确定它的朝向。无论你怎么旋转手机,扫描器都能通过这三个角找到正确的方向。
定位图案。除了三个大方块,还有其他辅助图案帮助扫描器处理倾斜、拉伸或角度偏差的情况。即使斜着拍一张QR码,手机也能校正变形后正确识别。
格式信息和保留区域。QR码里还有一些区域专门存储格式元数据,比如纠错级别和掩码模式。
把这些元素扣除之后,剩下的空间才真正用来编码数据——以及冗余纠错信息。

Reed-Solomon纠错:QR码能”自愈”的秘密
QR码的容错能力来自一个叫Reed-Solomon纠错码的数学工具。
这个名字听起来很高深,但原理其实直观。
假设你要发送消息”HELLO”。简单做法是直接发送这五个字母。但如果传输过程中’E’被弄丢了,对方收到”H_LLO”,就不知道怎么补了。
Reed-Solomon的做法是:不只是发送原始数据,还发送一些”衍生数据”。这些衍生数据基于原始数据通过数学运算生成。即使一部分原始数据丢失,接收方也能利用剩余的衍生数据推算出丢失的内容。
QR码怎么应用这个原理?
生成QR码时,信息被分成小块(codewords)。Reed-Solomon算法对这些小块进行数学运算,生成额外的纠错codewords,然后和原始数据一起编码进QR码的网格中。
这些额外的codewords不是原始数据的备份副本——它们是原始数据的”数学关系”。如果某些codeword变得无法读取,解码器可以靠幸存的信息重建丢失的值。
打个比方:你有一组方程,已知其中大部分变量的值,即使有几个未知,也能解出答案。
实际的数学涉及比较复杂的代数。如果你对技术细节感兴趣,Reed-Solomon编码本身就是一个有意思的研究方向。作为普通用户,你只需要知道:QR码故意留出了”备用空间”,用来应对损伤。
四个纠错级别
标准QR码提供四个纠错级别,对应不同的恢复能力:
| 级别 | 可恢复比例 | 适用场景 |
|---|---|---|
| L(Low) | 约7% | 数据量大、环境干净的场合 |
| M(Medium) | 约15% | 最常用的默认级别 |
| Q(Quartile) | 约25% | 可能受损的环境 |
| H(High) | 约30% | 高损坏风险,如工业标签 |
数据来自DENSO WAVE——开发QR码的公司,至今仍发布QR码的技术规范。
选最高的H级别最保险?不一定。
更高的纠错级别意味着需要更多冗余codewords,占用了原本存放实际数据的空间。相同尺寸的QR码中,纠错级别越高,能存的URL或文字就越少。如果数据量不变,QR码可能需要升级到更大的网格尺寸。
实际选择时要看使用环境:Level M最常见,平衡了容量和容错;Level L适合干净环境(如数字屏幕显示的QR码);Level Q/H适合恶劣环境(如户外广告牌、工业标签)。
为什么QR码能印Logo还扫得出来
很多人喜欢QR码中间嵌入自己的Logo。看起来挺酷,但真的不影响扫描吗?
答案是:可以,但有条件。
QR码的纠错能力允许一部分区域被遮挡。如果Logo覆盖了中心区域,且没有破坏三个角落的定位方块和周边的格式信息区域,同时留存的可用codewords足够多,扫描器就能重建被遮挡的部分。
有些在线QR码生成器允许你上传Logo——只要logo面积不超过QR码总面积的30%,通常能正常工作。
但纠错不是魔法。Logo放太大,或者遮住了一 critical 的结构区域,QR码就废了。纠错能力不能随便滥用。

为什么QR码天生就”抗造”
QR码设计之初就不是为了”好看”,而是为了”耐用”。
1994年,日本DENSO Corporation的团队在Masahiro Hara的带领下开发了QR码。他们的需求来自汽车制造工厂:需要一种能在油污、灰尘环境中依然被快速扫描的信息存储方式。
当时的传统条形码太脆弱了,表面有污渍就无法读取。QR码的设计目标就是:即使部分被污染,也能正确扫描。
“QR”名字来自”Quick Response”(快速响应)——强调在恶劣环境下依然能快速可靠地读取信息。
这个设计理念一直延续到今天。餐厅菜单上的QR码可能沾满油渍,快递包裹上的QR码可能被刮花,但手机依然能扫出来——这正是三十年前工程师们预设的目标。
总结
QR码的容错能力是一个经典的工程解决方案:用数学手段换取鲁棒性。它不靠”更清晰的印刷”来解决问题,而是靠”内置冗余”来应对不可避免的损伤。
下次扫描一个破损的QR码成功时,想想背后那些Reed-Solomon codewords正在默默帮你重建丢失的信息。这是世界上最不起眼的数学奇迹之一——每天被数十亿人使用,却几乎没人注意到它的存在。