这两天,一条看起来有点吓人的热搜在传播。有网友说,自己把一张打了马赛克的兑换券二维码丢给 AI 工具处理,短短几分钟就被“完整复原”,生成的新二维码直接就能扫码识别。很多人光看标题心里就咯噔一下,觉得以后发截图涂马赛克也没用了,AI 已经能看穿马赛克了。
可如果点进记者随后做的完整对照实测,就会发现一个完全相反的事实:真正打实的马赛克,AI 根本复原不了。网上那些让人惊呼「修好了」的案例,一半是 AI 自己瞎画了一张能扫出东西的假码,另一半则是马赛克打得太浅,连二维码自带的抗污损能力都没突破。
先看记者实测里抓到的第一个乌龙。
记者拿同一张二维码,分别用「局部模糊线条」「画笔涂抹」「高强度方格像素化」三种方式把码打花,然后丢给生图大模型,敲下一句「帮我修复二维码」。半分钟后,屏幕上的确吐出了一张黑白分明、棱角锐利的新二维码。很多人看到这儿就信了。但记者多做了一步:把完全相同的打码图和同一句指令连续发给 AI 两次。诡异的事情发生了,AI 前后画出来的两张「复原二维码」,中间的黑白小格排布完全不一样。拿手机去扫,要么毫无反应,要么扫出一串跟原图八竿子打不着的乱码。
这就是很多网友以为的「复原成功」。现在的多模态生图模型在训练集里见过几百万张二维码,非常清楚一张标准二维码长什么样。当你把一团糊成灰块的马赛克丢给它时,模型压根没去做什么逆向解密,它只是顺着先验概率在「看图作画」:规规矩矩地在三个角画上「回」字框,再往中间随机铺满黑白小格子。这就好比你把身份证号打上马赛克让 AI 修复,AI 顺手在上面填了 18 个清晰工整的数字,看着特像真的,其实是它瞎编的。
为什么一旦马赛克打实了,再强的 AI 也只能瞎编?因为这事在数学上就走不通。
方格马赛克的做法,是把一个区域里的所有像素亮度加起来取平均,涂成同一块灰色。这是一种「多对一」的有损压缩。好比我只告诉你两个整数加起来等于 4,要求你反推原来是 1 加 3、2 加 2 还是 4 加 0,谁也算不出来,因为区分它们的信息在求平均的那一刻就已经永久丢掉了。只要马赛克的方块大到吞掉了二维码原本的黑白格,谁也没法从一团平均值里凭空变出唯一的原图。

那问题来了,既然真马赛克不可逆,为什么原帖网友和记者实测里的另外两组图——「全图轻微毛玻璃模糊」和「马赛克笔刷偏小、二维码原图偏大」——又确确实实被还原出了原始信息?而且记者还特意补了一句大实话:后面那种细马赛克处理过的二维码,「无需额外修复就可以直接扫码识别」。
为什么一张普通照片糊掉一层就看不清了,唯独二维码这么「命硬」,哪怕被毛玻璃糊住、或者被涂掉一大块,照样能扫出来?
因为你每天在干净屏幕上扫的二维码,当年根本不是给手机发明的,而是为了在满是黑机油、铁屑和划痕的汽车零件车间设计的。
把时间倒回 1994 年。当时日本丰田旗下电装公司(Denso Wave)的工程师原昌宏,接到了一个棘手的任务。那时候汽车工厂的零件盒上贴的全是一维条形码,一个条形码只能装 20 个英文字符,一个零件盒上往往得贴十几个码,流水线工人每天要拿扫码枪扫上千次,扫到手腕得腱鞘炎。更要命的是,汽车车间里到处是机油和磕碰,条形码只要沾上一滴黑油,整条流水线就得停下来手抄单号。
为了对付车间的油污和磨损,原昌宏在二维码里做了三处极其耐造的设计。没想到三十年后,这三处设计反而让无数人随手涂的马赛克彻底失效。
第一处设计,是那三个专门用来抵抗模糊的「回」字角。
你随便回想一张二维码,最显眼的就是左上、右上、左下三个角上那三个大大的「回」字方块。为什么四个角只放三个,偏偏把右下角空出来?为了定方向。车间里的零件盒在传送带上横七竖八,只要扫码器看到哪三个角有框、哪个角没框,0.01 秒内就能算出旋转角度,把整张图摆正。
那扫码器怎么在一堆密密麻麻的文字和污渍里,一眼认出这三个「回」字框呢?原昌宏当年带着团队干了一件体力活:他们搬来成堆的报纸、杂志、传单和工业图纸,把上面所有的文字和插图全部切成黑白线段,统计黑白宽度的比例。最后他们找出了一个在人类所有印刷品里几乎不会自然出现的冷门比例,也就是 1 比 1 比 3 比 1 比 1。
你看那个「回」字框,从左往右穿过中心画一条线,外圈黑框宽 1、里面白圈宽 1、正中间实心黑块宽 3、右边白圈宽 1、外圈黑框宽 1。不管歪成什么角度,穿过中心的黑白比例永远是 1 比 1 比 3 比 1 比 1。所以当你用「毛玻璃模糊」或者「细颗粒马赛克」去涂一张二维码时,只要这三个同心方块的黑白轮廓还在,算法第一眼就能顺着这个比例,把整张二维码的网格坐标系锁定。
第二处设计,是整张二维码里有一半以上的格子根本不用猜。
网格坐标系一旦锁死,算法接下来要猜多少个黑白格子呢?我们拿最小的「版本 1」标准二维码算一算。
它是一个 21 乘 21 的方阵,一共 441 个黑白小格(在编码规范里叫模块)。很多人以为还原它得猜对全部 441 个格子,其实里面有 233 个格子的颜色跟内容毫无关系,全是公开的固定模板。三个角的定位框连同周围一圈隔离白边就占掉了 192 格,连接三个角的两条黑白相间刻度线(时序线)占了 10 格,记录格式参数的区域占了 30 格,外加一个永远是黑色的固定格。
扣掉这 233 个明牌格,真正用来装数据的只剩 208 格,合 26 个字节。
第三处设计,是专门为了防车间机油而塞进去的「宇宙飞船纠错码」。
为了防止零件盒上的二维码被机油糊住扫不出来,原昌宏直接把 NASA 用在旅行者号深空探测器上的「里德-所罗门纠错算法(Reed-Solomon)」搬了进来。
二维码按抗损毁能力分为 L、M、Q、H 四档,最高档 H 级允许整张码有 30% 的面积彻底损毁。在这档设置下,刚才剩下的那 26 个字节里,有 17 个字节全是用来防油污的纠错备份,真正用来装原始数据的净载荷只有 9 个字节。再扣掉开头的编码模式和长度标识,留给实际内容的不到 60 个比特,换成纯数字最多也就 17 位数。

我们平时看微信二维码正中间能光明正大地贴一个大大的正方形头像,挡住中间一大片格子还能照常扫出来,靠的就是原昌宏当年留下的这 30% 抗机油额度。
把这三处设计合在一起,你就明白为什么「细马赛克」和「轻微模糊」在二维码面前形同虚设了。
当你在高清手机或电脑屏幕上截图时,一张二维码动辄三四百像素宽,里面每一个黑白小格足足占了十几个像素。如果你拿默认粗细(比如 8 像素)的细马赛克笔刷去涂,马赛克块比二维码原本的格子还要小,每个格子的中心依然是纯黑或纯白;而毛玻璃模糊只是把相邻格子的亮度往四周匀了匀。
面对这种薄码,算法先用 233 个固定格锁死坐标,再顺着灰度深浅猜出七八成的黑白格。剩下那点没猜准的残缺,在里德-所罗门纠错码眼里,跟三十年前丰田车间里滴在零件盒上的一滴机油没有任何区别——直接套用代数公式就能把那十几位数字反推出来,甚至连 AI 都用不上。
所以这起热搜真正给所有人提了个醒:二维码天生就是为了「抗遮挡、抗模糊」造出来的,我们平时发截图随手干的四个假动作最容易翻车。
第一个假动作,是只拿黑笔涂掉三个角的「回」字框,或者只往正中间抹一小坨黑墨水。那三个回字框全天下长得一模一样,随便从别的码上抠三个角贴上去就能补好;而只涂掉正中间五分之一的面积,又没超过 30% 的纠错上限,外围剩下的格子照样能把内容算出来。
第二个假动作,是用手机相册自带的「荧光笔」或半透明「马克笔」涂黑。这类画笔单笔的不透明度往往只有 70% 到 85%,你在上面来回涂三层,肉眼看着已经乌漆嘛黑了,但原本白底和黑字的地方依然留着微弱的色值差。别人把图丢进修图软件,把「对比度」和「曝光度」拉到底,黑墨水底下的二维码就会清清楚楚地显露出来。
第三个假动作,是在 Word、PPT 或 PDF 里插一张截图,然后在上面画个黑色长方形盖住就把文档发出去。那个黑框在文件里只是独立的一层,对方拿鼠标轻轻一拽就移开了。
第四个假动作,是把二维码盖得严严实实,却把旁边的一维条形码或底下的 16 位数字兑换码留在了外面。票据和快递单上的条形码跟二维码存的是同一串单号,而且条形码从上到下每一横截面的信息完全一样,哪怕你在条形码中间横着涂掉一大截,只要上下边缘漏出 1 毫米高的竖线,扫码工具顺着这 1 毫米就能把整串号码读出来。
想让发出去的截图真正安全,办法其实特别简单,连修图软件都不用开。
如果那块二维码或单号没必要展示,截图时直接拖动边缘把它裁出画面。物理上不在图片里的像素,任何算法都无能为力。
如果为了保留版面必须打码,放弃模糊、细马赛克和半透明画笔,直接选截图工具栏里的「实心矩形框」,用 100% 不透明的纯色把整个二维码(连同四周白边、旁边的条形码和数字)整块盖死,盖完之后再截一次屏发出去。只有把那片区域的所有像素都替换成一模一样的纯黑或纯白,里面的信息才算真正被物理销毁。

这类信息打码与图像识别问题,在云栈社区的技术讨论中也常被拿出来复盘。但最稳妥的做法,仍然是从源头裁掉或者完全覆盖。