在 PHP 中,imagepng() 接受一个 filter 参数。这些筛选器如何影响函数的输出?

2022-08-31 01:03:46

这些过滤器如何影响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会减小输出的文件大小,但除此之外,我不确定它是如何受到影响的。任何见解将不胜感激。


答案 1

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

使用“无”过滤器,扫描线的传输未经修改;只需要在数据之前插入过滤器类型字节。

子滤波器传输每个字节与前一个像素的相应字节值之间的差值。

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

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

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


答案 2

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

过滤 器

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

因此,要让libpng尝试无,子和向上过滤器,您可以使用

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作为工作副本,以提高速度。


推荐