这感觉是反的。一张照片装着一整个场景——几千种颜色、枝叶、纹理、噪点——而它只有 800 KB。一张几乎全白、上面有些文字的页面截图,却有 3 MB。比较简单的那张图是四倍大。
三件分开的事造成了这个,而且它们是相乘不是相加。
几乎每个系统都把截图存成 PNG,而它是无损的——它精确重现每一个像素,什么都不丢。
你相机用的 JPEG 是有损的。它丢掉眼睛不太可能察觉的细节,而它巨大的体积优势就来自那里。照片对这件事很宽容:它的内容本来就不规则,所以近似很容易藏起来。
所以这个比较其实不是“简单的图对复杂的图”。它是“什么都没丢对丢掉大部分”。
这通常是最大的因素,也是人们最没意识到的那个。
在高密度显示器上——任何近期的手机、多数笔记本——屏幕报告一个方便的尺寸,实际上却装着多得多的物理像素。一台表现得像 1440 像素宽的笔记本,横向可能有 2880 个实际像素。
截图抓的是物理像素。所以一个看起来 1000 像素宽的窗口,截出来是一张 2000 像素宽的图:是你以为你抓到的那个的四倍像素量。打开一张截图看看它的尺寸——那个数字通常会让人意外。
近期的 Apple 硬件和许多较新的手机,截取的是 Display P3 而不是 sRGB,而截图会带一个色彩配置文件来说明这件事。
相较于前两项,它对体积的影响不大。要知道它的理由不一样:它是为什么一张截图在别人用忽略配置文件的软件打开时,会奇怪地过饱和。
这是最明显的解法,而它通常是错的。
JPEG 靠近似来压缩,而它处理硬边很糟。文字、窗口边框、图标和界面线条,除了硬边什么都不是。把一张文字截图存成 JPEG,你会在每个字母周围得到一圈灰晕,每条边线旁边有淡淡的振铃。小字会变得明显更难读。
对一张界面截图来说,PNG 真的是正确的格式。问题不在格式——问题在于没有人对那张图做过任何处理。
大致按省下多少排序:
裁切到真正要紧的部分。多数截图是整个屏幕,而重点只是一个对话框。裁到相关的那四分之一,移除了四分之三的数据,画质上什么代价都没有,而且让收到的人看得更清楚。这几乎永远是能拿到的最大一笔。
减少颜色数量。一张照片可能含有十万种不同的颜色。一个应用程序窗口的截图可能只有两百种。PNG 可以用 256 色调色板存而不是全彩,这在界面内容上往往把文件砍掉 60–80%,而且看不出任何差别。许多压缩工具会自动做这件事;对截图来说,这是单一最有效的一步。
缩到 1×。如果那张截图是要用正常尺寸看、不是要拿来仔细端详,把尺寸减半就移除了四分之三的像素。当精细细节要紧时保留完整分辨率——比如一个“差一个像素的对齐”就是重点的 bug 反馈。
改用 WebP。无损 WebP 通常产生比 PNG 小约 25% 的文件,而像素完全相同。如果对方接受,那是白捡的。
把前两项合起来,通常能把一张 3 MB 的截图变成 200 KB 以内、而且看起来一模一样的东西。
如果你截到的大部分是照片——一个被大图主导的网页、一个视频帧——逻辑就翻过来了。那种内容是照片性质的,PNG 不适合它,而 JPEG 或有损 WebP 会小得多,而且没有有意义的损失。
规则是关于内容,不是关于“它来自屏幕”这件事:硬边和平涂颜色要 PNG;连续调要 JPEG 或 WebP。两者混合的截图要自己判断,而有损 WebP 处理这种混合比 JPEG 好。
很多过大的截图之所以存在,是因为有人把文字截图下来,而不是把它复制起来。
一则以文字贴上的错误消息大概 200 字节。同一则消息截成图是两 MB——大一万倍——而且它不能被搜索、选取、翻译、被屏幕阅读器念出来,也不能被那个想帮你的人复制到搜索框里。
当版面就是重点时截图。当文字就是重点时复制文字。