【发布时间】:2017-07-12 13:15:32
【问题描述】:
PNG 可以通过不同的方式进行优化。
减少网站的 PNG 大小似乎是一个不错的选择,以减少带宽使用和数据传输并减少对环境的影响。由 Google 和其他服务推荐。
但是当计算机读取它来渲染它时,优化 PNG 对 CPU 负载有影响吗?换句话说,减小 PNG 大小以优化大小是限制环境影响的好主意吗?
【问题讨论】:
标签: image optimization png
PNG 可以通过不同的方式进行优化。
减少网站的 PNG 大小似乎是一个不错的选择,以减少带宽使用和数据传输并减少对环境的影响。由 Google 和其他服务推荐。
但是当计算机读取它来渲染它时,优化 PNG 对 CPU 负载有影响吗?换句话说,减小 PNG 大小以优化大小是限制环境影响的好主意吗?
【问题讨论】:
标签: image optimization png
当计算机读取 PNG 进行渲染时,优化 PNG 是否会对 CPU 负载产生影响?换句话说,减小 PNG 大小以优化大小是限制环境影响的好主意吗?
我不确定一个问题是从另一个问题开始的,但是,关于第一个问题:
不,优化PNG压缩的努力,使图像更小,只影响压缩端。在客户端(解压缩器)端,速度或 CPU 使用率的差异几乎为零。
更准确地说:PNG 压缩主要受两个因素影响:“像素过滤”算法/策略(特定于 PNG)和 ZLIB 压缩级别。优化第一个对解压没有影响 (“未过滤”逻辑是一回事)。第二个因素也对减压速度几乎没有影响(it might even be slightly beneficious)。
【讨论】:
正如@leonbloy 在他的回答中所说,zlib 压缩级别对解压缩速度几乎没有影响。然而,PNG 过滤器的选择确实有一个明显的效果:AVG 和 PAETH 过滤器都需要比简单的过滤器更多的内存和 CPU 时间来反过滤。
Libpng 允许您通过“png_set_filter()”函数来控制它。要使用自适应过滤实现最大压缩,请使用
png_set_filter(write_ptr, 0, PNG_ALL_FILTERS);
为了避免较慢的 AVG 和 PAETH 过滤,请使用
png_set_filter(write_ptr, 0, PNG_NONE_FILTER|PNG_SUB_FILTER|PNG_UP_FILTER);
或者搭配libpng-1.6.22及以后,可以更方便的使用
png_set_filter(write_ptr, 0, PNG_FAST_FILTERS);
使用 pngcrush-1.8.1 或更高版本,您可以使用
pngcrush -speed file.png file_pc.png
选择 NONE、SUB 和 UP 过滤器,但避免使用 AVG 和 PAETH (请注意,pngcrush 也有一个“-fast”选项,但这是为了不同的目的,即选择快速压缩方法)。
当输出的预期用途是通过网络传输到应用程序时,文件大小是主要影响,您希望使用最大压缩。但是当文件将从您的本地磁盘访问时 或从内存中,则解码速度占主导地位,您需要使用“速度”优化,这将牺牲一些增加的文件大小以获得更快的解码。
【讨论】: