【问题标题】: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


    【解决方案1】:

    这些都是 PNG 编码器可以用来确定像素值的不同算法。不知道很多,但这个页面似乎深入一些:http://www.w3.org/TR/PNG-Filters.html

    【讨论】:

      【解决方案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 作为您的工作副本,以提高速度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-17
        • 1970-01-01
        • 1970-01-01
        • 2022-12-04
        相关资源
        最近更新 更多