Possiamo cambiare la dimensione di un'immagine JPEG senza decodifica e ricodifica?


12

Voglio convertire un'immagine JPEG 640x480 in 320x240. So che può essere fatto decodificando l'immagine JPEG in YCbCr grezzo, ridimensionandola e ricodificandola in JPEG. Ma è possibile con la codifica JPEG ridimensionare direttamente l'immagine senza decodifica?

Risposte:


14

Puoi, ma solo se il tuo visualizzatore JPEG supporta l' estensione JPEG SmartScale . jpegtran può farlo per dimensioni di N / 8, con N = 1..16. Fondamentalmente, la dimensione del blocco DCT viene modificata da 8x8 a qualcos'altro durante la ricompressione (ad esempio 4x4), che ridimensiona efficacemente l'immagine.

Nota: SmartScale è stato introdotto nella versione 8 della libreria libjpeg, ma non è ampiamente supportato dai visualizzatori.

Un documento che descrive le modifiche nei dettagli è disponibile qui: Evoluzione di JPEG .

EDIT: Sembra che la maggior parte degli spettatori non riesca effettivamente a visualizzare queste immagini, poiché sono basate su libjpeg-turbo. E libjpeg-turbo ha scelto di non implementare questa funzione . In effetti, ho provato parecchi programmi (su Ubuntu 14.04 e Windows 8) e nessuno è stato in grado di visualizzare l'immagine ridimensionata creata usando jpegtrans. Persino Photoshop, IrfanView e GIMP sono falliti.

EDIT 2: In effetti, Ubuntu e Fedora non distribuiscono nemmeno la libreria libjpeg8, ma la sostituiscono completamente con la versione libjpeg-turbo. Quindi nessuno dei programmi sarà in grado di leggere i file JPEG SmartScale, ad eccezione di alcuni file binari collegati staticamente alla libreria libjpeg8 originale.


Esiste un codec che costruisce l'immagine che cresce semplicemente aggiungendo ulteriori dati all'immagine?
Necktwi,

che dire del jpeg progressivo? Non fa esattamente quello che sto chiedendo?
Necktwi,

No, ciò fa qualcosa di leggermente diverso aumentando la qualità dell'immagine (da bassa a piena), ma la risoluzione è sempre invariata ( riferimento ). Tuttavia, esiste un'altra estensione JPEG chiamata "modalità gerarchica", che codifica per risoluzioni diverse ( vedere anche qui ). Ma ancora una volta, libjpeg-turbo non lo supporta (vedi qui , cerca "progressivo" nel testo).
jmiserez,

1
E per rispondere al primo commento, ovviamente ci sono tali codec. Proprio non JPG. Quello che stai cercando è chiamato piramide di immagini o rappresentazione multiscala. Ad esempio JPEG2000 utilizza una trasformazione wavelet che crea una piramide wavelet. Esistono altre piramidi, come le piramidi gaussiane o lappacee. Questa diapositiva offre una buona panoramica di come funzionano le cose, mentre JPEG2000 è discusso qui e qui .
jmiserez,

Grazie per le informazioni sui nuovi formati JPEG. Non mi aspetto che molte immagini sorgente (fotocamere, scanner, ecc.) Le usino ancora.
AFH,

3

La risposta breve è no. Un'immagine JPEG utilizza la compressione, il che significa che ogni byte di output dipende da tutti gli altri. Se si modifica il numero di byte immagine, è necessario decomprimere e ricomprimere.

Ci sarà una perdita di qualità a seguito della ricompressione, poiché JPEG utilizza una compressione con perdita, ma stai perdendo comunque qualità tagliando la risoluzione. È possibile ottenere la migliore qualità possibile dall'immagine a bassa risoluzione aumentando il livello di qualità JPEG durante la ricompressione, sebbene ciò aumenterà ovviamente le dimensioni del file.

Se lavori molto con le immagini, è meglio lavorare in un formato di compressione senza perdita di dati, come PNG, convertendolo in JPEG solo quando le immagini sono finalizzate, a condizione che tu abbia lo spazio extra sul disco.

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.