В PHP, imagepng() принимает параметр фильтра. Как эти фильтры влияют на выход функции?

Как эти фильтры влияют на вывод imagepng() в PHP?

  • 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 уменьшит размер файла вывода, но, кроме этого, я не уверен, как это повлияет. Любое понимание было бы действительно оценено.

Ответы

Ответ 1

В соответствии с спецификациями PNG на http://www.w3.org/TR/PNG-Filters.html Цель этих фильтров - подготовить данные изображения для оптимального сжатия.

С фильтром Нет строка сканирования передается без изменений; это только необходимо вставить байт типа фильтра перед данными.

Суб фильтр передает разница между каждым байтом и значение соответствующего байта предшествующий пиксель.

Фильтр Вверх похож на Sub фильтра, за исключением того, что пиксель непосредственно над текущим пикселем, а не только налево, используется как предиктор.

Средний фильтр использует среднее значение два соседних пикселя (слева и слева выше) для прогнозирования значения пиксели.

Фильтр Paeth вычисляет простой линейная функция трех соседние пиксели (слева, сверху, верхние слева), затем выбирает в качестве предиктора соседний пиксель, ближайший к вычисленное значение. Этот метод Алан У. Пает [PAETH]. *

Ответ 2

Из справочной страницы 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 для своих рабочих копий для скорости.

Ответ 3

Это все разные алгоритмы, которые PNG-кодер может использовать для определения значений пикселей. Не знаю много, но эта страница, по-видимому, выходит на определенную глубину: http://www.w3.org/TR/PNG-Filters.html