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, 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 pnmtojpeg
manuale non spiega chiaramente come impostare tutte le opzioni pertinenti (in particolare, l' -sample
opzione è 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
(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 pnmtojpeg
impostazioni 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, 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ì .