2009-02-12 15 views
21

JPEG è uno schema di compressione con perdita, pertanto la decompressione-manipolazione-ricompressione normalmente riduce ulteriormente la qualità dell'immagine per ogni passaggio. È possibile ruotare un'immagine JPEG senza incorrere in ulteriori perdite? Da quel poco che so dell'algoritmo JPEG, sembra ingenuamente possibile evitare ulteriori perdite con un po 'di sforzo. Quali comuni programmi di manipolazione di immagini (ad es. GIMP, Paint Shop Pro, Raccolta foto di Windows) e librerie grafiche causano perdita di qualità durante l'esecuzione di una rotazione e quali no?È possibile ruotare un'immagine compressa JPEG senza perdita di qualità?

risposta

6

Sì, è possibile che alcuni casi: rotazioni di 90 gradi e la ribalta sulle immagini con dimensioni che sono un multiplo di 8. Il cuore dell'algoritmo JPEG - parte lossy - implica l'eliminazione dell'immagine in blocchi di 8x8 pixel, eseguendo uno discrete cosine transform sul blocco e quindi quantizzando il risultato.Inoltre c'è anche una conversione dello spazio colore e una compressione senza perdita dei blocchi

La rotazione o il capovolgimento di un blocco 8x8 darà un DCT con stessi coefficienti di base, ma possibilmente trasposti e/o con alcuni cambiamenti di segno a seconda della trasformazione Quindi i passaggi di base per ruotare o capovolgere un'immagine senza perdita comporterebbero:

  1. decomprimere ed estrarre i blocchi
  2. Trasposizione e/o segno capovolgere i coefficienti DCT per ciascun blocco
  3. Rimescolare i blocchi nel loro nuovo ordine (altrimenti i blocchi 8x8 sarebbero ruotati ma ancora nel vecchio posto)
  4. Ricomprime tutto con i passaggi di compressione senza perdita di dati.
+2

C'è una libreria java che fa questo? –

9

Assolutamente - basta modificare il valore di orientamento nei dati EXIF. La stragrande maggioranza dei programmi di immagine rispetterà questa impostazione e mostrerà l'immagine "ruotata".

È anche possibile "manualmente" (ad esempio, programmaticamente) ruotare l'immagine senza perdita di dati se alcuni criteri sono veri: la rotazione deve essere di 90/180 gradi e la larghezza/altezza deve moltiplicare la dimensione del blocco. Puoi anche capovolgerlo/specchiarlo. Non so se i programmi di immagine siano abbastanza intelligenti per le applicazioni speciali di questa operazione. Direi di no.

+0

È possibile eseguire "manualmente" una trasformazione lossless 90-180-270 con jpeg. – xpda

+1

cambiando la Exif dell'immagine non farà nulla ai dati stessi, e alcuni visualizzatori di immagini non la trattano bene.inoltre, è un po 'più difficile da giocare nel caso in cui si desideri modificare l'immagine, dal momento che si deve considerare l'orientamento ... –

2

Non un esperto di jpg, ma sembra che la risposta sia Sì per rotazioni di 90, 180, 270 gradi. (forse anche per 360! :))

+4

360 è fattibile, ma 720 richiede più abilità – Javier

+1

Difficilmente! Fai solo 360 due volte. –

+2

@Assaf, che dire di 1080? – Aardvark

2

Sì, è possibile.
Una rapida ricerca google ha dato questo elenco di programmi which do this

+0

conosci qualche libreria che lo fa? –

0

Se si sta parlando di ruotare un'immagine JPEG allora non c'è più a destra di compressione? Riguarda la rotazione delle posizioni dei pixel.

Effettuare la rotazione con qualsiasi programma modificherà potenzialmente le dimensioni intermedie, in quanto è necessario preservare l'immagine originale, questo potrebbe essere un problema da considerare.

0

A meno che non si esegua la rotazione di multipli di 90 gradi, l'immagine dovrà eseguire una sorta di interpolazione che potrebbe ridurre la qualità dell'immagine. L'utilizzo di un buon algoritmo di interpolazione aiuterà qui.

Per quanto riguarda l'apertura e la ricompressione, non sono sicuro che si otterrebbe una qualità peggiore, ma non sono sicuro di come funzioni JPEG.

Ti suggerisco di provare a comprimere, manipolare e ricomprimere e vedere di persona se il risultato è abbastanza buono. Ciò che è abbastanza buono è soggetto alla tua applicazione.

+1

L'apertura e la ricompressione, specialmente più volte, determinerebbero sicuramente una qualità peggiore. Questa è una debolezza fondamentale della compressione senza perdita di dati. (Indipendentemente dal fatto che sia o meno peggio da curare è decisamente soggettivo come suggerisci). –

8

Dal JPEG FAQ:

"Ci sono alcuni operazioni specializzate che può essere fatto su un file JPEG senza decomprimerlo e quindi senza incorrere nella perdita generazionale che si sarebbe normalmente ottenere dal caricamento e ri-salvare l'immagine in un editor di immagini regolari.In in particolare è possibile effettuare rotazioni a 90 gradi e ribaltabili senza perdita di dati, se le dimensioni dell'immagine sono un multiplo del blocco del file dimensioni (in genere 16x16, 16x8 o 8x8 pixel per JPEG a colori).
...

Ma è necessario un software speciale; la rotazione dell'immagine in un normale editor di immagini non sarà senza perdite."

13

C'è un programma chiamato jpegtran

jpegtran - un programma di utilità per la transcodifica senza perdita di dati tra diversi formati JPEG.

E Here is a list of applications which provide the JPEG lossless rotation feature based on the IJG code

+0

Nota: il pacchetto corrispondente è denominato 'libjpeg-turbo' su ArchLinux. – VasyaNovikov

+0

ATTENZIONE: ho anche scoperto che jpegtran _can in effetti_ perde qualità. Probabilmente capita a jpeg quale dimensione non è divisibile per 16. Commenti da parte di persone benvenute. – VasyaNovikov

1

Secondo l'eccellente articolo sul Understanding Digital Image Interpolation da Sean McHugh:

interpolazione anche si verifica ogni volta si ruota o distorcere l'immagine. (...) La rotazione di 90 ° è senza perdita perché nessun pixel deve essere mai riposizionato sul bordo tra due pixel (e quindi diviso).

e, infine, si conclude con

evitano ruotando le foto quando possibile; se è necessaria una foto non aggiornata , ruotarla non più di una volta.

0

se può aiutare:

Cercando di fare meglio del Microsoft (Windows 7) visualizzatore di immagini native e le sue opzioni di rotazione destro del mouse, ho provato diverse applicazioni del seguente link: http://jpegclub.org/losslessapps.html

Ad esempio, ho provato FastStone Image Viewer, XnView, Photosurfer, JPEG Lossless Rotator, ExifPro Image Viewer.

NESSUNO di essi produce un'immagine più grande rispetto al visualizzatore di immagini di base di Windows 7 dopo una semplice rotazione di 90 °. Si è limitato a concludere così rapidamente, ma non ho ancora trovato una vera e propria app di rotazione lossless per il momento, e in ogni caso non migliore di quella integrata di Windows.