改图片尺寸为什么会糊:缩小是在丢信息,放大是在编信息

· 约 4 分钟 📐 图片尺寸修改

同一张照片缩到 64 像素,有的工具出来很清楚,有的一团糊,还有的凭空多出细密的花纹。

这三种结果对应着重采样过程里的三个不同问题,而它们的解法完全不同。

先分清方向:缩小和放大不是同一件事

缩小放大
信息量在减少不增加
能不能做好能,取决于算法只能让糊得好看一点
主要风险混叠、发灰模糊、块状、锯齿

这个区分是后面所有讨论的前提:缩小是个可以做好的工程问题,放大不是。

四种插值算法

算法参考邻域特点适合
最近邻1 个像素硬边完全保留,放大出方块像素画、二值图
双线性2×2快,偏软实时预览
双三次4×4比双线性锐,可能轻微过冲通用,最常见
Lanczos更大的窗缩小质量最好,边缘可能有振铃高质量缩图

唯一需要记死的一条像素画和二值图必须用最近邻。任何插值都会在硬边上算出中间色,把「一个像素就是一个像素」的美学彻底破坏掉。

缩小的真正难点:混叠

把一张 2000 像素宽的图一步缩到 64,相当于每 31 个像素只取 1 个

原图里比这个采样间隔更细的花纹会怎么样?

  • 衬衫的细格子
  • 建筑远景的百叶窗
  • 含小号文字的屏幕截图

它们会被采出完全错误的低频图案——看起来像水波纹,这就是摩尔纹,本质是混叠(aliasing)。

正确做法是先把高频去掉,再抽样:先做一次低通(模糊),把细到采不出来的成分抹掉,然后再降采样。

逐级折半:低通的廉价近似

不想实现完整的低通滤波器,有一个简单有效的替代:

2000 → 1000 → 500 → 250 → 125 → 64

每次只缩一半。缩一半时用 2×2 邻域取平均,天然就是一次低通。走完几级再落到目标尺寸,花纹就不会冒出来。

这也是 图片尺寸修改 内部的做法——浏览器 drawImage 的默认插值只看相邻几个像素,一步缩十倍会直接跳过大量信息,逐级折半比一次性缩过去清楚得多。

缩完发灰,是正常的

降采样本质上是一次平均,相邻像素的差异被抹平,边缘对比度必然下降

补救办法是缩完之后做一次轻微锐化(USM,半径小、量适中),把边缘的局部对比度拉回来。

两个注意点:

  • 顺序是先缩后锐。反过来会把噪点一起放大再采进去
  • 不要靠加大锐化量硬凑。过度锐化会在边缘产生白边和黑边,尺寸越小越明显

目标尺寸特别小的时候,比起反复调锐化,换一张线条更粗、细节更少的源图收益大得多。

放大:插值在算,AI 在编

传统插值不增加任何信息。 双三次、Lanczos 做的都是「根据已有像素算出中间值」,所以放大后只有两种结局:模糊,或者块状加锯齿。

AI 超分是另一回事:模型根据训练时见过的大量图像,这里本来应该长什么样。

这个区别在实用上很关键:

  • 照片放大做壁纸、海报 → AI 超分通常效果不错
  • 证件、票据、监控截图、有文字的图不要用 AI 超分。猜出来的笔画可能把字改了,而且从结果上看不出来
  • 像素画 → 必须最近邻

最好的办法永远是回去找原图。 图片尺寸修改 允许填比原图大的数字,但不做任何插值猜测——它不会假装能恢复细节。

图标:小尺寸要重画,不是缩

一套 App 图标从 1024 缩出全部尺寸,大的没问题,小的会出事:

目标尺寸做法
512 以上从矢量或 1024 源图直接导出
64 – 256从源图缩,缩完检查边缘,必要时轻微锐化
16 – 48建议重新设计

小尺寸下一个像素的权重极大,缩出来常见三种毛病:笔画粗细不匀、边缘出现半透明的灰边、图形中心偏移一个像素。

真正的解法是从矢量出图——SVG 在每个尺寸各导出一次,让渲染器在每个尺寸上各自对齐像素网格。

还有一条不管什么尺寸都成立:每个尺寸都从同一张源图导出。不要用「先缩到 256、再从 256 缩到 128」这种链式做法,有损格式会把压缩痕迹一层层累积下去。

顺带:几个相邻的问题

一句话

缩小做得好不好,全看有没有先低通再抽样;放大做得再好,也只是把猜的东西画得更像。

❓ 常见问题

为什么把一张大图一步缩到 64 像素,会出现细密的花纹?

那是混叠(摩尔纹),因为采样点跳过了大量像素机制:一步从 2000 像素缩到 64,相当于每 31 个像素只取 1 个。原图里比这个采样间隔更细的花纹——衬衫的细格子、建筑的百叶窗、屏幕截图里的文字——会被采出完全错误的低频图案,看起来像水波纹。正确做法是先把高频去掉再抽样,也就是先做一次低通(模糊),再降采样。逐级折半是它的廉价近似:每次只缩一半,等于用 2×2 的邻域做平均,天然起到低通作用,走完几级再落到目标尺寸,花纹就不会冒出来。什么图最容易出:细密纹理的织物、远景的窗格、含小号文字的截图、已经缩过一次的图。

缩小图片之后觉得发灰、不够锐,是正常的吗?

正常,而且可以补回来原因:降采样本质是一次平均,相邻像素的差异被抹平,边缘的对比度自然下降——这是信息减少的必然结果,不是算法有问题。补救办法是缩完之后做一次轻微锐化(USM,半径小、量适中),把边缘的局部对比度拉回来。注意顺序:先缩后锐,反过来会把噪点一起放大再采进去。不要靠加大锐化量硬凑:过度锐化会在边缘产生白边和黑边,缩得越小越明显。另一条更省事的路:目标尺寸很小时(图标级别),与其锐化,不如换一张线条更粗、细节更少的源图。

放大图片有办法不糊吗?AI 超分是怎么回事?

传统插值不可能不糊,AI 超分是在生成不存在的细节区别:(1) 插值(双线性、双三次、Lanczos)只根据已有像素算中间值,信息量不增加,所以放大后要么模糊、要么出现块状和锯齿;(2) AI 超分是模型根据训练见过的大量图像,这里本来应该长什么样——它产出的细节看起来合理,但不是原图真实存在的内容实用影响:(1) 照片放大做壁纸、海报,AI 超分效果通常不错;(2) 证件、票据、监控截图、有文字的图不要用 AI 超分——猜出来的笔画可能把字改了,而且看不出来;(3) 像素画放大必须用最近邻,任何插值都会把硬边糊掉。最好的办法永远是回去找原图

一套 App 图标,直接从 1024 缩出全部尺寸行吗?

大尺寸可以,16 到 48 这一档要单独处理为什么:小尺寸下一个像素的权重极大,缩出来的图标常常出现笔画粗细不匀、边缘半透明、中心偏移一个像素。分档建议:(1) 512 以上 —— 直接从矢量或 1024 源图导出,没问题;(2) 64 – 256 —— 从源图缩,缩完检查边缘,必要时轻微锐化;(3) 16 – 48 —— 建议重新设计:简化笔画、去掉细节、让主要边缘对齐到整数像素。真正的解法是从矢量出图:SVG 在每个尺寸各导出一次,而不是从一个位图缩多次。另外:每个尺寸都从同一张源图导出,不要用「先缩到 256、再从 256 缩到 128」这种链式做法,有损格式会累积压缩痕迹。

📐 打开 图片尺寸修改 填宽高直接改像素 · 一次导出多个尺寸 · 无需框选

🔗 相关阅读

全部教程 →