二维码扫不出来,多数不是码本身坏了,而是压缩把黑白模块的边界糊掉了。做快递面单、包装标签、活动物料时,图压小了,码却扫不动,问题出在模块边缘的对比度被拉平,识别算法找不到边界。

二维码的每个模块只有几个像素宽。识别算法先找定位角,再按网格切分,逐格判断黑还是白,判断依据就是相邻模块之间的明暗落差。
有损压缩处理的正是这种高频落差。方块边缘出现振铃和过渡色,色度抽样还会让黑白交界染上淡彩。落差被抹平后,同一格可能被判成另一格,校验通不过。
缩小尺寸的影响更直接。一张1400像素宽的图缩到700像素,一个模块从5像素变成2.5像素,再被采样成整数像素时,相邻黑白格会混到一起。二维码压缩到这一步,已经不是清不清楚的问题,而是能否解码的问题。
先量模块宽度。用能显示像素的查看器放大到看清单个格子,数一个模块占几个像素。低于3像素就处在危险区,1到2像素基本靠运气。
再看边缘。放大到400%,如果黑块边缘发灰、发虚,或者黑白交界出现淡红淡青,说明边界已经被处理过。边缘依然锐利的,问题多半在留白或打印,不在压缩。
最后实测。把压缩结果丢进识别入口扫一次,同时用PNG版本对照。PNG能扫、压缩版不能,结论就明确了。
第一步,打开图片压缩指定大小,上传原图,先填期望大小。二维码压缩优先保住像素,体积超一点可以接受。

第二步,体积实在超标时,用图片改大小按整数比例缩,比如1400缩到700,别缩到0.73倍这种非整数。整数倍缩放能让模块落在整像素上。
第三步,二维码单独输出一份无损版本。带码的物料图可以压成JPG用于展示,码本身另存PNG,交付时两个文件一起给,印刷方用无损那份。
临时码、跳内网的工牌码,扫不出来重生成一张更快,不值得调参数。
内容很短的码模块少、格子大,压缩等级70基本无感,不必专门处理。反过来,长链接生成的密集码,二维码压缩前就该缩短内容,靠调参救不回来。
印在纸上的码,压缩救不了,要回排版文件重新导出或重印。
把二维码放大能救回来吗
不能。放大只是把糊掉的边界拉大,插值补不出原来的黑白落差,模块会变成边缘发虚的大方块。
重新生成一个码是不是更省事
内容没变时确实更省事。但如果码印在既定版面上,尺寸和位置都定死了,只能回到原图重新导出,换码要重排版面。
存成PNG就一定扫得出来吗
前提是模块宽度够。PNG不做有损处理和色度抽样,能原样保住拿到的像素;但如果原图分辨率本身不足,PNG只是把不足的分辨率完整存下来。
判断顺序回到一句:先量模块宽度,再看边缘,最后实测扫码。宽度不够就缩得少一点或换更大的码,边缘糊了就改无损。手上有扫不出的图,按PNG对照法验一次,比反复调等级快。