A principal motivação para o formato PNG era criar um substituto para o GIF que não era apenas gratuito, mas também uma melhoria em praticamente todos os aspectos. Como resultado, a compactação PNG é completamente sem perdas - ou seja, os dados da imagem original podem ser reconstruídos exatamente, bit por bit - como no GIF e na maioria das formas de TIFF.
PNG usa um processo de compactação em dois estágios:
- Pré-compactação: filtragem (previsão)
- Compactação: DEFLATE (consulte a Wikipedia )
A etapa de pré-compressão é chamada de filtragem, que é um método de transformação reversível dos dados da imagem para que o mecanismo de compactação principal possa operar com mais eficiência.
Como um exemplo simples, considere uma sequência de bytes aumentando uniformemente de 1 a 255:
1, 2, 3, 4, 5, .... 255
Como não há repetição na sequência, ela se comprime muito mal ou nada. Mas uma modificação trivial da sequência - ou seja, deixar o primeiro byte sozinho, mas substituir cada byte subsequente pela diferença entre ele e seu antecessor - transforma a sequência em um conjunto extremamente compressível:
1, 1, 1, 1, 1, .... 1
A transformação acima é sem perdas, pois nenhum bytes foi omitido e é totalmente reversível. O tamanho compactado desta série será muito reduzido, mas a série original ainda pode ser perfeitamente reconstituída.
Os dados reais da imagem raramente são tão perfeitos, mas a filtragem melhora a compactação em imagens em escala de cinza e em cores reais, e também pode ajudar em algumas imagens da paleta. O PNG suporta cinco tipos de filtros, e um codificador pode optar por usar um filtro diferente para cada linha de pixels na imagem:
O algoritmo funciona em bytes, mas para pixels grandes (por exemplo, RGB de 24 bits ou RGBA de 64 bits), apenas os bytes correspondentes são comparados, o que significa que os componentes vermelhos das cores dos pixels são tratados separadamente dos componentes verdes e azuis.
Para escolher o melhor filtro para cada linha, um codificador precisaria testar todas as combinações possíveis. Isso é claramente impossível, pois mesmo uma imagem de 20 linhas exigiria testar mais de 95 trilhões de combinações, onde "testar" envolveria filtragem e compactação da imagem inteira.
Os níveis de compressão são normalmente definidos como números entre 0 (nenhum) e 9 (melhor). Eles se referem a trocas entre velocidade e tamanho e estão relacionadas a quantas combinações de filtros de linha devem ser tentadas. Não existem padrões quanto a esses níveis de compactação; portanto, todo editor de imagens pode ter seus próprios algoritmos sobre quantos filtros tentar ao otimizar o tamanho da imagem.
O nível de compressão 0 significa que os filtros não são utilizados, o que é rápido, mas desperdício. Níveis mais altos significam que mais e mais combinações são tentadas nas linhas da imagem e apenas as melhores são mantidas.
Eu acho que a abordagem mais simples para a melhor compactação é compactar gradualmente cada linha com cada filtro, salvar o menor resultado e repetir para a próxima linha. Isso equivale a filtrar e compactar a imagem inteira cinco vezes, o que pode ser uma troca razoável de uma imagem que será transmitida e decodificada várias vezes. Valores mais baixos de compactação farão menos, a critério do desenvolvedor da ferramenta.
Além dos filtros, o nível de compactação também pode afetar o nível de compactação zlib, que é um número entre 0 (sem deflação) e 9 (deflação máxima). Como os níveis especificados de 0 a 9 afetam o uso de filtros, que são o principal recurso de otimização do PNG, ainda depende do desenvolvedor da ferramenta.
A conclusão é que o PNG tem um parâmetro de compactação que pode reduzir o tamanho do arquivo de maneira muito significativa, tudo sem a perda de um único pixel.
Fontes:
Documentação da libpng Portable Network Graphics da Wikipedia
Capítulo 9 - Compactação e filtragem