Qual è la dimensione più grande di un JPEG 640x480?


25

Sto creando un dispositivo di archiviazione dei dati che scatta un certo numero di foto del cielo notturno nell'arco di un paio d'ore e le foto verranno scaricate subito dopo che sono state tutte scattate. La scheda di memoria deve essere in grado di memorizzare tutte le immagini contemporaneamente.

I JPEG che verranno acquisiti sono 640x480 pixel ed è essenziale che vi sia spazio sufficiente sulla scheda di memoria per tutti e 100. Quindi qual è la dimensione più grande di un JPEG 640x480?

Ho fatto alcune foto di prova per capirlo:

1 #2 #3 #

  • La dimensione del file dell'immagine "stackoverflow" è di 73.774 byte.
  • La dimensione del file dell'immagine bianca è di soli 36.607 byte.
  • Ma la dimensione del file per gli orologi fotografici a scacchi è di 149.339 byte.

Presumo che le dimensioni del file aumentino con complessità.

Come posso creare abbastanza spazio sulla scheda di memoria per adattarsi a 100 640x480 JPEG, senza sapere quanto siano complicati e quali dimensioni saranno? Non voglio sprecare spazio extra poiché potrei realizzare molti di questi dispositivi di acquisizione.


dipende dal produttore dell'immagine. JPEG di qualità 100 può facilmente esplodere in dimensioni. Quali sono le impostazioni della fotocamera e della fotocamera?
John Dvorak,

La fotocamera di prova è una Canon Powershot A1100 IS. Per maggiori informazioni, puoi controllare i metadati, perché non sono sicuro di cosa stai chiedendo.
Blue Ice,

1
Hai scattato qualche foto di esempio del cielo notturno a dif. Q impostazioni? Come test?
Carl B,

2
Che cosa è questo per ? Sei sicuro che jpeg sia la scelta giusta per il formato.
Jack Aidley,

3
Aggiungiamo un po 'di sfondo al commento di Jack Aidleys: la compressione JPEG modifica l'immagine. Fa ipotesi e scarta le informazioni al fine di ottenere una dimensione del file più piccola. (A meno che non sia impostato al 100% di qualità, nel qual caso potresti anche utilizzare un formato non compresso. Spesso una fotocamera digitale ha un'impostazione rigida o addirittura grezza per questo. Se vuoi mantenere tutti i piccoli punti come le stelle, usa uno di questi). Ciò renderà anche completamente prevedibile la dimensione di un'immagine.
Hennes,

Risposte:


22

Qui suggerisco un limite superiore per le dimensioni dei file JPEG. Vedi la risposta di Ilmari Karonen per una discussione sulle dimensioni jpeg più tipiche.

Lo spazio di archiviazione pixel per un'immagine bitmap 640X480 a 32 bit può essere calcolato in questo modo (in base a questa risposta, ma corretto in base al commento di Ignacio Vazquez-Abrams e a questa risposta):

Supponendo che non sia stata applicata alcuna compressione al file, ci sono 307.200 pixel, ovvero 0,3 MP. Pratico look up table

Se ogni pixel contiene 32 bit di informazioni, quindi

  1. 307.200 * 32 = 9.830.400 bit di informazioni
  2. Dividi per gli 8 bit per diventare un valore byte
  3. 9.830.400 / 8 = 1228800 byte (o 1.17 Mb)

Questa è la dimensione di una bitmap non compressa e come tale dovrebbe essere un limite superiore per la dimensione del file jpeg (In realtà, poiché il formato JPEG utilizza la compressione , le tue immagini dovrebbero essere molto più piccole, soprattutto dato che stai scattando foto della notte sky, che immagino contenga molto nero. Nota che l'immagine di esempio più grande nella tua domanda è solo 0,14 MB).

Per quanto riguarda il tuo problema specifico, anche usando quel limite superiore, 100 immagini sono solo 117 MB, ed è da molto tempo che non vedo una scheda di memoria piccola quanto 128 MB. Sospetto che qualsiasi scheda di memoria attualmente disponibile avrà abbastanza capacità per soddisfare le tue esigenze.

Apparentemente la questione della dimensione massima del file jpeg è soggetta a qualche dibattito. Questa risposta Stack Overflow suggerisce una dimensione massima teorica di 20,25 byte per pixel, o 5,9 MB nel tuo caso, ma la produzione di un'immagine di quella dimensione richiede un uso improprio deliberato dello schema di compressione del formato jpeg, quindi è estremamente improbabile che tu abbia mai visto tale una cosa prodotta da una macchina fotografica.


1
Sfortunatamente anche il valore bitmap non compresso è solo un po 'basso, dal momento che presuppone un impacchettamento. Una bitmap decompressa utilizza 32 bit per pixel (per motivi di allineamento ), aumentando le dimensioni del file del 33%.
Ignacio Vazquez-Abrams,

Grazie @ IgnacioVazquez-Abrams. Questo è quello che ottengo assumendo che una risposta accettata sia corretta.
ForeverWintr,

1
@ IgnacioVazquez-Abrams - "Alignment" è un attributo dettato dal processore (non dal supporto di memorizzazione) ed è utile quando i dati sono nella RAM per l'elaborazione. Ai fini della memorizzazione, un allineamento di parole a 32 bit non è una necessità e certamente una stravaganza. L'imballaggio dei dati è un'operazione comune prima della scrittura nello spazio di archiviazione, in particolare per un certo risparmio del 25%. Ho visto fotocamere digitali che memorizzano ogni pixel in esattamente 3 byte per il formato non elaborato.
segatura

1
"... sicuramente una stravaganza." Al giorno d'oggi. Molte lune fa era considerata una funzione di risparmio di ciclo (non è necessario allinearsi al carico, dato il tempo necessario).
Ignacio Vazquez-Abrams,

3
In pratica, mentre alcuni sistemi potrebbero memorizzare dati di immagini RGB come 4 byte per pixel in memoria , praticamente tutti i formati di file di immagine utilizzano al massimo 3 byte per pixel (a meno che non ci sia un vero canale alfa memorizzato nel quarto byte). Vedi la mia risposta qui sotto.
Ilmari Karonen,

35

Solo per controllare, fammi testare l'analisi di ForeverWintr a livello sperimentale.

Il peggior tipo di immagine di input per la compressione JPEG (o qualsiasi compressione, in realtà) è il rumore RGB uniformemente casuale, che è teoricamente incomprimibile. Consentitemi quindi di generarne alcuni usando gli strumenti netpbm :

$ rawtoppm < /dev/urandom 640 480 > rnd.ppm
$ pnmtopng < rnd.ppm > rnd.png
$ du -b rnd.*
923772  rnd.png
921615  rnd.ppm

Rumore RGB uniformemente casuale, formato PNG lossless
(Rumore RGB uniformemente casuale, formato PNG lossless, 903 kb)

Nota (marzo 2017): Sono abbastanza sicuro che l'immagine qui sopra fosse in formato PNG quando ho scritto per la prima volta questa risposta e l'ho caricata nel 2013. (Di seguito c'è anche un commento sulla gestione del colore che lo implica fortemente.) Sfortunatamente, sarebbe sembra che sia stato silenziosamente convertito in JPEG ad un certo punto, rendendo inutile il confronto visivo qui.

Ho provato a ricaricare una nuova immagine di prova PNG, ma a quanto pare colpisce un tipo di limite di dimensione del file PNG arbitrario su imgur e viene convertito automaticamente in JPEG. Non sono sicuro che ci sia un modo per aggirare questo problema, ma almeno se hai accesso a un box Linux, puoi sempre rieseguire i comandi dati per generare le tue immagini di prova. In ogni caso, oltre a impedire il confronto visivo diretto della qualità di compressione, ciò non invalida in alcun modo l'analisi di seguito.

OK, quindi il file PPM non compresso è lungo 640 × 480 × 3 = 921.600 byte, più 15 byte per l'intestazione PPM minima, proprio come previsto. Cercare di comprimerlo senza perdita di dati utilizzando il formato PNG finisce per aumentare le dimensioni di 2157 byte, presumibilmente assorbito da intestazioni e metadati PNG e forse una leggera inefficienza nell'algoritmo di compressione che prova a comprimere dati incomprimibili.

(Sì, è 3 byte per pixel, non 4, anche il formato di PPM, che è quanto di più semplice come un formato di file grafico può ottenere, non è così stupido da memorizzare un quarto byte per pixel inutile sul disco ci. Può esserci alcuni vantaggio di farlo in memoria per motivi di allineamento, specialmente se è necessario anche memorizzare un canale alfa, ma questi motivi non si applicano quando si scrive l'immagine su un file.)

OK, allora JPEG? Proviamo innanzitutto a ridurre al minimo le perdite di compressione (qualità = 100, nessun campionamento cromatico, DCT a virgola mobile). Sfortunatamente, il pnmtojpegmanuale non spiega chiaramente come impostare tutte le opzioni pertinenti (in particolare, l' -sampleopzione è elencata nella sezione "Opzioni per i maghi", che fa solo riferimento a un file nella documentazione di libjpeg), quindi lo convertirò in il GIMP invece. Il file risultante è simile al seguente:

897249  rnd.jpg

Disturbo RGB compresso JPEG, qualità = 100, nessun sottocampionamento cromatico
(Rumore RGB compresso JPEG, qualità = 100, nessun sottocampionamento cromatico, 876 kb)

Cosa, come può essere più piccolo? Non ho solo detto che il rumore puro era incomprimibile? Bene, il fatto è che, anche alla massima qualità, la normale compressione JPEG non lo è abbastanza senza perdita. Riaprendo l'immagine in GIMP e confrontandola con l'originale, si può vedere che alcuni pixel hanno spostato i loro valori di colore di uno o due passaggi (su 256). Quelli sono i pixel in cui l'algoritmo di compressione JPEG "ha truffato" e gettato via un po 'qui, un altro lì, dove ha stimato che il cambiamento non sarebbe stato evidente. In effetti, per l'occhio umano senza aiuto il risultato è abbastanza indistinguibile dall'originale, ma quei bit scartati si sommano a una diminuzione misurabile delle dimensioni del file, anche dopo aver tenuto conto dell'intestazione e dell'overhead della codifica.

Quindi quella era la massima qualità; che dire delle impostazioni più tipiche, come le pnmtojpegimpostazioni predefinite (qualità = 75, sottocampionamento abilitato)? Proviamolo:

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

Disturbo RGB compresso JPEG, qualità = 75, campionamento cromatico
(Disturbo RGB compresso JPEG, qualità = 75, campionamento cromatico, 184 kb)

Caspita, da 901 a 184 kb! Questa è una compressione piuttosto aggressiva, tuttavia, e puoi sicuramente distinguere quando confronti le immagini da vicino. La maggior parte è a causa del sottocampionamento del croma, che praticamente getta via il 75% dei dati di colore (tonalità / saturazione). Provandolo nel GIMP con il sottocampionamento disabilitato si ottiene un file di 350.618 byte che sembra ancora (all'occhio umano, almeno) abbastanza vicino all'originale anche quando ingrandito.

Comunque, il punto di tutto ciò è dimostrare che, non importa quanto rumorose possano essere le tue foto del cielo notturno, e non importa quanto alta sia la qualità che potresti selezionare, non c'è modo in cui un file JPEG 640 × 480 possa diventare significativamente più grande di 900 kb. (Beh, a meno che la tua fotocamera non abbia collegato un profilo Exif multi-megabyte o qualcosa di altrettanto stupido, cioè.) E se stai usando impostazioni di compressione JPEG più tipiche, la dimensione massima del file plausibile scende a circa 200 kb o giù di lì .


4
teoricamente incomprimibile solo per compressione senza perdita, giusto?
Daniel Beck

1
@DanielBeck: giusto. Ovviamente, puoi comprimere tutti i dati quanto vuoi se sei disposto a buttarne via solo parti. (Questo è fondamentalmente ciò che fa la compressione JPEG, cerca solo di farlo in modo tale che le parti perse non siano visibili all'occhio umano e che ciò che rimane possa essere codificato in modo compatto. Il rumore è ancora un caso difficile, dal momento che il l'unica cosa che anche un algoritmo di compressione con perdita di dati può fare con il rumore è gettarne via parti.)
Ilmari Karonen,

Forse sono solo io, ma la seconda immagine sembra più luminosa della prima.
Bogdacutu,

@Bogdacutu: Non dovrebbe, anche se è sempre possibile che il tuo browser stia facendo qualcosa di strano con la gestione del colore, ecc. Prova a caricarli entrambi in un editor grafico e confrontando i valori di colore.
Ilmari Karonen,

Bel commento @Ilmari.
ForeverWintr,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.