【问题标题】:In PHP, imagepng() accepts a filter parameter. How do these filters affect the function's output?在 PHP 中,imagepng() 接受一个过滤器参数。这些过滤器如何影响函数的输出?
【发布时间】:2011-03-04 03:59:16
【问题描述】:
这些过滤器如何影响 PHP 中 imagepng() 的输出?
- PNG_NO_FILTER
- PNG_FILTER_NONE
- PNG_FILTER_SUB
- PNG_FILTER_UP
- PNG_FILTER_AVG
- PNG_FILTER_PAETH
- PNG_ALL_FILTERS
The documentation 简单地说,“一个特殊的 PNG 过滤器,由 imagepng() 函数使用”。
似乎使用 PNG_NO_FILTER 会减少输出的文件大小,但除此之外,我不确定它是如何受到影响的。任何见解都将不胜感激。
【问题讨论】:
标签:
php
image
png
gd
gdlib
【解决方案2】:
根据http://www.w3.org/TR/PNG-Filters.html 的 PNG 规范,这些过滤器的目的是准备图像数据以实现最佳压缩。
使用无过滤器,扫描线是
未经修改传输;它只是
需要插入过滤器类型字节
在数据之前。
子过滤器传输
每个字节和之间的差异
相应字节的值
先前的像素。
Up 过滤器 就像 Sub
过滤除了像素
在当前像素的正上方,
而不仅仅是在它的左边,被使用
作为预测器。
平均过滤器使用平均
两个相邻像素(左和
上)预测 a 的值
像素。
Paeth 过滤器计算一个简单的
三者的线性函数
相邻像素(左、上、上
左),然后选择作为预测器
最接近的相邻像素
计算值。这种技术是由于
致 Alan W. Paeth [PAETH]。*
【解决方案3】:
来自链接到问题的 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 作为您的工作副本,以提高速度。