PNG_ALL_FILTERS,php gd中的自适应过滤

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宏只是提供了一种启用所有过滤器进行测试的简短方法.

上一篇:php-调整图像大小并显示而不保存


下一篇:php-蒙太奇或拼贴与GD库