自建PNG压缩服务,量化之后再重压只多省几个点

举报
图映ImgIng助理 发表于 2026/11/06 15:59:37 2026/11/06
【摘要】 自建PNG压缩服务怎么排量化和重压:12张PNG里pngquant一步省66.3%~77.0%,再跑oxipng只多1.9~4.0个点;按透明、alpha全255、色数少先分流。

小站一旦收用户上传的图,压 PNG 就得有个固定流程。第三方 API 当然能用,TinyPNG 官网写注册后每月前 500 次免费,超出按次计费(2026-11-05 查阅)。量上来以后这就是一笔每月都要付的账,所以这篇按「在自己的机器上挂一个压缩服务」来设计流程。设计时绕不开的问题很具体:pngquant 量化完以后要不要再串一个 oxipng 或 zopflipng?每一步到底值多少?下面拿一组 12 张公开 PNG 的单次数据把这件事排一遍。样本来自 Wikimedia Commons,透明图 6 张,照片和截图各 3 张。机器是一台 Apple M4 的 Mac,文中体积单位一律是字节,画质这次没有比。

量化一步就拿走了大部分体积

参数先交代清楚。pngquant 3.0.3 用 --quality=65-80 --speed 4,oxipng 10.2.1 用 -o 4 --strip safe。只看重压效果的那一档再加 --nx,不让它改颜色类型。三组结果放在一张表里,百分比都相对该组原图。

分组 原图合计 只做无损(oxipng) pngquant 65–80 量化后再 oxipng
透明 6 张 501,130 -11.4% -77.0% -79.1%
照片 3 张 2,063,192 -24.8% -66.3% -70.3%
截图 3 张 1,890,089 -23.8% -68.2% -70.1%

先量化的话后面那一步 oxipng 在透明组只多省 2.1 个百分点。照片组多 4.0,截图组多 1.9。换个记账方式,把无损能省的先全部记在无损头上,剩下的才算量化的,量化依然占透明组总节省的 86%,照片组也有 65%。原因在 PNG 的块里看得见。RGBA 每个像素占 4 字节,量化成调色板后只剩 1 字节索引。Afro 这张图标的 IDAT 解压后原始数据从 1,049,088 降到 262,656。deflate 要处理的数据先少了约四分之三。后面再怎么换过滤器和压缩级别也只是在剩下那一小块上抠。

重压的收益要按输出体积算

只看「相对原图多省 2 到 4 个百分点」很容易觉得 oxipng 可以不挂。换个分母再看:带宽和存储按最终文件收钱,该拿量化后的输出来比。照片组 pngquant 输出合计 694,735。再过一遍 oxipng 到 612,968,相对量化输出又省了 11.8%。透明组从 115,382 到 104,707。截图组从 601,760 到 565,455。绝对值不算大。可每张图只多一道处理,这笔账我觉得划得来。

zopflipng 要不要再加?结果两头都有。量化后接 zopflipng 的透明组到 100,196,比接 oxipng 的 104,707 小。照片组却是 631,628,比 612,968 大。截图组 561,874 对 565,455 差不多。原因我没查。推断是这组参数下的 zopflipng(-y --filters=01234mepb)不做去 alpha、改调色板这类缩减,和算法强弱关系不大。一个服务里只放一个重压工具。排查问题时能少一个变量。我会选 oxipng。

透明图主要看量化留几色

透明组 6 张全是真透明。alpha 从 0 到 255。边缘是抗锯齿的半透明像素。这类图用不上 oxipng 的颜色类型缩减,表里那部分是 0.0。只重压能省 11.4%,单次跑 zopflipng 能省 14.4%。真正拉开差距的是量化时留多少颜色。pngquant 不设 quality 的默认档在透明图上体积是 65–80 档的 1.36 到 1.94 倍。Afro 默认档出来 256 色、8,079 字节。65–80 档是 23 色、4,171 字节,几乎差了一倍。所以透明这一路最该做成配置项的是 quality 区间。deflate 那几个参数这次没调过,先用默认。65–80 档的 Afro 只剩 7 档 alpha。边缘好不好看这组数据回答不了。

照片和截图先按颜色类型分流

照片组只做无损就能省 24.8%,截图组 23.8%,透明组只有 11.4%。差出来的那截是颜色类型缩减,照片组占 6.5 个百分点,截图组 9.3 个,透明组是 0。它对应两类文件:一类是 alpha 全 255 的 RGBA,第四个通道白占着;一类是实际色数不超过 256 的图,不动像素也能存成调色板。照片和截图各 3 张里都有 2 张属于前一类。样本这么少,这个比例当不了用户上传图里的真实比例,能说明的只是分流时值得先查这两项。

所以我设想的流程把分流放在最前面。服务收到一张 PNG 先读 IHDR 里的颜色类型,再扫一遍 alpha 和实际色数。有真透明的直接量化再接 oxipng。RGBA 但 alpha 全 255 的,或者色数不超过 256 的,先走 oxipng 无损。要留原图的到这里就停,缩略图这类派生图从原图另走量化那一路。剩下的照片和截图也是量化再接 oxipng。这条路上不安排「先无损再量化」,量化之后像素已经换了一套,前面那遍无损的成果剩不下多少。分流要决定的是一张图走无损还是走有损,不是两条路都跑一遍。

还有一处我没想明白。照片类调色板图上 oxipng 默认会重排调色板、重选过滤器,这一步在 3 张照片上有的变小有的变大,我没把它写成规则。zopflipng 单独压原图的数字和之前同参数跑的一次也对不上,原因还没查,文中那几个只算单次结果。

不打算自己搭的话,浏览器本地压图的工具走的也是减色加重压这类思路,比如图映 ImgIng 的图片压缩,它内部两步怎么排我不清楚。自己搭的话,上线前先拿站里现有的图按三路各跑一遍,再定透明图那一路的 quality 区间。这 12 张的比例换一批图未必还成立。

样本署名(12 张均来自 Wikimedia Commons):透明图 Adaptability icon(作者不详,CC0)、Afro Mobile Icon(Ben plc,公有领域)、Blue star icon stylized(PrazerCambraia,CC0)、Adenosine triphosphate ball-and-stick(FreeCliparts,CC0)、Anime girl publicdomainq(oksmith,CC0)、Apple cartoon with transparent background(Toby8991,CC0);照片 Alekszej Fedoricsev(Javelin Bayraktar,CC0)、Directiva junto a presidente APPA(JaimeRuix,CC BY-SA 4.0)、Steve Selvin(UC Berkeley Public Health,CC BY 4.0);截图 2011 Talend MDM studio(Copyleft,CC BY-SA 3.0)、2019-06-19 OpenProject by Benoit Soubeyran(Mazuritz,CC BY-SA 4.0)、2020-06-29 Screenshot The Book Fort Monmouth - Fort Montagu(Stefan Kühn,CC0)。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。