Como o PNG é sem perdas, pois possui um parâmetro de compactação?


157

Diz-se que os arquivos PNG usam compactação sem perdas. No entanto, sempre que estou em um editor de imagens, como o GIMP e tento salvar uma imagem como um arquivo PNG, ele solicita o parâmetro de compactação, que varia entre 0 e 9. Se houver um parâmetro de compactação que afeta a precisão visual de a imagem compactada, como torna o PNG sem perdas?

Recebo comportamento sem perdas apenas quando defino o parâmetro de compactação para 9?


40
A maioria dos algoritmos de compactação sem perdas possui ajustáveis ​​(como o tamanho do dicionário), que são generalizados em um controle deslizante "quanto esforço deve ser feito para minimizar o tamanho da saída". Isso é válido para ZIP, GZip, BZip2, LZMA, ... #
Daniel B

20
A questão pode ser declarada de maneira diferente. Se nenhuma qualidade é perdida na compactação, por que não usar sempre a compactação produzindo o menor tamanho? A resposta seria: requer mais RAM e mais tempo de CPU para compactar e descomprimir. Às vezes, você deseja uma compactação mais rápida e não se importa tanto com a taxa de compactação.
kasperd

14
A compactação PNG é quase idêntica aos arquivos ZIP. Você pode compactá-los mais ou menos, mas você recupera o arquivo exato quando ele é descompactado - é isso que o torna sem perdas.
mikebabcock

13
A maioria dos softwares de compactação, como Zip e Rar, permite que você insira "nível de compactação", que permite escolher entre arquivos menores <--> menor tempo. Isso não significa que esses softwares descartam dados durante a compactação. Essa configuração (no GIMP, pngcrush, etc) é semelhante.
Salman A

2
@ naxa: Não há advertências sobre o quão sem perdas o png é realmente. É sempre 100% sem perdas. O artigo apenas avisa sobre erros que alguns navegadores antigos tiveram em sua implementação PNG para lidar com a correção de gama. E isso só é significativo se você precisar combinar a cor com as cores CSS (que não são corrigidas por gama).
Pauli L

Respostas:


184

PNG é sem perdas. O GIMP provavelmente não está usando a melhor palavra nesse caso. Pense nisso como "qualidade de compactação" ou, em outras palavras, "nível de compactação". Com menor compactação, você obtém um arquivo maior, mas leva menos tempo para produzir, enquanto que com maior compactação, você obtém um arquivo menor que leva mais tempo para produzir. Normalmente, você obtém retornos decrescentes (ou seja, não diminui muito o tamanho em comparação com o aumento do tempo necessário) ao subir para os níveis mais altos de compactação, mas depende de você.


42
Além disso, a compactação PNG na verdade possui muitos parâmetros ajustáveis, nos quais os ajustes em qualquer direção podem reduzir o tamanho da saída, dependendo do conteúdo da fonte - é muito mais complexo do que um simples controle deslizante "melhor" e "pior". Para propósitos gerais, não é muito importante, mas se você quiser o menor absoluto, use uma ferramenta como pngcrushessa para comparar muitas variações pelo menor possível.
Bob

4
Um nível de compactação mais alto aumenta o tempo de compactação, mas também afeta a descompactação ?
Nolonar

10
@Nolonar Geralmente não; se alguma coisa, um nível de compactação mais alto geralmente diminui o tempo de descompactação, porque há menos dados para que ele precise ler e processar. O tempo de compactação mais longo se deve ao trabalho mais minucioso de encontrar padrões para compactar (simplificando demais).
macia

1
A resposta de @fluffy LordNeckbeard fez com que a compressão mais alta levasse 5x mais tempo para decodificar do que a menor.
André Chalella

1
Para PNG, é bastante comum ter um tempo de descompactação mais longo para arquivos compactados melhor. O problema é que, com PNG, um truque possível é aplicar o algoritmo de compactação repetidamente, desde que o arquivo fique menor. Depois que o tamanho aumenta, você para de aplicá-lo. Portanto, é bem possível que você aplique o algoritmo de compactação 5 ou 6 vezes, o que significa que você precisa descompactar o arquivo 5 ou 6 vezes para exibir a imagem.
yo '

213

PNG é compactado, mas sem perdas

O nível de compactação é uma troca entre o tamanho do arquivo e a velocidade de codificação / decodificação. Para generalizar demais, mesmo os formatos sem imagem, como FLAC, têm conceitos semelhantes.

Níveis de compactação diferentes, a mesma saída decodificada

Embora os tamanhos dos arquivos sejam diferentes, devido aos diferentes níveis de compactação, a saída decodificada real será idêntica.

Você pode comparar os hashes MD5 das saídas decodificadas com o ffmpeguso do muxer MD5 .

Isso é melhor mostrado com alguns exemplos:

Crie arquivos PNG:

$ ffmpeg -i input -vframes 1 -compression_level 0 0.png
$ ffmpeg -i input -vframes 1 -compression_level 100 100.png
  • Por padrão ffmpeg, usará -compression_level 100para saída PNG.

Compare o tamanho do arquivo:

$ du -h *.png
  228K    0.png
  4.0K    100.png

Decodifique os arquivos PNG e mostre os hashes MD5:

$ ffmpeg -loglevel error -i 0.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

$ ffmpeg -loglevel error -i 100.png -f md5 -
3d3fbccf770a51f9d81725d4e0539f83

Como os dois hashes são os mesmos, você pode ter certeza de que as saídas decodificadas (o vídeo bruto não compactado) são exatamente as mesmas.


26
O +1 não sabia que o ffmpeg podia lidar com pngs.
Lekensteyn

21
@Lekensteyn É ótimo para fazer capturas de tela . Exemplo para pular 30 segundos e tirar a captura de tela: ffmpeg -ss 30 -i input -vframes 1 output.pngTambém é bom para criar vídeos com imagens e vice-versa.
Llogan

Isso significa que o PNG precisa ser descompactado toda vez que precisa ser renderizado? Porque se isso é verdade, devemos ser
akshay2000 28/11

Se você reler o arquivo do disco ou cache, sim, ele deverá ser descompactado. Dentro da mesma página, o cache provavelmente pode reutilizar a versão descompactada.
David Mårtensson 28/11

1
@ akshay2000 Depende de como o programa funciona, que renderiza o PNG. Normalmente, o arquivo é lido do disco, descompactado e armazenado em buffer na RAM. Portanto, enquanto estiver armazenado em buffer na RAM, não será necessário descomprimir a imagem novamente.
XZise

24

A compactação PNG ocorre em dois estágios.

  1. A pré-compactação reorganiza os dados da imagem para que sejam mais compactáveis ​​por um algoritmo de compactação de uso geral.
  2. A compactação real é feita pelo DEFLATE, que procura e elimina sequências de bytes duplicadas, substituindo-as por tokens curtos.

Como a etapa 2 é uma tarefa que consome muito tempo / recursos, a biblioteca zlib subjacente (encapsulamento do DEFLATE bruto) usa um parâmetro de compactação que varia de 1 = compactação mais rápida, 9 = compactação mais rápida, 0 = sem compactação. É daí que o intervalo de 0 a 9 vem e o GIMP simplesmente passa esse parâmetro para zlib. Observe que, no nível 0, seu png será um pouco maior que o bitmap equivalente.

No entanto, o nível 9 é apenas o "melhor" que o zlib tentará e ainda é uma solução de compromisso .
Para realmente entender isso, se você estiver disposto a gastar 1000x mais poder de processamento em uma pesquisa exaustiva, poderá obter uma densidade de dados 3-8% mais alta usando o zopfli em vez do zlib.
A compactação ainda é sem perdas, é apenas uma representação DEFLATE mais ideal dos dados. Isso se aproxima dos limites de uma biblioteca compatível com zlib e, portanto, é a verdadeira "melhor" compactação possível de obter usando PNG.


2
Nota: O tempo de descompactação é o mesmo, independentemente do nível de compactação ou da contagem de iterações ao usar o zopflipng.
Adria

16

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:

  1. Pré-compactação: filtragem (previsão)
  2. 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:

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


1
Não acho que a configuração do nível de compactação mude o uso de filtros. A configuração do nível 1-9 provavelmente escolhe apenas o nível de compactação zlib 1-9, e o nível 0 significa que o algoritmo de esvaziamento não é usado. A maioria das implementações provavelmente não altera os filtros por linha, mas apenas usa o filtro Path o tempo todo.
Pauli L

@ PauliL: Eu não concordo, porque em todas as comparações de software de compressão PNG, existem diferenças muito grandes entre os tamanhos das imagens geradas. Se todos os produtos usassem os mesmos parâmetros para a mesma biblioteca, todos os tamanhos deveriam ter sido os mesmos, assim como a velocidade.
harrymc

Você tem algum link para essas comparações?
Pauli L

@ PauliL: Uma pesquisa rápida surgiu com essa comparação .
harrymc

@PauliL: Você provavelmente está certo de que os níveis de compactação zlib são afetados pelos níveis de compactação do PNG. Modifiquei minha resposta de acordo, embora nenhuma ferramenta de compactação documente exatamente o que eles fazem. Talvez a explicação para as ferramentas com os piores resultados de tamanho seja que elas não usam filtros, apenas a compactação zlib.
harrymc

5

OK, estou muito atrasado para a recompensa, mas aqui está a minha resposta de qualquer maneira.

PNG é sempre sem perdas . Ele usa o algoritmo Deflate / Inflate, semelhante aos usados ​​em programas zip.

O algoritmo Deflate pesquisa sequências repetidas de bytes e substitui as por tags. A configuração do nível de compactação especifica quanto esforço o programa usa para encontrar a combinação ideal de sequências de bytes e quanta memória é reservada para isso. É um compromisso entre tempo e uso da memória versus tamanho do arquivo compactado. No entanto, os computadores modernos são tão rápidos e têm memória suficiente para que raramente seja necessário usar outro que não seja a configuração de compactação mais alta.

Muitas implementações PNG usam a biblioteca zlib para compactação. O Zlib possui nove níveis de compressão, 1-9. Eu não conheço o interior do Gimp, mas como ele possui configurações de nível de compressão de 0 a 9 (0 = sem compactação), eu assumiria que essa configuração simplesmente seleciona o nível de compactação do zlib.

O algoritmo de esvaziamento é um algoritmo de compactação de uso geral , não foi projetado para compactar imagens. Ao contrário da maioria dos outros formatos de arquivo de imagem sem perdas, o formato PNG não se limita a isso. A compactação PNG aproveita o conhecimento de que estamos compactando uma imagem 2D . Isso é conseguido pelos chamados filtros .

(Na verdade, filtro é um termo enganador aqui. Na verdade, ele não altera o conteúdo da imagem, apenas o codifica de maneira diferente. Um nome mais preciso seria o codificador delta.)

A especificação PNG especifica 5 filtros diferentes (incluindo 0 = nenhum). O filtro substitui os valores absolutos de pixel pela diferença do pixel anterior para a esquerda, para cima, diagonal ou combinação deles. Isso pode melhorar significativamente a taxa de compactação. Cada linha de digitalização na imagem pode usar filtro diferente. O codificador pode otimizar a compactação escolhendo o melhor filtro para cada linha.

Para detalhes do formato do arquivo PNG, consulte Especificação PNG .

Como há um número praticamente infinito de combinações, não é possível tentar todas. Portanto, diferentes tipos de estratégias foram desenvolvidas para encontrar uma combinação eficaz. A maioria dos editores de imagem provavelmente nem tenta otimizar os filtros linha por linha, mas apenas usa o filtro fixo (provavelmente Paeth).

Um programa de linha de comando pngcrush tenta várias estratégias para encontrar o melhor resultado. Pode reduzir significativamente o tamanho do arquivo PNG criado por outros programas, mas pode demorar um pouco em imagens maiores. Consulte Forja de origem - pngcrush .


3

O nível de compactação em coisas sem perdas é sempre apenas a troca de recursos de codificação (geralmente tempo, às vezes também RAM) versus taxa de bits. Qualidade é sempre 100%.

Obviamente, os compressores sem perdas NUNCA podem garantir uma compressão real. Os dados aleatórios são incompressíveis, não há padrão a ser encontrado nem similaridade. Teoria da informação de Shannon e tudo isso. O ponto principal da compactação sem perda de dados é que os humanos geralmente trabalham com dados altamente não aleatórios, mas para transmissão e armazenamento, podemos compactá-los no menor número possível de bits. Esperemos que o mais próximo possível da complexidade Kolmogorov do original.

Seja dados genéricos zip ou 7z, imagens png, áudio flac ou vídeo h.264 (no modo sem perdas), é a mesma coisa. Com alguns algoritmos de compactação, como lzma (7zip) e bzip2, ativar a configuração de compactação aumentará o tempo de CPU do DECODER (bzip2) ou mais frequentemente apenas a quantidade de RAM necessária (lzma e bzip2 e h.264 com mais quadros de referência) . Freqüentemente, o decodificador precisa salvar mais saídas decodificadas na RAM, porque a decodificação do próximo byte pode se referir a um byte decodificado muitos megabytes atrás (por exemplo, um quadro de vídeo que seja mais semelhante a um meio segundo atrás seria codificado com referências a 12 quadros de volta ) A mesma coisa com o bzip2 e a escolha de um tamanho de bloco grande, mas que também descompacta mais lentamente. O lzma possui um dicionário de tamanho variável e você pode criar arquivos que exigiriam 1.


Hmmm, vi uma implementação para puxar o controle do motor de passo e da cabeça diretamente para fornecer compressão sem perdas garantida. A codificação Manchester é facilmente ultrapassada se você tiver uma fonte de relógio de alta resolução.
Joshua

@Joshua: Usando um formato de armazenamento físico de densidade mais elevada não é a mesma que a compressão de dados ...
SAMB

0

Em primeiro lugar, PNG é sempre sem perdas. O aparente paradoxo se deve ao fato de que existem dois tipos diferentes de compactação possíveis (para qualquer tipo de dados): com perdas e sem perdas.

A compactação sem perdas comprime os dados (ou seja, o tamanho do arquivo) usando vários truques, mantendo tudo e sem fazer nenhuma aproximação. Como resultado, é possível que a compactação sem perdas não consiga realmente comprimir as coisas. (Tecnicamente, dados com alta entropia podem ser muito difíceis ou até impossíveis de compactar para métodos sem perda.) A compactação com perdas aproxima os dados reais, mas a aproximação é imperfeita, mas esse "desperdício" de precisão permite tipicamente uma melhor compactação.

Aqui está um exemplo trivial de compactação sem perdas: se você tiver uma imagem feita de 1.000 pixels em preto, em vez de armazenar o valor em preto 1.000 vezes, poderá armazenar uma contagem (1000) e um valor (preto), comprimindo assim um pixel de 1000 " imagem "em apenas dois números. (Esta é uma forma bruta de um método de compactação sem perdas chamado codificação em comprimento de execução).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.