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


Dizem que os arquivos PNG usam compactação sem perdas. No entanto, sempre que estou em um editor de imagens, como GIMP e tentar salvar uma imagem como um arquivo PNG, ele pede o parâmetro de compressão, que varia entre 0 e 9. Se ele tem um parâmetro de compactação que afeta a precisão visual da imagem compactada, como ele faz o PNG sem perdas?

Eu obtenho um comportamento sem perdas somente quando eu configuro o parâmetro de compressão para 9?


149


origem


A maioria dos algoritmos de compactação sem perdas tem sintonizadores (como o tamanho do dicionário) que são generalizados em um "quanto esforço deve ser feito para minimizar o tamanho da saída". Isto é válido para ZIP, GZip, BZip2, LZMA, ... - Daniel B
A questão poderia ser afirmada diferentemente. Se a qualidade não for perdida, por que não usar sempre a compressão que produz o menor tamanho? A resposta então seria, porque requer mais RAM e mais tempo de CPU para compactar e descompactar. Às vezes, você quer uma compactação mais rápida e não se importa tanto com a taxa de compactação. - kasperd
A compactação PNG é quase idêntica a arquivos ZIP. Você pode compactá-los mais ou menos, mas obtém o arquivo exato de volta quando ele é descompactado - isso é o que o torna sem perdas. - mikebabcock
A maioria dos softwares de compactação, como Zip e Rar, permitem inserir "nível de compactação", que permite escolher entre um arquivo menor <-> menor tempo. Isso não significa que esses softwares descartem dados durante a compactação. Essa configuração (no GIMP, pngcrush, etc) é semelhante. - Salman A
@ Naxa: Não há ressalvas de como o png sem perdas realmente é. É sempre 100% sem perdas. O artigo só avisa sobre bugs que alguns navegadores antigos tinham em sua implementação PNG para lidar com a correção de gama. E isso só é significativo se você precisar combinar a cor com cores CSS (que não são corrigidas por gama). - Pauli L


Respostas:


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


181



Além disso, a compactação PNG na verdade tem muitos parâmetros ajustáveis ​​em que 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, use uma ferramenta como pngcrush que pode comparar muitas variações para o menor possível. - Bob
Um nível de compactação mais alto aumenta o tempo de compactação, mas também afeta descompressão também? - Nolonar
@Nononar Geralmente não; Se alguma coisa, um nível de compactação mais alto geralmente diminui o tempo de descompressão, porque há menos dados para ler e processar. O maior tempo de compactação é devido a um trabalho mais completo de encontrar padrões para comprimir (simplificar demais). - fluffy
A resposta do @fluffy LordNeckbeard teve a maior compressão 5x mais longa para decodificar do que a mais baixa. - André Chalella
Para PNG, é É muito comum ter um tempo de descompressão mais longo para arquivos melhor compactados. O problema é que, com o PNG, um truque possível é aplicar o algoritmo de compactação repetidamente, desde que o arquivo fique menor. Quando o tamanho aumenta, você para de aplicá-lo. Portanto, é bem possível aplicar 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'


PNG é comprimido, 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 excessivamente, até mesmo formatos sem imagem, como o FLAC, têm conceitos semelhantes.

Diferentes níveis de compressão, 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 o MD5 hashes das saídas decodificadas com ffmpeg usando o 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 100 para saída PNG.

Comparar 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.


210



+1 não sabia que o ffmpeg poderia manipular pngs. - Lekensteyn
@Lekensteyn É ótimo para fazendo capturas de tela. Exemplo para pular 30 segundos e tirar screenshot: ffmpeg -ss 30 -i input -vframes 1 output.png Bom também para fazendo vídeos com imagens e vice versa. - LordNeckbeard
Significa que o PNG precisa ser descompactado toda vez que tiver que ser renderizado? Porque se isso é verdade, devemos ser - akshay2000
Se você reler o arquivo do disco ou do cache, sim, ele deve ser descompactado. Dentro da mesma página, o cache provavelmente pode reutilizar a versão descompactada. - David Mårtensson
@ akshay2000 Depende de como o programa funciona, o que renderiza o PNG. Geralmente, o arquivo é lido do disco, descompactado e armazenado em buffer na RAM. Portanto, desde que esteja em buffer na RAM, não será necessário descompactar a imagem novamente. - xZise


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

  1. A pré-compactação reorganiza os dados da imagem para que ela seja mais compressível por um algoritmo de compressão de uso geral.
  2. A compactação real é feita por DEFLATE, que procura e elimina seqüências de bytes duplicadas, substituindo-as por tokens curtos.

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

No entanto, o nível 9 é apenas o "melhor" que o zlib tentará, e ainda é muito solução de compromisso.
Para realmente ter uma ideia, se você estiver disposto a gastar 1.000 vezes mais poder de processamento em uma pesquisa exaustiva, poderá obter uma densidade de dados 3-8% maior usando zopfli em vez de zlib.
A compactação ainda é sem perdas, é apenas uma representação de DEFLATE mais ideal dos dados. Isso se aproxima dos limites de bibliotecas compatíveis com o zlib e, portanto, é a verdadeira "melhor" compactação que é possível alcançar usando o PNG.


24



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


Uma motivação primária para o formato PNG era criar um substituto para o GIF que não fosse apenas gratuito, mas também uma melhoria em relação a ele essencialmente em todos os aspectos. Como resultado, a compactação PNG é totalmente sem perdas - ou seja, os dados da imagem original podem ser reconstruídos exatamente, pouco a pouco - assim como no GIF e na maioria das formas de TIFF.

O PNG usa um processo de compactação de dois estágios:

  1. Pré-compactação: filtragem (previsão)
  2. Compressão: DEFLATE (ver wikipedia)

A etapa de pré-compressão é chamada de filtragem, que é um método de transformar reversivelmente os dados da imagem para que o mecanismo principal de compactação 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 é muito pouco comprimida ou não é de todo. Mas uma modificação trivial da sequência - a saber, deixando o primeiro byte sozinho, mas substituindo cada byte subseqüente pela diferença entre ele e seu predecessor - transforma a seqüência em um conjunto extremamente compressível:

1, 1, 1, 1, 1, .... 1

A transformação acima é sem perdas, já que nenhum byte 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ído.

Os dados de imagem reais raramente são perfeitos, mas a filtragem melhora a compactação em imagens em tons de cinza e truecolor, e também pode ajudar em algumas imagens de 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:

image

O algoritmo funciona em bytes, mas para pixels grandes (por exemplo, RGB de 24 bits ou RGBA de 64 bits) somente bytes correspondentes são comparados, o que significa que os componentes vermelhos das cores de pixel são manipulados separadamente dos componentes de pixel verde e azul.

Para escolher o melhor filtro para cada linha, um codificador precisaria testar todas as combinações possíveis. Isso é claramente impossível, já que até uma imagem de 20 linhas exigiria testes de mais de 95 trilhões de combinações, onde "testar" envolveria filtrar e compactar toda a imagem.

Os níveis de compressão são normalmente definidos como números entre 0 (nenhum) e 9 (melhor). Referem-se a compensações entre velocidade e tamanho e relacionam-se com quantas combinações de filtros de linha devem ser tentados. Não há padrões quanto a esses níveis de compressão, Assim, todo editor de imagens pode ter seus próprios algoritmos sobre quantos filtros tentar quando otimizar o tamanho da imagem.

O nível de compactação 0 significa que os filtros não são usados, o que é rápido, mas é um desperdício. Níveis mais altos significam que mais e mais combinações são experimentadas em linhas de imagem e somente as melhores aqueles são retidos.

Eu diria que a abordagem mais simples para a melhor compactação é testar incrementalmente cada linha com cada filtro, salvar o menor resultado e repetir para a próxima linha. Isso equivale a filtrar e compactar toda a imagem cinco vezes, o que pode ser um trade-off razoável para uma imagem que será transmitida e decodificada muitas vezes. Menores valores de compressã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 o 0-9 especificado os níveis 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 significativamente o tamanho do arquivo, sem a perda de um único pixel.

Fontes:

Gráficos de Rede Portátil da Wikipedia
Documentação da libpng Capítulo 9 - Compressão e Filtragem


15



Não acho que a configuração do nível de compactação altere o uso de filtros. A configuração de 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 deflação 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 do 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 ser os mesmos, assim como a velocidade. - harrymc
Você tem algum link para essas comparações? - Pauli L
@PauliL: Uma pesquisa rápida surgiu com esta 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. Eu 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


OK, eu 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, similar aos usados ​​nos programas zip.

O algoritmo Deflate pesquisa seqüências repetidas de bytes e as substitui 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 a quantidade de memória reservada para isso. É um compromisso entre tempo e uso de memória versus tamanho de arquivo compactado. No entanto, os computadores modernos são tão rápidos e têm memória suficiente, de modo que raramente é necessário usar outra que não seja a configuração de compactação mais alta.

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

O algoritmo de deflação é um algoritmo de compressão de propósito geral, não foi concebido para comprimir 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 um Imagem 2D. Isto é conseguido pelos chamados filtros.

(Filter é na verdade um termo um pouco enganador aqui. Ele não altera o conteúdo da imagem, apenas codifica de forma diferente. Nome mais preciso seria o codificador delta.)

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

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

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

Um programa de linha de comando pngcrush tenta várias estratégias para encontrar o melhor resultado. Ele pode reduzir significativamente o tamanho do arquivo PNG criado por outros programas, mas pode levar um pouco de tempo em imagens maiores. Vejo Fonte Forge - pngcrush.


5





O nível de compactação no material sem perdas está sempre negociando recursos de codificação (geralmente tempo, às vezes RAM) versus taxa de bits. A qualidade é sempre 100%.

Claro, compressores sem perdas podem NUNCA garanta qualquer compressão real. Dados aleatórios são incompressíveis, não há padrão para encontrar e sem similaridade. Teoria da informação de Shannon e tudo isso. O ponto principal da compactação de dados sem perdas é que os humanos geralmente trabalham com dados altamente não aleatórios, mas para transmissão e armazenamento, podemos comprimi-los em tão poucos bits quanto possível. Espero que até o mais perto possível do Complexidade de Kolmogorov do original.

Quer se trate de dados zip ou 7z genéricos, png images, flac audio ou h.264 (no modo lossless), é a mesma coisa. Com alguns algoritmos de compressão, como lzma (7zip) e bzip2, aumentar a configuração da compactação aumentará o tempo de CPU do DECODER (bzip2) ou, mais frequentemente, a quantidade de RAM necessária (lzma e bzip2 e h.264 com mais quadros de referência) . Muitas vezes o decodificador tem que salvar mais saída decodificada na RAM porque a decodificação do próximo byte poderia se referir a um byte decodificado há muitos megabytes (por exemplo, um quadro de vídeo mais semelhante a um meio segundo atrás seria codificado com referências a 12 quadros ). A mesma coisa com o bzip2 e a escolha de um tamanho de bloco grande, mas que também descomprime mais lentamente. lzma tem um dicionário de tamanho variável e você pode criar arquivos que precisariam de 1,5 GB de RAM para decodificar.


3



Hmmm eu vi uma implementação para puxar o controle do motor de passo da unidade e dirigir diretamente para fornecer uma compressão sem perdas garantida. A codificação Manchester é facilmente vencida se você tiver uma fonte de relógio de alta resolução. - Joshua
@ Joshua: Usando um formato de armazenamento físico de alta densidade não é o mesmo que a compressão de dados ... - SamB


Em primeiro lugar, o PNG é sempre sem perdas. O aparente paradoxo é devido ao fato de que existem dois tipos diferentes de compressão (para qualquer tipo de dado): com perdas e sem perdas.

Compressão sem perdas espreme os dados (ou seja, tamanho do arquivo) usando vários truques, mantendo tudo e sem fazer qualquer aproximação. Como resultado, é possível que a compactação sem perdas não seja realmente capaz de compactar as coisas. (Tecnicamente, dados com alta entropia podem ser muito difíceis ou mesmo impossíveis de serem compactados para métodos sem perdas.)     Compressão com perda aproxima os dados reais, mas a aproximação é imperfeita, mas esse "afastamento" da precisão permite tipicamente uma melhor compressão.

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


0