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

150

Os arquivos PNG usam a 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 pergunta para o parâmetro de compactação, que varia entre 0 e 9. Se tiver 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?

    
por pkout 26.11.2014 / 19:11

7 respostas

182

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

    
por 26.11.2014 / 19:31
210

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

Diferentes níveis de compactação, mesma saída decodificada

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

Você pode comparar os hashes MD5 das saídas decodificadas com ffmpeg usando o MD5 muxer .

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 a saída PNG.

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

    
por 27.11.2014 / 09:27
24

A compactação 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 compactação de propósito 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) usa 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 é uma 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.

    
por 28.11.2014 / 10:55
15

A principal motivação para o formato PNG foi 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. Compactação: DEFLATE (consulte 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 ruim ou não é muito difícil. 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 antecessor - 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:

Oalgoritmofuncionaembytes,masparapixelsgrandes(porexemplo,RGBde24bitsouRGBAde64bits)somentebytescorrespondentessãocomparados,oquesignificaqueoscomponentesvermelhosdascoresdepixelsãomanipuladosseparadamentedoscomponentesdepixelverdeeazul.

Paraescolheromelhorfiltroparacadalinha,umcodificadorprecisariatestartodasascombinaçõespossíveis.Issoéclaramenteimpossível,jáqueatéumaimagemde20linhasexigiriatestesdemaisde95trilhõesdecombinações,emque"testar" envolveria a filtragem e a compactação da imagem inteira.

Os níveis de compactaçã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.

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 os que 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, tudo sem a perda de um único pixel.

Fontes:

Gráficos de rede portátil da Wikipedia
documentação de documentação Capítulo 9 - Compressão e filtragem

    
por 29.11.2014 / 16:12
5

OK, estou muito atrasado para a recompensa, mas aqui está a minha resposta mesmo assim.

O 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 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 presumo que essa configuração simplesmente selecione o nível de compactação do zlib.

Algoritmo de deflação é um algoritmo de compressão de propósito geral , ele 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 .

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

A especificação PNG especifica 5 filtros diferentes (incluindo 0 = nenhum). O filtro substitui os valores absolutos dos pixels por 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 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 do 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. Veja Source Forge - pngcrush .

    
por 30.11.2014 / 14:45
3

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 que os compressores sem perdas podem NUNCA garantir qualquer compactaçã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. Esperemos que seja o mais próximo possível da complexidade de Kolmogorov do original.

Seja um arquivo zip ou 7z genérico, 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 requerem 1,5 GB de RAM para decodificar.

    
por 02.12.2014 / 14:38
0

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.

A compactação sem perdas reduz os dados (ou seja, o 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.)     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 pretos, em vez de armazenar o valor para preto 1.000 vezes, poderá armazenar uma contagem (1000) e um valor (preto) comprimindo assim uma 1000 pixel "imagem" em apenas dois números. (Essa é uma forma bruta de um método de compactação sem perdas chamado de codificação de comprimento de execução).

    
por 27.11.2017 / 07:07