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:
- 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.
fonte
Respostas:
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):
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.
fonte
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 :
(Ruído RGB aleatoriamente uniforme, formato PNG sem perdas, 903 kb)
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:(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:(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 .
fonte