Em PHP, imagepng () aceita um parâmetro de filtro. Como esses filtros afetam a saída da function?

Como esses filtros afetam a saída de imagepng () no PHP?

  • PNG_NO_FILTER
  • PNG_FILTER_NONE
  • PNG_FILTER_SUB
  • PNG_FILTER_UP
  • PNG_FILTER_AVG
  • PNG_FILTER_PAETH
  • PNG_ALL_FILTERS

A documentação simplesmente diz: “Um filtro PNG especial, usado pela function imagepng () para cada um deles.

Parece que usar PNG_NO_FILTER reduzirá o tamanho do arquivo da saída, mas, além disso, não tenho certeza de como isso é afetado. Qualquer visão será muito apreciada.

De acordo com as Especificações PNG em http://www.w3.org/TR/PNG-Filters.html O objective desses filtros é preparar os dados da imagem para uma compactação ideal.

Com o filtro None , o scanline é transmitido sem modificação; só é necessário inserir um byte de tipo de filtro antes dos dados.

O subfiltro transmite a diferença entre cada byte e o valor do byte correspondente do pixel anterior.

O filtro Up é exatamente como o filtro Sub, exceto que o pixel imediatamente acima do pixel atual, em vez de apenas à esquerda, é usado como o preditor.

O filtro Média usa a média dos dois pixels vizinhos (esquerda e acima) para prever o valor de um pixel.

O filtro Paeth calcula uma function linear simples dos três pixels vizinhos (esquerda, superior, superior esquerda) e, em seguida, escolhe como preditor o pixel vizinho mais próximo do valor calculado. Esta técnica é devida a Alan W. Paeth [PAETH]. *

Da página de manual imagepng () ligada à pergunta,

filtros

Permite reduzir o tamanho do arquivo PNG. É um campo bitmask que pode ser configurado para qualquer combinação das constantes PNG_FILTER_XXX. PNG_NO_FILTER> ou PNG_ALL_FILTERS também podem ser usados ​​para desativar ou ativar todos os filtros.

Então, para permitir que libpng tente os filtros none, sub e up, você usaria

PNG_FILTER_NONE|PNG_FILTER_SUB|PNG_FILTER_UP 

PNG_ALL_FILTERS é apenas uma abreviatura para

 PNG_FILTER_NONE|PNG_FILTER_SUB|PNG_FILTER_UP|PNG_FILTER_AVG|PNG_FILTER_PAETH 

Quanto ao filtro a ser usado, depende da imagem. As imagens com 256 ou menos colors geralmente comprimem melhor com PNG_NO_FILTER, enquanto as imagens com muitas colors (como fotos) geralmente comprimem melhor com PNG_FILTER_SUB ou PNG_ALL_FILTERS. Aplicativos como “optipng” ou meu “pngcrush” tentam otimizar a seleção do filtro. Se você quiser usar um desses aplicativos de terceiros para otimização final, você deve usar apenas PNG_NO_FILTERS para suas cópias de trabalho, para velocidade.

Esses são todos algoritmos diferentes que o codificador PNG pode usar para determinar os valores de pixel. Não conheço muito, mas esta página parece entrar em alguma profundidade: http://www.w3.org/TR/PNG-Filters.html