Qual é o maior tamanho de um JPEG 640x480?

21

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

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

Eu tirei algumas fotos de teste para descobrir isso:

  • Otamanhodoarquivodaimagem"stackoverflow" é de 73.774 bytes.
  • O tamanho do arquivo da imagem branca é 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 posso criar espaço suficiente no cartão de memória para caber em 100 640x480 JPEGS, sem saber o quão complicado e o tamanho eles serão? Não quero desperdiçar espaço extra, pois posso estar fazendo muitos desses dispositivos de captura.

    
por Blue Ice 25.08.2013 / 06:19

2 respostas

20

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

O espaço de armazenamento em pixels para uma imagem de bitmap de 640 x 480 de 32 bits pode ser calculado da seguinte forma (com base na esta resposta, mas corrigido com base no comentário de Ignacio Vazquez-Abrams e esta resposta :

Assuming that no compression has been applied to the file, there are 307,200 pixels, which is a 0.3MP. Handy look up table

If each pixel contains 32 bits of information, then

  1. 307,200 * 32 = 9,830,400 bits of information
  2. Divide by the 8 bits to become a byte value
  3. 9,830,400 / 8 = 1228800 bytes (Or 1.17 Mb)

Este é o tamanho de um bitmap descompactado e, como tal, deve ser um limite superior para o tamanho do arquivo jpeg (na realidade, porque o formato JPEG usa compactação , suas imagens devem ser muito menores, especialmente considerando que você está tirando fotos do céu noturno, que eu imagino conter muito preto. Note que a maior imagem de exemplo em sua pergunta é de apenas 0.14 MB)

No que diz respeito ao seu problema específico, no entanto, mesmo usando esse limite superior, 100 imagens são apenas 117 MB, e faz muito tempo que eu não vi um cartão de memória tão pequeno quanto 128 MB. Suspeito que qualquer cartão de memória atualmente disponível 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 produzindo uma imagem desse tamanho requer uso indevido deliberado do esquema de compressão do formato jpeg, então é extremamente improvável que você veja algo assim produzido por uma câmera.

    
por 25.08.2013 / 07:14
33

Só para verificar, deixe-me testar a análise da ForeverWintr experimentalmente.

O pior tipo de imagem de entrada para compressão JPEG (ou qualquer compressão, na verdade) é o ruído RGB uniformemente aleatório, que é teoricamente incompressível. Então, deixe-me gerar algumas 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ídoRGBuniformementealeatório,formatoPNGsemperdas,903kb)

Note(March2017):I'mfairlysuretheimageabovewasinPNGformatwhenIfirstwrotethisansweranduploadeditbackin2013.(There'sevenacommentaboutcolormanagementbelowthatstronglyimpliesthis.)Unfortunately,itwouldseemthatithasbeensilentlyconvertedintoJPEGatsomepoint,makingthevisualcomparisonhereuseless.

I'vetriedtoreuploadanewPNGtestimage,butapparentlyithitssomekindofanarbitraryPNGfilesizelimitatimgurandgetsauto-convertedtoJPEG.I'mnotsureifthere'sanywayaroundthisissue,butatleastifyouhaveaccesstoaLinuxbox,youcanalwaysre-runthegivencommandstogenerateyourowntestimages.Inanycase,otherthanpreventingdirectvisualcomparisonofthecompressionquality,thisdoesnotinvalidatetheanalysisbelowinanyway.

OK,oarquivoPPMdescompactadotem640×480×3=921.600bytes,mais15bytesparaocabeçalhoPPMmínimo,exatamentecomoesperado.Tentarcompactá-losemperdasusandooformatoPNGacabaaumentandootamanhoem2157bytes,presumivelmenteabsorvidosporcabeçalhosemetadadosPNGe,possivelmente,porumapequenaineficiêncianoalgoritmodecompactaçãoquetentacompactardadosincompressíveis.

(Sim,são3bytesporpixel,não4;atéoformatoPPM,queétãosimplesquantoumformatodearquivográficopodeobter,nãoéburroosuficienteparaarmazenarumquartobyteporpixelnodisco.podeteralgumavantagememfazerissoporrazõesdealinhamento,especialmentesevocêtambémprecisararmazenarumcanalalfa,masessasrazõesnãoseaplicamaoescreveraimagemparaumarquivo.)

OK,eoJPEG?Vamostentarminimizarasperdasdecompressãoprimeiro(qualidade=100,semsubamostragemdecroma,DCTdepontoflutuante).Infelizmente,o pnmtojpeg manual não explica claramente como definir todas as opções relevantes (especificamente, a% A opção-sample está listada na seção "Opções para assistentes", que apenas faz referência a um arquivo na documentação do libjpeg), portanto, eu o converterei no GIMP. O arquivo resultante é assim:

897249  rnd.jpg


(ruídoRGBcompactadoemJPEG,qualidade=100,semsubamostragemdecroma,876kb)

Oque,comopodesermenor?Eunãoacabeidedizerqueoruídopuroeraincompressível?Bem,acoisaéque,mesmocomamáximaqualidade,acompressãoJPEGnormalnãoébastantesemperdas.ReabrindoaimagemnoGIMPecomparando-acomooriginal,pode-severquealgunspixelstiveramseusvaloresdecoralteradosporumoudoispassos(de256).EssessãoospixelsemqueoalgoritmodecompressãoJPEG"traiu" e jogou fora um pouco aqui, outro lá, onde estimou que a mudança não seria perceptível. De fato, para o olho humano sem ajuda, o resultado é indistinguível do original, mas esses bits descartados se somam a uma redução mensurável no tamanho do arquivo, mesmo depois de contabilizar o cabeçalho e a sobrecarga de codificação.

Então essa foi a qualidade máxima; E quanto às configurações mais comuns, como pnmtojpeg defaults (qualidade = 75, subamostragem ativada)? Vamos tentar:

$ pnmtojpeg < rnd.ppm > rnd2.jpg
$ du -b rnd2.jpg
185128  rnd2.jpg


(ruído RGB compactado em JPEG, qualidade = 75, subamostragem de croma, 184 kb)

Uau, de 901 para 184 kb! Isso é uma compressão bastante agressiva, e você definitivamente pode dizer a diferença ao comparar as imagens de perto. A maioria é por causa da subamostragem de croma, que basicamente joga fora 75% dos dados de cor (matiz / saturação). Tentá-lo no GIMP com subamostragem desativada fornece um arquivo de 350.618 bytes que ainda parece (ao olho humano, pelo menos) muito próximo do original, mesmo quando ampliado.

De qualquer forma, o objetivo de tudo isso é demonstrar que, não importa quão barulhentas sejam suas fotos no céu noturno, e não importa quão alta seja a qualidade que você possa selecionar, não há nenhuma maneira a 640 × 480 arquivo JPEG pode obter significativamente maior que 900 kb. (Bem, a menos que sua câmera tenha anexado um perfil de cor Exif de vários megabytes a ele ou algo igualmente estúpido.) E se você estiver usando configurações de compactação JPEG mais típicas, o tamanho de arquivo máximo plausível diminui para cerca de 200 kb .

    
por 25.08.2013 / 14:54