Raccomandazione per la compressione di file JPG con ImageMagick


246

Voglio comprimere un file di immagine JPG con ImageMagick ma non riesco a ottenere molta differenza nelle dimensioni. Per impostazione predefinita, la dimensione dell'output è maggiore dell'input. Non so perché, ma dopo aver aggiunto alcune opzioni del profilo + e aver impostato la qualità posso ottenere una dimensione più piccola ma ancora simile all'originale.

L'immagine di input è 255kb, l'immagine elaborata è 264kb (utilizzando + profilo per rimuovere i profili e impostare la qualità al 70%). Esiste un modo per comprimere l'immagine a almeno 150 kb? È possibile? Quali opzioni di ImageMagick posso usare?


3
Ricomprimere un JPEG si tradurrà sempre in un'immagine degradata, anche se è più grande. Sarebbe meglio se potessi iniziare con l'originale prima che fosse salvato la prima volta.
Mark Ransom,

Lo so, ma sfortunatamente non ho l'immagine originale, tutto quello che ho è un grande file jpg, ma penso di poter ottenere un buon equilibrio tra qualità e dimensioni
Javis Perez,

Risposte:


440

Uso sempre:

  • qualità in 85
  • progressivo (compressione combinata)
  • una minuscola sfocatura gausssiana per ottimizzare le dimensioni (0,05 o 0,5 del raggio) dipende dalla qualità e dalle dimensioni dell'immagine, in particolare ottimizza le dimensioni del jpeg.
  • Rimuovi qualsiasi commento o tag exif

in imagemagick dovrebbe essere

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 85% source.jpg result.jpg

o nella versione più recente:

magick source.jpg -strip -interlace Plane -gaussian-blur 0.05 -quality 85% result.jpg

spero che questo sia utile.

Link alla fonte: http://www.yuiblog.com/blog/2008/12/05/imageopt-4/

Da @Fordi nei commenti (non dimenticare di esprimere il tuo commento se ti piace): Se non ti piace la sfocatura, usa -sampling-factor 4:2:0invece. Ciò che fa è ridurre della metà la risoluzione del canale cromatico, senza interferire con la risoluzione di luminanza a cui si attaccano i tuoi occhi. Se si desidera una migliore fedeltà nella conversione, è possibile ottenere un leggero miglioramento senza un aumento della dimensione del file specificando -define jpeg:dct-method=float- ovvero, utilizzare la trasformazione del coseno discreto in virgola mobile più accurata, anziché la versione intera rapida predefinita.


2
Grazie! questo codice mi ha portato l'immagine a 170kb, ora posso andare e sperimentare il tuo codice grazie, inoltre ho trovato l'opzione -define: extension = MAX_SIZE_IN_KB che aiuta davvero, grazie!
Javis Perez,

36
Se stai facendo un mucchio di file, puoi anche farlo mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg. Assicurati di avere un backup prima di eseguire quel comando. Scriverà sul posto.
Richard Ayotte,

3
-stripfatto per me. Grazie
Nigel Angel

38
Ho immagini molto sfocate. Sembra controproducente sfocare intenzionalmente l'immagine per risparmiare spazio. Non avrebbe più senso usare solo una percentuale di qualità inferiore? Il processo di modifica della qualità è abbastanza buono nel risparmiare spazio mantenendo una qualità apparente dell'immagine. Ho messo una sfocatura gaussiana di 0,05 sulla mia immagine e mi ha salvato un po 'di spazio, ma sembrava una schifezza totale. Ho deciso di usare mogrify -strip -quality 75% *.jpg. La striscia è fantastica. 0 perdita di qualità e grande risparmio di spazio. E la qualità al 75% è appena distinguibile dal 100%, ma occupa metà dello spazio.
Buttle Butkus,

80
Se non ti piace la sfocatura, usa invece -sampling-factor 4: 2: 0. Ciò che fa è ridurre della metà la risoluzione del canale cromatico, senza interferire con la risoluzione di luminanza a cui si attaccano i tuoi occhi. Se si desidera una migliore fedeltà nella conversione, è possibile ottenere un leggero miglioramento senza un aumento della dimensione dei file specificando -define jpeg: dct-method = float - ovvero, utilizzare la trasformazione del coseno discreta in virgola mobile più accurata, anziché la velocità predefinita predefinita versione intera.
Fordi,

67

Sto utilizzando le linee guida per l'ottimizzazione delle immagini di Google Pagespeed Insights e per ImageMagick mi consigliano quanto segue:

-sampling-factor 4: 2: 0
-strip -quality
85 [può variare, utilizzo l'intervallo 60-80, il numero più basso qui significa file più piccolo]
-interlace
-colorspace RGB

Comando in ImageMagick:

convert image.jpg -sampling-factor 4:2:0 -strip -quality 85 -interlace JPEG -colorspace RGB image_converted.jpg

Con queste opzioni ottengo un risparmio fino al 40% nella dimensione JPEG senza perdite visibili.


16

Dico solo per coloro che usano la classe Imagick in PHP:

$im -> gaussianBlurImage(0.8, 10);      //blur
$im -> setImageCompressionQuality(85);  //set compress quality to 85

14

Una volta avevo bisogno di ridimensionare le foto dalla fotocamera per lo sviluppo:

  • Dimensione file originale: 2800 kB
  • Risoluzione: 3264x2448

Comando:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • Dimensione file di risultati 753 kB
  • Risoluzione 2048x2048

e non riesco a vedere alcun cambiamento a schermo intero con il mio monitor con risoluzione 1920x1080. La risoluzione 2048 è la migliore per lo sviluppo di foto da 10 cm alla massima qualità di 360 dpi. Non voglio spogliarlo.

modifica: ho notato che ho persino ottenuto risultati molto migliori senza sfocare. Senza sfocare la dimensione del file è del 50% rispetto all'originale, ma la qualità è migliore (durante lo zoom).


Non è necessario aggiungere "-filter Lanczos". È impostato di default imagemagick.org/script/command-line-options.php#filter
Ilya Prokin,

come detto sopra, è inutile ridurre la risoluzione dell'immagine per ridurre le dimensioni del file. Abbassa invece la qualità JPEG! Puoi testarlo tu stesso: confronta due immagini una con il 97% di JPEG e un'altra convertita per dire il 68% e avrai davvero difficoltà a vedere i pixel che differiscono anche se guardi lo zoom al 100%! Le impostazioni della fotocamera e del telefono sono ridicolmente alte solo per farti desiderare di acquistare nuovi telefoni con spazio di archiviazione più grande e HDD più grandi per i tuoi PC ... photo.stackexchange.com/questions/30243/…
McVitas

10

Aggiungerei un'utile nota a margine e un suggerimento generale per ridurre al minimo JPG e PNG.

Prima di tutto, ImageMagick legge (o meglio "indovina" ...) il livello di compressione jpeg di input e quindi se non lo aggiungi -quality NNaffatto, l'output dovrebbe usare lo stesso livello dell'input. A volte potrebbe essere una caratteristica importante. Altrimenti il ​​livello predefinito è -quality 92(vedi www.imagemagick.org )

Il suggerimento riguarda uno strumento gratuito davvero fantastico ImageOptim , anche per il processo batch.
Puoi ottenere jpg più piccoli (e anche png, specialmente dopo l'uso di ImageAlpha gratuito [non processo batch] o di Pngyu gratuito se hai bisogno di un processo batch).
Non solo, questi strumenti sono per Mac e Win e come riga di comando (suggerisco di installare utilizzando Brew e quindi cercare nelle formule Brew).


Ho usato pngquant per Linux. È stato referenziato sulla pagina ImageAlpha. Grazie per il suggerimento
Alexander Ryhlitsky,

8

Ho aggiunto -adaptive-resize 60%al comando suggerito, ma con -quality 60%.

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 60% -adaptive-resize 60% img_original.jpg img_resize.jpg

Questi erano i miei risultati

  • img_original.jpg = 13.913KB
  • img_resized.jpg = 845KB

Non sono sicuro che quella conversione distrugga troppo la mia immagine, ma sinceramente non pensavo che la mia conversione sembrasse una schifezza. Era un panorama grandangolare e non mi importava di un'ostruzione meticolosa.


5

@JavisPerez - Esiste un modo per comprimere l'immagine a almeno 150 kb? È possibile? Quali opzioni di ImageMagick posso usare?

Vedere i seguenti collegamenti in cui è presente un'opzione in ImageMagick per specificare la dimensione del file di output desiderata per la scrittura in file JPG.

http://www.imagemagick.org/Usage/formats/#jpg_write http://www.imagemagick.org/script/command-line-options.php#define

-define jpeg:extent={size} As of IM v6.5.8-2 you can specify a maximum output filesize for the JPEG image. The size is specified with a suffix. For example "400kb".

convert image.jpg -define jpeg:extent=150kb result.jpg

Perderai un po 'di qualità decomprimendo e ricomprimendo oltre a qualsiasi perdita dovuta alla riduzione del valore di qualità dall'input.


4

Qualcuno ha sperimentato me stesso qui e il ragazzo fa che la sfocatura gausiana sia diversa. Il comando finale che ho usato è stato:

mogrify * -sampling-factor 4: 2: 0 -strip -quality 88 -interlace Plane -define jpeg: dct-method = float -colorspace RGB -gaussian-blur 0,05

Senza la sfocatura gausiana a 0,05 era di circa 261 KB, con circa 171 KB per l'immagine su cui stavo testando. La differenza visiva su un monitor 1440p con un'immagine complessa di grandi dimensioni non è evidente fino a quando non si esegue lo zoom in avanti.


Nota che la sfocatura gaussiana funziona male con le immagini piccole ma un must per quelle grandi!
Antonin GAVREL il

4

Ecco una soluzione completa per coloro che utilizzano Imagick in PHP:

$im = new \Imagick($filePath);
$im->setImageCompression(\Imagick::COMPRESSION_JPEG);
$im->setImageCompressionQuality(85);
$im->stripImage();
$im->setInterlaceScheme(\Imagick::INTERLACE_PLANE);

// Try between 0 or 5 radius. If you find radius of 5 
// produces too blurry  pictures decrease to 0 until you 
// find a good balance between size and quality. 
$im->gaussianBlurImage(0.05, 5);



// Include this part if you also want to specify a maximum size for the images

$size = $im->getImageGeometry();
$maxWidth = 1920;
$maxHeight = 1080;


// ----------
// |        |
// ----------
if($size['width'] >= $size['height']){
  if($size['width'] > $maxWidth){
    $im->resizeImage($maxWidth, 0, \Imagick::FILTER_LANCZOS, 1);
  }
}


// ------
// |    |
// |    |
// |    |
// |    |
// ------
else{
  if($size['height'] > $maxHeight){
    $im->resizeImage(0, $maxHeight, \Imagick::FILTER_LANCZOS, 1);
  }
}

0

Se l'immagine ha grandi dimensioni è difficile ottenere buoni risultati senza ridimensionare, di seguito è riportato un ridimensionamento del 60 percento che per la maggior parte degli scopi non distrugge troppo l'immagine.

Lo uso con un buon risultato per immagini in scala di grigi (converto da PNG):

ls ./*.png | xargs -L1 -I {} convert {} -strip -interlace JPEG -sampling-factor 4:2:0 -adaptive-resize 60%   -gaussian-blur 0.05 -colorspace Gray -quality 20  {}.jpg

Lo uso per le pagine scansionate in bianco e nero, le porto su immagini in scala di grigi (gli argomenti extra puliscono le ombre dalle pagine precedenti):

ls ./*.png | xargs -L1 -I {} convert {} -strip -interlace JPEG -sampling-factor 4:2:0 -adaptive-resize 60%   -gaussian-blur 0.05 -colorspace Gray -quality 20 -density 300 -fill white -fuzz 40% +opaque "#000000" -density 300 {}.jpg 

Lo uso per immagini a colori:

ls ./*.png | xargs -L1 -I {} convert {} -strip -interlace JPEG -sampling-factor 4:2:0 -adaptive-resize 60%   -gaussian-blur 0.05 -colorspace RGB -quality 20  {}.jpg 
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.