教程12 分钟阅读

AI 图片压缩:减小文件,保住重要细节

同一静物的六份 JPEG、WebP 与 PNG 导出,附真实体积、原始文件和未经修饰的局部,帮助判断压缩取舍。

好的图片导出,是在目标显示尺寸下,仍然保留读者需要看清的内容,同时让文件足够小。先确定使用尺寸,再从同一源图比较真实编码结果,最后检查关键细节。一个通用的“质量数值”替你做不了这个决定。

茶叶包装图需要文字能读、纸张可信、亚麻仍然像织物。压缩文件时,构图可能丝毫没变,这三项却都变了。缩略图容易掩盖问题;过度放大又可能让本来适合网页的导出看起来不堪使用。你需要同时检查实际版面和局部细节。

我们为本文生成了一张原创静物,再进行一组小型、可复现的编码练习。场景是虚构的,下面的文件大小、解码像素检查和裁切却都来自真实处理结果。这是对这些文件的检查,不是图像模型或压缩格式的普遍排名。

标着 CEDAR 的奶油色茶盒,旁边是陶碗、干茶叶、纹理纸和橄榄绿亚麻。
完整的 1200 × 800 JPEG,质量设置为 82。观察 CEDAR 文字、纸面与布料织纹。包装是虚构的,场景由 AI 生成;后续压缩则是真实执行的。

打开质量滑杆前,先写清交付要求

这次练习假设网站需要完整场景,尺寸为 1200 × 800 像素,接受 JPEG 或 WebP,每张图的体积上限是 100,000 字节。标签必须读得清,包装仍要有纸张质感,布料仍应让人认出是织物。页面通常会以小于原生尺寸的大小显示它。这些是练习条件,不是对所有网站的统一建议。

把原始下载保存在输出文件夹之外,避免后续操作覆盖。先记录它的实际尺寸、格式和文件大小,再确认最终位置是否允许裁切。本例要求保留整幅场景,所以即便删除右侧亚麻能减少体积,也是在改变题目,不能算完成了题目。它还是一张不透明的静态图片;如果需求涉及透明背景或动画,必须另行检查格式能力。

这份简短需求把三个容易混在一起的问题拆开:接收端能不能打开,文件是否满足上限,画面是否保留需要表达的材质。前两项通过,不代表第三项通过。编码器的质量数字只是一项设置,不能替网站或编辑决定“纸张现在还能不能像纸张”。后面的每一次取舍,都回到这三项检查。

先分开三种缩小文件的方法

裁切去掉一部分画面,缩放改变像素网格,编码则决定怎样把这张网格存进文件;解码后得到的像素可能保留原值,也可能发生变化。

这是三种不同的决策。网页只需要一张小卡片时,保留极大的源图可能浪费;客户需要整幅横幅时,裁成小方图也不能算优化成功。先确定构图和所需尺寸,再调整压缩。分辨率指南解释了显示尺寸、文件像素和可信细节的区别。

无损压缩能够不变地重建被编码的像素值。有损压缩允许改变像素以减少数据;有时很难看出变化,有时会损伤重要内容。只看格式名称不够:WebP 同时支持无损与有损模式。MDN:图片格式指南、Google:WebP 压缩方法

把已经劣化的 JPEG 另存为无损 PNG,不会重建丢失的纹理,只会保存你现在已有的像素。反复导出前,先留住母版。

这次究竟编码了什么

生成的原图为 1536 × 1024 像素。我们只解码一次,用 Lanczos3 缩放一次,得到 1200 × 800 的 RGB 像素,再把完全相同的原始像素缓冲区交给六组编码设置。任何候选都没有额外锐化、降噪、调色或裁切。

所有输出尺寸相同。JPEG 使用 MozJPEG,色度抽样为 4:2:0;WebP 的 effort 为 6;PNG 使用压缩等级 9,不做调色板缩减。各候选都没有添加嵌入配置或其他元数据,在本练习中统一按 sRGB 解释。下表的质量数值属于各自编码器,不是跨格式的等画质刻度。

导出版本实际文件大小
无损 PNG1,924,424 字节
无损 WebP970,870 字节
JPEG,质量 82103,744 字节
JPEG,质量 3535,766 字节
WebP,质量 7665,208 字节
WebP,质量 3030,012 字节

无损 PNG 与无损 WebP 解码后,RGB 字节都与缩放后的参照完全一致。它们大小不同,说明无损存储不只有一种固定体积。有损候选的字节则与参照不同。但这些结果并没有测量某位观看者能否察觉差别。

怎样读数字,才不会把体积当成细节

缩放后的参照一共有 1200 × 800 = 960,000 个像素。在本次原始缓冲区中,每个像素的红、绿、蓝通道各占一个字节,所以共有 2,880,000 字节。这是解码后的 RGB 数组大小,不是说每一份 PNG 都应该这么大。文件封装、压缩和元数据会影响磁盘体积;显示软件在内存中使用的工作缓冲区,也可能是另一种结构。

对这张图,无损 WebP 比无损 PNG 少 1,924,424 − 970,870 = 953,554 字节,约为这份 PNG 大小的 49.6%。可以把它写成这一张图的真实节省,却不能推成“WebP 能把所有图片减半”。也不能再推成网页加载快了一倍:本次没有测网络、缓存和页面其他资源。相同像素能够占用不同大小,正是编码方式在发挥作用。

再拿 100,000 字节上限来筛选。质量 82 的 JPEG 超出 3,744 字节;质量 76 的 WebP 还余下 34,792 字节;两份质量更低的文件也能装得下。但“装得下”只是第一关,不能替代看图。如果接收端写的是 100 KiB,上限则为 102,400 字节。先问清单位,别靠文件管理器四舍五入后的“约 100 KB”判断合格。

可以下载生成原图 PNG、缩放后的无损参照和编码记录。记录中包含实际设置、库版本、哈希、裁切坐标及对应文件名。复现脚本使用 Node.js 与 sharp 0.35.5,开头注释给出了运行命令。它描述的是这一张图,不代表所有图片内容。

从一份源图亲手复现

另建一个本地文件夹,把原始 PNG 和复现脚本放在一起。电脑具备 Node.js 后,依次运行下面三条命令。第三条里的 encoded 是输出目录,结果不会写回原图:

npm init -y
npm install sharp@0.35.5
node reproduce.mjs tea-original.png encoded

脚本读取源图,缩放到指定尺寸,向 encoded 输出六份候选和 result.json,不会再次调用图像生成。先把它报告的体积与哈希对照本文记录,再讨论视觉取舍。如果尺寸不同,说明你比较的已不是同一个处理任务;如果像素尺寸一致而字节有差异,继续检查输入文件、参数和库版本。

编码库的构建版本可能改变最终字节。复现不一致时,应记录自己的版本和结果,而不是把本文数字照抄到另一批文件上。你仍然可以用相同方法进行一次有边界的比较,但要说明那是自己的运行。这也避免把“步骤可以照做”误解为“在所有机器上必定生成完全相同的压缩文件”。

无损检查比较的是解码后的 RGB 字节,而不是两份 PNG 的整文件哈希。这一点很重要:文件采用不同压缩方式,整文件完全可以不同,解码出来却是同一张图。反过来,有损图在小尺寸下非常相似,也不代表它保留了参照的所有像素。一个检查回答数值是否相同,另一个回答变化是否影响用途,两者不能互相代替。

不使用代码也能完成有用的练习。在图形工具中始终从同一份保留源图导出,保持最终尺寸相同,记录每次格式与设置,并把结果标为自己的测试。不要期待另一个应用里的“76”一定复现本文 WebP,也不要假定它的 JPEG “82”使用相同色度抽样。只有实际编码条件匹配时,才有理由要求相同的结果。

分开看边缘和纹理

下面的局部都取自解码结果中同一个 240 × 150 区域,直接保存为 PNG,没有重新缩放或修饰。网页可能按版面调整显示大小;要逐像素检查,请下载候选,在编辑器里用 100% 视图打开。

标签矩形从坐标 (335, 340) 开始,织纹矩形从 (810, 515) 开始,坐标均以 1200 × 800 文件左上角为起点。自己做对照时也保持坐标相同,别把一张图较清楚的位置,与另一张较柔软的位置放在一起。若裁切后又改变尺寸,应把“裁切”和“缩放”分开记录;否则你可能是在评价插值造成的差别,而不是原先的编码。本文提供的裁切保留了各候选解码后对应位置的原始像素,没有为展示效果补细节。

参照图中的 CEDAR 文字、叶片图案,以及周围细密的纸张纹理。
无损参照。字缘清晰,深色油墨周围仍能看到细密纸纹。
JPEG 质量 35 的同一区域,文字周围出现不均匀色块,纸面细节减少。
JPEG 质量 35。文字仍然读得出,但纸面更斑驳,深色边缘出现小伪影。只检查可读性会漏掉这些变化。

在这个局部里,低质量 JPEG 留住了单词,却削弱了包装的质感。如果纸张工艺是商品主图需要传达的内容,这就重要;如果只是一张很小的列表卡片,同样的缺陷可能没那么关键。能够接受多少损失,取决于用途。

参照图的橄榄绿亚麻局部,交织线条和小高光清楚可辨。
无损参照。明暗线条交织,让褶皱表面保留了织物的感觉。
WebP 质量 30 的同一布料局部,细线合并成更平滑的大块纹路。
WebP 质量 30。褶皱还在,细密织线却合并成较大的笔触。这是这个局部、这组设置中的实际观察。

纹理和文字是两项不同的检查。压缩可能留住大轮廓,却改变区分布料、皮肤、木材或纸张的小变化。Google 介绍了有损 WebP 的预测、量化与滤波过程,但没有承诺某一质量值会保留所有纹理。WebP 压缩方法

不要只挑最糟的一小块,就替整张图下结论。至少检查一处有意义的边缘、一种材料表面,以及墙面这样的平滑区域。本例生成源图中的部分布料本来就不在最清晰的平面上,现成的柔软区域不能自动算作压缩造成的缺陷。先对照无损参照的同一坐标,再讨论原因。

同样,不要为了让压缩版看起来更好,单独对它锐化后再声称是同条件比较。那已经换成另一条处理流程。如果实际交付确实需要锐化,应另外记录这套流程,并评价最后得到的成品;最初六份编码文件仍应保留,方便别人检查压缩本身造成的变化。这样既能做后期,也不会让后期掩盖证据。

在实际使用尺寸下决定取舍

假设文章图片约占 676 CSS 像素宽,我们会先尝试65,208 字节、质量 76 的 WebP,再放回实际版面与参照比较。完整画面仍能传达主体与标签,仔细看却仍有纹理损失。这是针对这一场景的编辑起点,不是“视觉无损”的认证。

质量 76 的 WebP 完整 CEDAR 茶盒场景,标签、纸张与橄榄绿亚麻同时可见。
实际候选文件:65,208 字节,WebP 质量 76,1200 × 800。它与前面的 JPEG 使用相同输入像素,但属于另一份编码。请在目标显示大小下检查文字和材质;源图相同,不代表文件相同,也不代表两种格式的质量数值等价。

如果页面的主题就是亚麻表面,应提高质量,或选择损失更少的导出。需要兼容收件人的软件时,可以在对方环境尝试103,744 字节、质量 82 的 JPEG。如果要求解码像素完全一致,可用无损 WebP或参照 PNG,并核对接收端支持。也提供刻意压得更小的 JPEG 质量 35与 WebP 质量 30,方便自行对照。

按这个顺序检查候选:实际版面大小、100% 局部、手机小卡片等最小的重要用途。高像素密度屏幕上,CSS 尺寸与源像素的关系会变化,检查时要包含预期设备与响应式图片行为。不要只凭聊天软件里的缩略图决定,它可能又被重新编码过。

两种用途,允许得出不同答案

对上面的 100,000 字节文章配图任务,质量 76 的 WebP 满足体积与格式条件,接下来才轮到材质和文字验收。把接受理由写成读者能观察的东西:在版面大小下,单词是否清楚;盒面是否仍呈现纸张;布料是否还像布料。“因为设置是 76”回答不了其中任何一项。

如果页面改成纺织面料的细节介绍,读者需要看的恰恰可能是单根织线。此时要重新对照无损参照与更高质量候选,不能因为同一个 WebP 已在另一篇文章里通过,就直接搬用。适合作为场景配图的文件,未必适合检查材料。用途变了,验收标准就变了,这不是测试自相矛盾。

如果所有满足体积的候选都丢掉了必须保留的细节,应明确报告约束冲突。可以讨论增加体积预算,或另行批准一张细节裁切;不能悄悄把关键纹理抹去,再宣布压缩完成。若改做裁切,还要重新记录构图与尺寸,因为它已经是新的交付件。

还要核对显示需求本身。600 CSS 像素宽、设备像素比为 2 的位置,对应横向 1200 个设备像素;1200 CSS 像素宽、同样像素比的位置,则对应 2400 个。本文的 1200 像素文件无法提供 2400 列彼此独立的源细节。放大可以改变网格,却不能改变这次已经完成的压缩测量。MDN:devicePixelRatio

交付自己真正检查过的文件

每个候选都从保留的母版导出,不从上一份有损候选继续导出。记录最终选择的格式、尺寸和设置。重新打开交付文件,确认体积,并检查文字、纹理、平滑墙面与主体轮廓。

上传之后,也要看真正被页面提供的那份图片。发布平台可能生成另一种尺寸或编码,本地导出好看,并不证明线上页面使用了同样的字节。若颜色发生变化,应另行排查;色彩配置指南说明了为什么 ICC 配置并非随手就能删除的元数据。

结果不满意时,让具体失败决定下一项检查,不要一律再拉低或拉高质量:

失败现象再次导出前先查什么
只有网页上的文字变软网页实际提供的文件、显示尺寸与缩放方式,并和本地候选比较
文件出乎意料地大是否真正改了像素尺寸、是否选了无损模式、是否导出了另一份源图
经过几轮修改,纹理越来越差每次是否都从母版导出,还是在上一份有损副本上继续保存
换格式后文件一样大解码后的实际细节;相同字节数不能证明相同画质

例如,本地标签裁切很清楚,上传预览却软了。此时第一步不是再生成一份质量更低的图,而是取回网页实际提供的文件,对照它与已批准本地文件的尺寸和像素。两者不同,就沿着中间的处理步骤排查;两者相同,再检查页面怎样显示它。先定位阶段,才能避免拿一份原本合格的源图,反复压缩来修补另一个环节的问题。

如果接收端只能展示一张小预览,也别急着用它否定完整附件。确认对方检查的是预览还是原始下载,再把同一文件、同一倍率的观察放在一起。相反,如果需求就是那张小预览在手机上的可读性,原图放大后多精细也不能替它过关。验收对象要和真实用途一致,不能只挑最有利于自己的观看方式。

用三个小练习检查你的取舍

上传器只接受小于 100,000 字节的文件,哪些候选通过第一关? 质量 35 的 JPEG、质量 76 的 WebP、质量 30 的 WebP。它们有资格进入画面验收,不代表其中最小的那份自动获胜。质量 82 的 JPEG 虽然接近上限,仍然超出;口头把它称为“约 100 KB”,不会改变文件的字节数。

无损 PNG 比无损 WebP 大,是否说明它一定保留了更多细节? 不说明。本例中,两者解码后的 RGB 缓冲区完全一致,已有字节相等检查作为依据。差异来自存储方式。换一张图,文件大小关系也可能改变,所以判断应依靠实际输入和检查,不能把扩展名当成画质等级。

打开小 JPEG,再存为 PNG,是否已经还原了参照? 没有。你只是把 JPEG 解码后的结果装进无损格式。压缩损失不会因为后缀变成 PNG 自动回来。若要取回本次参照的像素,应回到保留的源图或无损参照,重新开始导出。

因此,一次可以复核的交付需要三份证据:接收端能使用、符合体积约束的具体文件;写明尺寸与编码的短记录;围绕这次任务关键细节的实际检查。把它们与最终文件放在一起,后续编辑才不容易误把“更小”当成“更适合”,用另一份候选替换掉已经作过判断的成品。

最后问一个具体问题:这个导出文件,是否在接收端能使用的体积内,保留了该位置需要的细节?这个问题能支持一次有依据的交付决定,“所有图片都设成质量 80”不能。

LocalBanana Team@LocalBananaAI更新于

继续阅读

查看全部