Qual è la dimensione "ottimale" del file delle immagini JPEG rispetto alle loro dimensioni?


10

Ho in programma di scrivere uno script che scansionerà oltre 100.000 immagini JPEG e le comprime nuovamente se sono "troppo grandi" in termini di dimensioni del file. Lo scripting è la parte facile, ma non sono sicuro di come classificare un'immagine come "troppo grande".

Ad esempio, esiste un'immagine 2400x600px con una dimensione del file di 1,81 MB. Il comando Salva per Web di Photoshop crea un file da 540 KB con 60 qualità e stesse dimensioni. Questo è circa il 29% delle dimensioni originali.

Ora sto pensando di usare questi numeri come linea guida. Qualcosa come 540 KB / (2.400 * 600 / 1.000.000) = 375 KB per megapixel. Qualsiasi immagine più grande di questa è considerata grande. È questo l'approccio corretto o ce n'è uno migliore?

Modifica 1: le immagini devono essere ottimizzate per la visualizzazione sui siti Web.

Modifica 2: Posso determinare la qualità di output desiderata sperimentando, devo sapere se le immagini sono grandi in termini di dimensioni del file e dimensioni e devono essere salvate in una qualità inferiore.



1
Il primo commento di xiota dovrebbe essere la risposta! a proposito, qual è la tua priorità? se per qualche motivo hai solo bisogno di file di piccole dimensioni, la qualità può soffrire a volte. è facile creare file jpeg irragionevolmente grandi senza alcun guadagno percepibile in termini di qualità. rilevare e ricomprimere tali immagini è una buona idea, basta usare l'impostazione della qualità jpeg, come ha detto xiota.
szulat,

18
"Ottimale" per quale scopo ? Anche dire "uso del web" è un po 'ampio in questi giorni. Gli spettatori attesi guarderanno le immagini su un telefono compatto? Uno smartphone più grande? Un pad o un tablet? Un quaderno? Un monitor per computer di grandi dimensioni? Una TV da 60 "8K? Un jumbotron?
Michael C


2
Se lo scripting è la parte facile, ecco cosa proverei nella tua situazione: impostare un limite definito numericamente al quale l'immagine compressa può differire dall'originale (ad es. Somma della differenza di luminosità di ogni pixel). Inizia con una qualità inferiore (come 60), esporta e, se la differenza dall'originale è troppo elevata, esporta nuovamente con una qualità superiore fino a quando le tue condizioni di qualità sono soddisfatte (potrebbe essere necessario modificare il calcolo - usa una scala esponenziale o qualcosa di più elaborato per ottenere il miglior risultato).
Pavel,

Risposte:


4

In media , il punto debole di JPEG è di circa un bit per pixel .

Questo ovviamente varierà a seconda del contenuto dell'immagine, poiché alcuni tipi di grafica (ad esempio aree piatte e gradienti uniformi) si comprimono meglio di altri (rumore, testo), quindi non è un metodo affidabile da applicare alla cieca su ogni immagine.

Hai anche il problema di non avere un'immagine di riferimento non compressa da confrontare, quindi non sai con certezza qual è la qualità attuale delle immagini che hai e quanto più puoi abbassare la qualità per essere ancora accettabile. La qualità può essere indovinata in una certa misura dalle tabelle di quantizzazione in JPEG, ma non è nemmeno un metodo affidabile (in particolare, il giudizio sulla qualità di ImageMagick è molto errato per i JPEG con tabelle di quantizzazione personalizzate e ottimizzate).

Detto questo, esiste un approccio pratico ragionevole:

  1. Scegli un'impostazione di qualità JPEG massima che ti soddisfa (da qualche parte nell'intervallo 70-85).
  2. Ricomprimere le immagini a quel livello di qualità.
  3. Se l'immagine ricompressa è più piccola di oltre il 10% circa , mantenere l'immagine ricompressa.

È importante non scegliere semplicemente la dimensione del file più piccola e richiedere invece un calo significativo della dimensione del file. Questo perché la ricompressione di JPEG tende sempre a ridurre leggermente le dimensioni del file a causa della perdita di dettagli causata dalla perdita di natura del JPEG e della conversione in RGB a 8 bit, quindi piccole cadute nella dimensione del file possono avere un calo sproporzionatamente elevato di qualità che non vale la pena esso.


4
Questo è esattamente quello che ho fatto alla fine. Ho usato un bit per pixel come guida per filtrare 30.000 immagini su 100.000+ e le ho ricompresse usando imagemagick con una qualità dell'85%. Se l'immagine risultante era più piccola di oltre il 50%, ho conservato quella nuova. Nel mio caso ha funzionato perché le "grandi immagini" sono state create usando Photoshop con una qualità del 100%. Le altre 70.000 immagini erano OK in termini di dimensioni dei file e la loro ricompressione non ha generato risparmi sufficienti (in termini percentuali) o si è verificata una notevole perdita di qualità.
Salman A

1
Mi piace il tuo secondo paragrafo, ma hai qualche supporto per la regola empirica di un bit per pixel (compressione 24 ×) che conduci?
Leggi il mio profilo

30

Le dimensioni dei file compressi con JPEG variano in base alla complessità dell'immagine. Provare a controllare le dimensioni del file nel modo in cui descrivi produrrà una qualità dell'immagine percepita molto variabile.

Considera invece le seguenti opzioni:

  • L'approccio abbastanza buono.  Usa un'impostazione di qualità che ritieni accettabile, come 75. Confronta le dimensioni del risultato con l'immagine originale e mantieni il file più piccolo. Vedi Quale qualità scegliere quando si converte in JPG?

  • Usa un minimizer JPEG , come JPEGmini o jpeg-recompressda jpeg-archive . Sono essenzialmente progettati per fare ciò che sembra stia cercando di fare, ma con una maggiore consapevolezza degli interni dell'algoritmo JPEG.

  • Genera miniature di varie dimensioni , come suggerisce Nathancahill , dal punto di vista dello sviluppatore web.


7
O se vuoi andare "estremo" sulla minimizzazione JPEG, guetzli . Nota i requisiti di memoria e tempo.
Philip Kendall,

2
Ho provato Guetzli, ma non sono rimasto molto colpito. È molto lento e riduce solo le dimensioni di circa il 20-30%. Con jpeg-recompress, i file possono essere ridotti dell'80% con l'algoritmo smallfry.
Xiota,

18

No. Questo è un approccio sbagliato.

La dimensione del file in pixel, sì, ha qualcosa a che fare con il peso finale, ma non è l'unico fattore.

Fai un test. Prendi un file completamente bianco dello stesso 2400x600px e salvalo come JPG.

Ora scatta una foto di una foresta (stessa 2400x600px) con molti dettagli e salvala. Questo file sarà più grande usando le stesse impostazioni di compressione.

La dimensione finale dipende da questi 3 fattori:

  • Dimensione pixel
  • Impostazioni di compressione
  • Contenuto (dettaglio e complessità dell'immagine)

Quindi non puoi e non dovresti definire il peso in base alla dimensione dei pixel.


Ma capisco il tuo problema.

Senza analizzare l'attuale compressione dell'immagine, è difficile definire il peso "ottimale" (che è relativo all'osservatore o all'utilizzo delle immagini)

Probabilmente puoi definire un'impostazione di compressione e ricomprimere "tutti". Non so se vuoi farlo prima di "caricare", il che probabilmente ti farà risparmiare più tempo rispetto al salvataggio saltandone alcuni.

Esistono alcuni strumenti che analizzano un'immagine e calcolano il rapporto di compressione corrente. Ma dubito che sia così importante.


Capisco la parte sull'immagine bianca contro l'immagine della foresta. Mi consiglieresti di prendere un campione casuale di immagini, di salvarle di nuovo con Photoshop (qualità 70) e di utilizzare il rapporto pixel: dimensione file più grande come riferimento? Immagino che quelli con un rapporto più basso sarebbero quelli con meno dettagli.
Salman A

Per quanto riguarda la tua ultima frase. Il rapporto di compressione è in realtà approssimativamente ciò che OP sta calcolando poiché è jpeg size / raw sizee raw size = pixel size * number of pixel, pixel sizeessendo 3 ottetti per uno spazio colore RGB a 24 bit. E come dici tu stesso, questa metrica non è sufficiente per determinare se un'immagine è sufficientemente compressa.
zakinster,

9
@SalmanA No, suggerirei di abbandonare del tutto questo approccio. I JPEG sono grandi quanto devono essere per fornire la qualità specificata. La tua proposta di vedere quanto è grande l'immagine più grande nel tuo campione con una qualità del 70% è semplicemente scegliere un livello di complessità dell'immagine e dire "Qualcosa di più complesso di quello è troppo complesso e verrà degradato". Tuttavia, se quasi tutte le immagini sono più piccole di questa soglia con una qualità del 70%, qual è il problema con un numero ridotto di file "troppo grandi"?
David Richerby,

Ciò sembra corrispondere a una conclusione alla quale stavo prendendo in considerazione un approccio per determinare quale di una serie di immagini di un soggetto identico, ma con risoluzioni e qualità diverse fosse l'immagine "migliore" (ad esempio più vicina all'originale).
Michael

10

Sviluppatore Web qui. Ecco come mi avvicinerei a questo:

1. Determinare le dimensioni dell'immagine visualizzata e le risoluzioni dello schermo richieste.

Il tuo primo compito è determinare a quali dimensioni di pixel verranno visualizzate le immagini. Sono foto dei prodotti in un negozio online? Una galleria fotografica? Foto del profilo utente? Molteplici diverse dimensioni? Fai un elenco delle dimensioni in pixel di cui avrai bisogno. Controlla se avrai bisogno di immagini @ 2x per schermi ad alta risoluzione come telefoni e tablet recenti.

2. Utilizzare uno script di miniature per creare nuovi file di immagine.

Questi sono chiamati script di miniature ma possono essere usati per molto più che semplici miniature. Ci sono molti script là fuori o puoi scriverne uno tuo. Non ridimensionando i file originali, puoi farlo se commetti un errore nel tuo script o ti rendi conto lungo la strada che hai bisogno di un'immagine a risoluzione più elevata. Una pratica comune è quella di specificare un suffisso nel nome del file di output. Per esempio:

lena.jpg (Original, 2000x3000)
lena-thumb.jpg (100x150)
lena-thumb@2x.jpg (200x300)
lena-product.jpg (400x600)
lena-product@2x.jpg (800x1200)

3. Comprimi.

Lo script delle miniature deve specificare la compressione jpg quando si tagliano i nuovi file di immagine. Tuttavia, ci sono altri minificatori che potrebbero ridurre ulteriormente le dimensioni del file.


Ecco come gestirlo in futuro: chiedi ai fotografi di posizionare originali ad alta risoluzione in una directory, quindi usa uno script per generare formati più piccoli (miniature di dimensioni diverse e più grandi per desktop e dispositivi mobili) e posizionali sotto www con url riscrittura. Ma in questo momento non ho accesso agli originali.
Salman A

6

Mentre la risposta di @ Rafael ha spiegato i dettagli di compressione JPEG, tenterò di rispondere al tuo web e caricarlo in modo problematico.

L'uso di un'immagine in un sito Web (per la progettazione o il contenuto) imporrà alcuni imperativi: a cosa servirà la mia immagine? Logo, foto di copertina, miniatura, foto in un post di blog, foto a schermo intero per una galleria ... Inoltre, se la usi per più scopi (ad esempio una foto e la sua miniatura della galleria), vuoi rifiutarla in tutte le dimensioni richieste. Tuttavia, a meno che non si stia costruendo il proprio sito Web, al giorno d'oggi il servizio Web genererà immagini di dimensioni inferiori dalla foto più grande da utilizzare in loco.

Ora che conosci lo scopo della tua immagine, il sito web (o CMS o front-end Framework) richiederà sempre una dimensione massima in pixel affinché l'immagine sia conforme. I loghi potrebbero essere 600x600px max, la copertina di sfondo potrebbe essere 1280x720px max, la foto di contenuto per la visualizzazione a schermo intero 1920x1080 o la risoluzione nativa della fotocamera per una conservazione assoluta dei dettagli. Controlla la dimensione corretta dal sito Web che desideri caricare. Si desidera corrispondere almeno sulla dimensione massima dei pixel richiesta, a seconda del rapporto che si desidera ottenere. Attenzione, alcuni servizi ritagliano e allungano l'immagine se le proporzioni non sono le stesse. In tal caso, dovrai ritagliare l'immagine per adattarla alle dimensioni e al rapporto massimi richiesti.

Quindi, il sito Web potrebbe imporre un limite di dimensione del file (o no, a seconda dello scopo dell'immagine). Per quanto riguarda il tempo di caricamento della pagina, più leggero è, meglio è. Nel tuo esempio di immagine ad alta risoluzione a 2400x600px, da 300 a 500kB è una dimensione totalmente fine per il tempo di caricamento. Le immagini di contenuto (come le foto) possono essere più pesanti se lo scopo dell'immagine lo richiede (ad es. Visualizzazione a schermo intero), fino alla risoluzione nativa della fotocamera, se necessario. Se non viene fornita alcuna indicazione, il limite della dimensione del file può essere difficile da indovinare, poiché può dipendere dall'equipaggiamento del pubblico (mobile, desktop ...), dalla qualità della rete del paese del pubblico ... Per la massima qualità e servizio, tratta le foto una a una a ottenere la dimensione minima del file senza artefatti visibili. Per comodità o velocità di elaborazione, ridimensionare lo script utilizzando un livello di compressione complessivamente soddisfacente (circa 70 dovrebbero andare bene).La risposta di @ xiota potrebbe anche essere lo strumento di cui hai bisogno. Imposta qui il tuo standard.

TL; DR lo scopo dell'immagine sul sito Web è la chiave per la quantità di ridimensionamento / compressione.


3

Quello che stai calcolando è la dimensione media compressa di un pixel di immagine, se lo dividi per la dimensione di pixel grezzi (di solito 3 ottetti per un RGB a 24 bit), ottieni il rapporto di compressione.

Questa è una buona metrica che ti fornisce informazioni sullo stato di compressione dell'immagine, ma non è sufficiente giudicare se l'immagine è sufficientemente compressa o meno perché il rapporto di compressione non dipende solo dal profilo di compressione (algoritmo = JPEG, qualità = 60/100) ma anche sul potenziale di compressione dell'immagine: immagini diverse con la stessa dimensione grezza e lo stesso profilo di compressione producono dimensioni jpeg diverse perché le immagini sono più o meno facili da comprimere (un'immagine vuota è molto facile da comprimere, bianca il rumore non lo è).

Per questo motivo e poiché il profilo di qualità "usato per ultimo" non è memorizzato in questa immagine (né nei metadati o nella struttura delle intestazioni jpeg), l'approccio più utilizzato per la ripubblicazione di immagini con un profilo di dimensioni / qualità target è in realtà solo la ricompressione potenzialmente ridimensionare) tutto (automaticamente) indipendentemente dallo stato iniziale dell'immagine.

Sì, puoi ricomprimere quando non è necessario, sì, potresti anche perdere spazio se ricomprimere con un profilo di qualità superiore ma quelli sono casi limite e su larga scala è la cosa più semplice da fare per garantire un profilo di qualità target. Ovviamente, lo vuoi fare solo una volta per non degradare gradualmente le immagini e probabilmente dovresti memorizzare due librerie di immagini: quella iniziale "non trattata" e quella "da pubblicare / ricomprimere".

Esistono molti strumenti per ricomprimere un sacco di file, puoi anche creare il tuo script e usando lo stack tecnico giusto (C ++ e libjpeg principalmente) può essere abbastanza veloce anche per file> 100k.

Se si desidera implementare un processo più intelligente / più complesso, è possibile provare a sperimentare una logica di ridimensionamento / comparazione iterativa per stimare il profilo di qualità originale (la ricompressione con la stessa qualità dovrebbe produrre all'incirca la stessa dimensione, con un valore elevato la qualità dovrebbe aumentare leggermente le dimensioni e con una qualità inferiore dovrebbe ridurre significativamente le dimensioni). Ciò, ovviamente, consumerebbe molta più potenza della CPU.


Le immagini JPG di solito sub-campionano il chroma con 4: 2: 2 o 4: 2: 0 ( en.wikipedia.org/wiki/Chroma_subsampling#4:2:2 ), quindi i pixel "grezzi" che JPG sta comprimendo hanno 2x o 4x tanti pixel luma di ciascun canale cromatico. (Dimezzato in orizzontale e forse anche in verticale). Potresti tenerne conto quando consideri "quanto è compressa" un'immagine. Ma sì, come dici tu non è una grande metrica tra i contenuti di immagini sconosciute.
Peter Cordes,

+1 per il riscalaggio. Ad un certo punto, si ottiene una migliore qualità dell'immagine ridimensionando che riducendo ulteriormente i bit per pixel. A differenza dei moderni codec video come h.264 o h.265 (che possono segnalare al decoder di eseguire più smoothing e deblocking) o la versione di immagini fisse, HEIF, che è un I-frame HEVC (h.265) , JPEG non ' Non ho nulla di tutto ciò e si bloccherà con un sacco di artefatti che squillano se lo fai morire di fame. Quindi devi ridimensionare invece di ridurre la qualità se hai immagini di input ad altissima risoluzione.
Peter Cordes,

2
For example there is a 2400x600px image with a file size of 1.81MB.
Photoshop's save for web command creates a 540KB file at 60 quality and same dimensions.    
This is about 29% of original size.

La dimensione originale non compressa è 2400 x 600 x 3 = 4.320.000 byte (4,1 MB), perché il colore a 24 bit è sempre tre byte di dati RGB per pixel . Non c'è modo di aggirare questa verità assoluta.

Tuttavia, le dimensioni di JPG dipendono anche dai dettagli dell'immagine. Le grandi aree lisce (come il cielo o le pareti dipinte) si comprimono meglio, ma anche le aree di maggiore dettaglio (come un albero pieno di foglie) non si comprimono. Quindi non esiste un indicatore numerico assoluto.

Ma 540 KB è 0,540 / 4,1 = 13% della dimensione originale di 4,1 MB . Potrebbe essere il 29% della precedente dimensione JPG, ma è il 13% della dimensione originale non compressa. Quindi questo è 1/8 della dimensione originale non compressa, che di solito è considerata di qualità "decente". Non ottimale, non massima qualità, ma generalmente decente, forse abbastanza buono per alcuni usi. Sto solo dicendo che è già piccolo.

Un file JPG più grande è una migliore qualità dell'immagine e più piccolo è una qualità dell'immagine inferiore. Devi decidere cosa è abbastanza buono, ma JPG non è mai "troppo grande", poiché la qualità dell'immagine diminuisce con la compressione JPG. Il colore a 24 bit ha tre byte per pixel non compressi.

Quindi la decisione è se la vuoi piccola o se la vuoi bene.

Ma allargare un JPG esistente è ancora peggio, poiché vengono aggiunti più artefatti JPG e, una volta piccoli, i dati vengono modificati e non miglioreranno mai.

Gli artefatti JPG in genere mostrano due modi, come blocchi di 8x8 pixel visibili di un colore nelle aree lisce senza dettagli o come bordi grezzi visibili attorno ai bordi dei dettagli.

Se si modifica e salva nuovamente un JPG, vengono aggiunti altri artefatti JPG. Se è necessario, è buona norma ripetere il salvataggio in modo che corrisponda all'impostazione di compressione originale.


Il numero di 4,1 MB è vero solo se non c'è alcuna compressione, tuttavia, anche un JPEG con una qualità perfetta può avere una dimensione del file inferiore a causa della compressione senza perdita .
Marv

Sì, è per questo che l'ho chiamato "non compresso", che è il modo in cui inizia ogni immagine digitale, che è ovviamente la dimensione effettiva e originale dei dati, motivo per cui è importante. Sì, anche il livello più alto JPG 100 è compresso sostanzialmente più piccolo, non senza perdite. JPG senza perdite è un termine improprio. Non abbiamo programmi che lo offrono. I suoi usi lo chiamano qualcos'altro (Wikipedia dice DNG e alcuni Raw). Tuttavia, JPEG2 può offrire una compressione senza perdita di dati, ma che presenta altri problemi, ad esempio i browser Web non supportano la visualizzazione di JPEG2 e i negozi di stampa fotografica probabilmente non lo accettano.
WayneF,

Non c'è modo di aggirare questa verità assoluta. ... ad eccezione del sottocampionamento Chroma, utilizzato da JPEG. JPEG viene compresso nello spazio colore YUV (luminosità + due componenti colore), non RGB. Di solito 4: 2: 2 o 4: 2: 0, riducendo il numero di pixel in ciascuno dei due canali cromatici di 2x o 4x. en.wikipedia.org/wiki/Chroma_subsampling#4:2:2 . Dopo la trasformazione da RGB a YUV e il sottocampionamento, le informazioni sulla risoluzione del colore sono completamente sparite e non fanno parte di ciò che JPEG sta spendendo bit per codificare. Se vuoi guardare bit / pixel, dovrebbe essere nel formato colore del JPEG che stai prendendo in considerazione.
Peter Cordes,

2
Dai, leggi il testo. La seconda verità assoluta è che espressamente detto e riferito a "non compresso" e detto che il colore a 24 bit era sempre di tre byte per pixel. :)
WayneF,

0

"Save for Web" di Photoshop è in realtà un ottimo compromesso tra dimensione del file e qualità, quindi a meno che tu non abbia requisiti più specifici, dovresti andare con quello. Un consiglio tipico per gli sviluppatori web è di attenersi alla gamma di qualità del 50-70%. Ovviamente, ci sono eccezioni: vorrai una qualità del 90-95% su un logo aziendale che deve apparire sempre bello (o persino convertirlo in un formato senza perdita) e scendere a un minimo del 30% su un formato grande ma a malapena sfondo della pagina visibile.

Inoltre, non dimenticare di ridimensionare le tue immagini. Un'immagine 2400x600 avrà un bell'aspetto su un display 4K, ma verrà ridimensionata su schermi più piccoli, sprecando la larghezza di banda dei dati senza alcun miglioramento visivo per l'utente. Controlla il modello di sito Web che utilizzerai per scoprire la larghezza ottimale per le immagini. In genere, al momento della stesura di questo documento sarà da qualche parte circa 1200-1300 pixel (vedere la risoluzione più popolare qui ).

Ricorda di conservare gli originali delle immagini convertite in qualità Web. Se hai mai bisogno di rielaborare o stampare questo materiale, ti pentirai di averlo solo con una qualità del 60% e una risoluzione di 1 Mpix.

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.