在PHP GD中,PNG_ALL_FILTERS会做什么,这与png图像的“自适应过滤”有什么关系?
背景
在php中,GD库中的imagepng函数具有用于过滤器的参数.这些常量表示的documentation on the filter type constants allowed仅“显示”:
A special PNG filter, used by the imagepng() function
确实非常有帮助.
SO上的This answer可以提供更多信息,但是缺少有关常量PNG_ALL_FILTERS的信息.对我来说,其他过滤器似乎是互斥的,那么“全部”怎么办?
在搜索中,我发现对于png过滤,一种好的策略(在某些情况下)将是为每条扫描线分别选择最优化的过滤器,称为“自适应过滤”.
考虑到上述情况,我猜想“自适应过滤”是通过PNG_ALL_FILTERS选项完成的.我猜对了吗?如果没有,PNG_ALL_FILTERS会做什么?我可以让GD从php进行自适应过滤吗?
非常感谢!
解决方法:
GD使用libpng.
libpng联机帮助页基本上说了pngimage描述所说的内容.如果那不是“确认”,那么您需要阅读libpng源进行确认.在libpng的png.h中,定义了宏:
/* Flags for png_set_filter() to say which filters to use. */
#define PNG_NO_FILTERS 0x00
#define PNG_FILTER_NONE 0x08
#define PNG_FILTER_SUB 0x10
#define PNG_FILTER_UP 0x20
#define PNG_FILTER_AVG 0x40
#define PNG_FILTER_PAETH 0x80
#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
PNG_FILTER_AVG | PNG_FILTER_PAETH)
宏用于png_write_find_filter(),其中包含如下代码:
if (filter_to_do & PNG_FILTER_SUB)
[calculate figure of merit for the SUB filter]
else if (filter_to_do & PNG_FILTER_UP)
[calculate figure of merit for the UP filter]
...
else if (filter_to_do & PNG_FILTER_PAETH)
[calculate figure of merit for the PAETH filter]
然后为要写入的扫描线选择具有最低品质因数的过滤器. PNG_ALL_FILTERS宏只是提供了一种启用所有过滤器进行测试的简短方法.