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?
compression
png
pkout
fonte
fonte
Respostas:
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ê.
fonte
pngcrush
essa para comparar muitas variações pelo menor possível.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
ffmpeg
uso do muxer MD5 .Isso é melhor mostrado com alguns exemplos:
Crie arquivos PNG:
ffmpeg
, usará-compression_level 100
para saída PNG.Compare o tamanho do arquivo:
Decodifique os arquivos PNG e mostre os hashes MD5:
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.
fonte
ffmpeg -ss 30 -i input -vframes 1 output.png
Também é bom para criar vídeos com imagens e vice-versa.A compactação PNG ocorre em dois estágios.
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.
fonte
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:
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:
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:
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
fonte
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 .
fonte
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.
fonte
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).
fonte