这些过滤器如何影响 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 会减少输出的文件大小,但除此之外,我不确定它是如何受到影响的。任何见解将不胜感激。
根据http://www.w3.org/TR/PNG-Filters.html上的 PNG 规范,这些过滤器的目的是准备图像数据以实现最佳压缩。
使用None 过滤器,扫描线不加修改地传输;只需在数据前插入一个过滤器类型字节。
Sub过滤器传输每个字节与先前像素的相应字节的值之间的差异。
Up 过滤器与 Sub 过滤器类似,只是将当前像素正上方的像素用作预测器,而不是仅在其左侧。
平均过滤器使用两个相邻像素(左侧和上方)的平均值来预测像素的值。
Paeth 滤波器计算三个相邻像素(左、上、左上)的简单线性函数,然后选择最接近计算值的相邻像素作为预测器。这项技术归功于 Alan W. Paeth [PAETH]。*
从链接到问题的 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 作为您的工作副本,以提高速度。
这些都是 PNG 编码器可以用来确定像素值的不同算法。不知道很多,但这个页面似乎深入一些:http ://www.w3.org/TR/PNG-Filters.html