Só para verificar, deixe-me testar a análise do ForeverWintr experimentalmente.
O pior tipo de imagem de entrada para compactação JPEG (ou qualquer compactação, na verdade) é o ruído RGB uniformemente aleatório, teoricamente incompressível. Então, deixe-me gerar alguns usando as ferramentas netpbm :
$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772 rnd.png
921615 rnd.ppm
(Ruído RGB aleatoriamente uniforme, formato PNG sem perdas, 903 kb)
Nota (março de 2017): Tenho certeza de que a imagem acima estava no formato PNG quando escrevi esta resposta e a enviei em 2013. (Há até um comentário sobre gerenciamento de cores abaixo que implica fortemente isso.) Infelizmente, isso parece que ele foi convertido silenciosamente em JPEG em algum momento, tornando a comparação visual aqui inútil.
Tentei reenviar uma nova imagem de teste PNG, mas aparentemente ela atinge algum tipo de limite arbitrário de tamanho de arquivo PNG no imgur e é convertida automaticamente em JPEG. Não tenho certeza se existe alguma maneira de contornar esse problema, mas pelo menos se você tiver acesso a uma caixa Linux, sempre poderá executar novamente os comandos fornecidos para gerar suas próprias imagens de teste. Em qualquer caso, além de impedir a comparação visual direta da qualidade da compactação, isso não invalida a análise abaixo de forma alguma.
OK, o arquivo PPM descompactado tem 640 × 480 × 3 = 921.600 bytes de comprimento, mais 15 bytes para o cabeçalho PPM mínimo, conforme o esperado. Tentar compactá-lo sem perdas usando o formato PNG acaba aumentando o tamanho em 2157 bytes, presumivelmente ocupado por cabeçalhos e metadados PNG e possivelmente uma ligeira ineficiência no algoritmo de compactação tentando compactar dados incompressíveis.
(Sim, são 3 bytes por pixel, não 4; mesmo o formato PPM, que é o mais simples que um formato de arquivo gráfico pode obter, não é burro o suficiente para armazenar um quarto byte inútil por pixel no disco. Pode haver algum vantagem de fazer isso na memória por motivos de alinhamento, especialmente se você também precisar armazenar um canal alfa, mas esses motivos não se aplicam ao gravar a imagem em um arquivo.)
OK, e quanto ao JPEG? Vamos tentar minimizar as perdas de compressão primeiro (qualidade = 100, sem subamostragem de croma, DCT de ponto flutuante). Infelizmente, o pnmtojpeg
manual não explica claramente como definir todas as opções relevantes (especificamente, a -sample
opção está listada na seção "Opções para assistentes", que apenas faz referência a um arquivo na documentação libjpeg), então vou convertê-lo em o GIMP em vez disso. O arquivo resultante é assim:
897249 rnd.jpg
(Ruído RGB compactado JPEG, qualidade = 100, sem subamostragem de croma, 876 kb)
Como pode ser menor? Eu não acabei de dizer que o ruído puro era incompressível? Bem, o problema é que, mesmo com a qualidade máxima, a compactação JPEG normal não é totalmente sem perdas. Reabrindo a imagem no GIMP e comparando-a com o original, é possível ver que alguns pixels tiveram seus valores de cores alterados em uma ou duas etapas (em 256). Esses são os pixels em que o algoritmo de compressão JPEG "trapaceou" e jogou fora um pouco aqui, outro ali, onde estimou que a mudança não seria perceptível. De fato, para o olho humano sem ajuda, o resultado é bastante indistinguível do original, mas esses bits descartados resultam em uma diminuição mensurável no tamanho do arquivo, mesmo depois de contabilizar o cabeçalho e a sobrecarga da codificação.
Então essa foi a máxima qualidade; e as configurações mais comuns, como os pnmtojpeg
padrões (qualidade = 75, subamostragem ativada)? Vamos tentar:
$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128 rnd2.jpg
(Ruído RGB compactado JPEG, qualidade = 75, subamostragem de croma, 184 kb)
Uau, de 901 até 184 kb! Essa é uma compressão bastante agressiva, e você definitivamente pode dizer a diferença ao comparar as imagens de perto. A maior parte é por causa da subamostragem de croma, que basicamente apenas descarta 75% dos dados de cores (matiz / saturação). Experimentá-lo no GIMP com a subamostragem desativada fornece um arquivo de 350.618 bytes que ainda parece (para o olho humano, pelo menos) bem próximo do original, mesmo quando ampliado.
De qualquer forma, o objetivo de tudo isso é demonstrar que, por mais barulhentas que sejam suas fotos do céu noturno e por mais alta qualidade que você possa selecionar, não há como um arquivo JPEG de 640 × 480 ser significativamente maior que 900 kb. (Bem, a menos que sua câmera tenha anexado um perfil de cor Exif de vários megabytes ou algo igualmente estúpido.) E se você estiver usando configurações de compactação JPEG mais comuns, o tamanho máximo plausível do arquivo será de aproximadamente 200 kb .