2012-11-30 15 views
17

Ho un'applicazione di condivisione foto PHP in cui le immagini caricate dall'utente sono ridimensionate in vari formati di thumb usando ImageMagick.Come rimuovere exif da un JPG senza perdere la qualità dell'immagine?

Come un modo apparentemente "intelligente" di risparmiare sulle dimensioni del file, sto stripping informazioni exif da queste pollici come segue:

$imagick = new Imagick($image); 
$imagick->stripImage(); 
$imagick->writeImage($image); 

Questo funziona. Rimuove le informazioni EXIF, dove un pollice di 30 KB salva 12 KB e diventa 18 KB. Un notevole risparmio quando si mostrano molti di questi pollici su una singola pagina.

Il problema tuttavia è che funziona un po 'troppo bene. Le immagini risultanti sembrano perdere molte informazioni sul colore e sembrano "piatte" rispetto alle loro versioni non spogliate.

Sulla base della mia ricerca finora, la mia teoria è che una o entrambe le seguenti condizioni:

  • Imagick butta via essenziali informazioni sul profilo colore come parte del processo di strippaggio
  • Imagick ricomprime l'immagine al salvataggio, perdita di qualità

Indipendentemente dalla causa del problema, sto cercando un modo per rimuovere le informazioni EXIF ​​in modo tale da non influire sulla qualità dell'immagine o sul colore stesso.

È possibile?

Aggiornamento:

in base alla risposta di Gerald Schneider, ho provato far rispettare l'impostazione di qualità al 100% prima di "strippaggio" l'immagine:

$imagick = new Imagick($image); 
$imagick->setCompression(imagick::COMPRESSION_JPEG); 
$imagick->setCompressionQuality(100); 
$imagick->stripImage(); 
$imagick->writeImage($image); 

Purtroppo, il problema rimane. Di seguito è riportato l'esempio di output in cui, nonostante l'impostazione della qualità al 100%, le immagini sono ancora appiattite.

enter image description here

+2

In qualche modo dubito che la rimozione di EXIF ​​riduca di molto le dimensioni del file. Immagino che la riduzione della dimensione del file sia piuttosto dovuta alla ricompressione, magari con una qualità inferiore rispetto a prima. Hai provato a usare 'getCompressionQuality()' e 'setCompressionQuality()'? –

+0

@GeraldSchneider questo dipende. Ho visto file con letteralmente centinaia di kilobyte (quasi mezzo meg in casi estremi) di dati EXIF. Strippare le immagini di EXIF ​​è sempre una buona idea. – mingos

+0

Ciò potrebbe essere vero per un'immagine direttamente da una fotocamera, ma per una miniatura generata? –

risposta

22

consideri mantenendo il profilo ICC (che provoca colori più ricchi), mentre la rimozione di tutti gli altri dati EXIF:

  1. Estrarre il profilo ICC
  2. Striscia EXIF ​​dati e immagini di profilo
  3. aggiungere il profilo ICC posteriore

In PHP + imagick:

$profiles = $img->getImageProfiles("icc", true); 

$img->stripImage(); 

if(!empty($profiles)) 
    $img->profileImage("icc", $profiles['icc']); 

(Nota importante: utilizzo di ImageMagick 3.1.0 beta, il risultato ottenuto da getImageProfiles() era leggermente diverso da documentation. Vorrei consigliare a giocare con i parametri fino ad ottenere un array associativo con il profilo reale (s))

Per riga di comando ImageMagick:.

convert image.jpg profile.icm 
convert image.jpg -strip -profile profile.icm output.jpg 

Le immagini saranno ricompresso, naturalmente, se si utilizza ImageMagick , ma almeno i colori rimangono intatti.

Spero che questo aiuti.

+1

Grazie, Robbert. Ho provato un sacco di altre tecniche, ma questa è stata l'unica che mi ha dato i risultati che cercavo. Sto lavorando con ImageMagick dalla riga di comando, quindi ho dovuto tradurre un po ': 1) Salva il profilo nel file 'convert image.jpg profile.icm' 2) Rimuovi il profilo dall'immagine, quindi riapplica dal file' convert image.jpg -auto-orient -strip -profile profile.icm output.jpg' –

+0

Felice di essere di aiuto, Ciad. Grazie per aver fornito un'alternativa da riga di comando - Ho aggiunto il tuo codice alla risposta. – Robbert

+0

Fresco, solo fyi, il -auto-orient per orientare le foto con i dati di rotazione exif e non è necessario che il comando funzioni. Volevo toglierlo dal commento, ma la mia finestra di modifica è scaduta! –

1

Dopo aver fatto modifiche simili tipi MIME in intestazioni dei file che sono stati memorizzati in modo non corretto, io suggerirei di verificare la lunghezza dei dati EXIF ​​tramite gli strumenti standard, e quindi i dati "Zero" manualmente utilizzando funzioni di stringa multibyte.

EXIF ​​può essere un massimo di 64 KB in un file JPEG, tuttavia non sono positivo se è 64 KB esatto, quindi inizierei con questo.

Problemi correlati