Qual é o maior tamanho de um JPEG de 640x480?

24

Estou criando um dispositivo de armazenamento de dados que tira um certo número de fotos do céu noturno por algumas horas e as fotos serão baixadas logo após serem tiradas. O cartão de memória deve poder armazenar todas as imagens de uma só vez.

Os JPEGs a serem tirados são 640x480 pixels, e é essencial que haja espaço suficiente no cartão de memória para todos os 100. Então, qual é o maior tamanho de um JPEG de 640x480?

Tirei algumas fotos de teste para descobrir isso:

# 1# 2# 3

  • O tamanho do arquivo da imagem "stackoverflow" é 73.774 bytes.
  • O tamanho do arquivo da imagem em branco é de apenas 36.607 bytes.
  • Mas o tamanho do arquivo da foto quadriculada é de 149.339 bytes.

Estou assumindo que o tamanho do arquivo aumenta com a complexidade.

Como criar espaço suficiente no cartão de memória para caber 100 JPEGs de 640x480, sem saber o quão complicado e qual o tamanho que eles terão? Não quero perder espaço extra, pois posso estar criando muitos desses dispositivos de captura.

Gelo azul
fonte
depende do produtor da imagem. O JPEG de 100 qualidade pode explodir facilmente em tamanho. Quais são suas configurações de câmera e câmera?
precisa
A câmera de teste é uma Canon Powershot A1100 IS. Para mais informações, você pode verificar os metadados, porque não tenho certeza do que você está pedindo.
Blue Ice
11
Você tirou fotos de amostra do céu noturno em dif. Configurações Q? Como teste?
Carl B
2
O que é isso para ? Você tem certeza de que o jpeg é a escolha certa de formato.
Jack Aidley
3
Adicione um pouco de fundo ao comentário de Jack Aidleys: A compactação JPEG altera a imagem. Ele faz suposições e descarta informações para obter um tamanho de arquivo menor. (A menos que seja definido como 100% de qualidade, nesse caso, você também pode usar um formato não compactado. Geralmente, uma câmera digital tem uma definição tiff ou até uma definição bruta para isso. Se você deseja manter todos os pequenos pontos, como estrelas, use um dos estes). Isso também tornará o tamanho de uma imagem completamente previsível.
Hennes

Respostas:

22

Aqui, sugiro um limite superior para os tamanhos de arquivo JPEG. Veja a resposta de Ilmari Karonen para uma discussão sobre tamanhos jpeg mais típicos.

O espaço de armazenamento de pixels para uma imagem de bitmap de 640X480 de 32 bits pode ser calculado assim (com base nesta resposta, mas corrigido com base no comentário de Ignacio Vazquez-Abrams e nesta resposta):

Supondo que nenhuma compactação tenha sido aplicada ao arquivo, existem 307.200 pixels, ou 0,3MP. Handy look up table

Se cada pixel contém 32 bits de informação, então

  1. 307.200 * 32 = 9.830.400 bits de informação
  2. Divida pelos 8 bits para se tornar um valor de byte
  3. 9.830.400 / 8 = 1228800 bytes (ou 1,17 Mb)

Esse é o tamanho de um bitmap descompactado e, como tal, deve ser um limite superior para o tamanho do arquivo jpeg (na realidade, como o formato JPEG usa compactação , suas imagens devem ser muito menores, principalmente porque você está tirando fotos da noite) céu, que eu imagino contém muito preto. Observe que a maior imagem de exemplo na sua pergunta é de apenas 0,14 MB).

No entanto, com relação ao seu problema específico, mesmo usando esse limite superior, 100 imagens têm apenas 117 MB e faz muito tempo que não vejo um cartão de memória com 128 MB. Suspeito que qualquer cartão de memória disponível no momento tenha capacidade suficiente para atender às suas necessidades.

Aparentemente, a questão do tamanho máximo do arquivo jpeg está sujeita a algum debate. Esta resposta de estouro de pilha sugere um tamanho máximo teórico de 20,25 bytes por pixel, ou 5,9 MB no seu caso, mas produzir uma imagem desse tamanho requer uso indevido deliberado do esquema de compactação do formato jpeg, por isso é extremamente improvável que você possa ver tais uma coisa produzida por uma câmera.

ForeverWintr
fonte
11
Infelizmente, mesmo o valor de bitmap descompactado é um pouco baixo, pois assume a compactação. Um bitmap descompactado usa 32 bits por pixel (por motivos de alinhamento ), aumentando o tamanho do arquivo em 33%.
Ignacio Vazquez-Abrams
Obrigado @ IgnacioVazquez-Abrams. É o que recebo por assumir que uma resposta aceita está correta.
ForeverWintr 25/08
11
@ IgnacioVazquez-Abrams - "Alinhamento" é um atributo ditado pelo processador (não pela mídia de armazenamento) e é conveniente quando os dados estão na RAM para processamento. Para fins de armazenamento, um alinhamento de palavras de 32 bits não é uma necessidade e certamente uma extravagância. A embalagem de dados é uma operação comum antes da gravação no armazenamento, especialmente para uma economia de 25%. Vi câmeras digitais que armazenam cada pixel em exatamente 3 bytes para o formato bruto.
sawdust
11
"... certamente uma extravagância." Hoje em dia. Muitas luas atrás, costumava ser considerado um recurso de economia de ciclo (não é necessário alinhar a carga, dado o tempo que levaria).
Ignacio Vazquez-Abrams
3
Na prática, embora alguns sistemas possam armazenar dados de imagem RGB com 4 bytes por pixel na memória , praticamente todos os formatos de arquivo de imagem usam no máximo 3 bytes por pixel (a menos que exista um canal alfa real armazenado no quarto byte). Veja minha resposta abaixo.
Ilmari Karonen
35

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
(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 pnmtojpegmanual não explica claramente como definir todas as opções relevantes (especificamente, a -sampleopçã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
(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 pnmtojpegpadrõ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
(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 .

Ilmari Karonen
fonte
4
teoricamente incompressível apenas para compressão sem perdas, certo?
Daniel Beck
11
@DanielBeck: Certo. Obviamente, você pode compactar todos os dados o quanto quiser, se quiser apenas jogar fora partes deles. (É basicamente o que a compactação JPEG faz, apenas tenta fazê-lo de tal maneira que as partes perdidas não sejam perceptíveis ao olho humano e que o que resta pode ser codificado de forma compacta. O ruído ainda é um caso difícil, pois o única coisa ainda um algoritmo de compressão lossy pode fazer com ruído é jogar fora partes dele).
Ilmari Karonen
Talvez seja só eu, mas a segunda imagem parece mais brilhante que a primeira.
Bogdacutu
@ Bogdacutu: Não deveria, embora seja sempre possível que seu navegador esteja fazendo algo estranho com o gerenciamento de cores, etc. Tente carregá-los em um editor de gráficos e comparar os valores de cores.
Ilmari Karonen
Boa redação @Ilmari.
ForeverWintr