16

这些过滤器如何影响 PHP 中imagepng()的输出?

  • PNG_NO_FILTER
  • PNG_FILTER_NONE
  • PNG_FILTER_SUB
  • PNG_FILTER_UP
  • PNG_FILTER_AVG
  • PNG_FILTER_PAETH
  • PNG_ALL_FILTERS

文档简单地说,“一个特殊的 PNG 过滤器,由 imagepng() 函数使用”。

似乎使用 PNG_NO_FILTER 会减少输出的文件大小,但除此之外,我不确定它是如何受到影响的。任何见解将不胜感激。

4

3 回答 3

15

根据http://www.w3.org/TR/PNG-Filters.html上的 PNG 规范,这些过滤器的目的是准备图像数据以实现最佳压缩。

使用None 过滤器,扫描线不加修改地传输;只需在数据前插入一个过滤器类型字节。

Sub过滤器传输每个字节与先前像素的相应字节的值之间的差异。

Up 过滤器与 Sub 过滤器类似,只是将当前像素正上方的像素用作预测器,而不是仅在其左侧。

平均过滤器使用两个相邻像素(左侧和上方)的平均值来预测像素的值。

Paeth 滤波器计算三个相邻像素(左、上、左上)的简单线性函数,然后选择最接近计算值的相邻像素作为预测器。这项技术归功于 Alan W. Paeth [PAETH]。*

于 2010-06-15T19:50:54.880 回答
4

从链接到问题的 imagepng() 手册页,

过滤器

允许减小 PNG 文件的大小。它是一个位掩码字段,可以设置为 PNG_FILTER_XXX 常量的任意组合。PNG_NO_FILTER > 或 PNG_ALL_FILTERS 也可用于分别禁用或激活所有过滤器。

因此,要让 libpng 尝试使用 none、sub 和 up 过滤器,您可以使用

PNG_FILTER_NONE|PNG_FILTER_SUB|PNG_FILTER_UP

PNG_ALL_FILTERS 只是简写

PNG_FILTER_NONE|PNG_FILTER_SUB|PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH

至于使用哪种滤镜,取决于图像。具有 256 种或更少颜色的图像通常使用 PNG_NO_FILTER 可以更好地压缩,而具有多种颜色的图像(例如照片)通常使用 PNG_FILTER_SUB 或 PNG_ALL_FILTERS 可以更好地压缩。像“optipng”或我的“pngcrush”这样的应用程序会尝试优化过滤器选择。如果您打算使用其中一个第三方应用程序进行最终优化,您应该只使用 PNG_NO_FILTERS 作为您的工作副本,以提高速度。

于 2015-12-04T16:04:36.497 回答
2

这些都是 PNG 编码器可以用来确定像素值的不同算法。不知道很多,但这个页面似乎深入一些:http ://www.w3.org/TR/PNG-Filters.html

于 2010-06-15T19:45:51.320 回答