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.