Recommandation pour compresser des fichiers JPG avec ImageMagick

246

Je veux compresser un fichier image JPG avec ImageMagick mais je ne peux pas obtenir beaucoup de différence de taille. Par défaut, la taille de sortie est plus grande que l'entrée. Je ne sais pas pourquoi, mais après avoir ajouté des options de profil + et défini la qualité, je peux obtenir une taille plus petite mais toujours similaire à l'original.

L'image d'entrée est de 255 Ko, l'image traitée est de 264 Ko (en utilisant + profil pour supprimer les profils et définir la qualité à 70%). Existe-t-il un moyen de compresser cette image à 150 Ko au moins? Est-ce possible? Quelles options ImageMagick puis-je utiliser?

Javis Perez
la source
3
La recompression d'un JPEG entraînera toujours une image dégradée, même si elle est plus grande. Il serait préférable de commencer par l'original avant qu'il ne soit enregistré la première fois.
Mark Ransom
Je sais, mais malheureusement je n'ai pas l'image d'origine, tout ce que j'ai est un gros fichier jpg, mais je pense que je peux obtenir un bon équilibre entre qualité et taille
Javis Perez

Réponses:

440

J'utilise toujours:

  • qualité en 85
  • progressive (compression comprobée)
  • un très petit flou gaussien pour optimiser la taille (0,05 ou 0,5 de rayon) dépend de la qualité et de la taille de l'image, ce qui optimise notamment la taille du jpeg.
  • Supprimer tout commentaire ou balise exif

dans imagemagick devrait être

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

ou dans la version la plus récente:

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

j'espère que cela vous sera utile.

Lien source: http://www.yuiblog.com/blog/2008/12/05/imageopt-4/

De @Fordi dans les commentaires (n'oubliez pas de lever le pouce si vous le souhaitez): Si vous n'aimez pas le flou, utilisez -sampling-factor 4:2:0plutôt. Cela permet de réduire de moitié la résolution du canal de chrominance, sans gâcher la résolution de luminance sur laquelle vos yeux se verrouillent. Si vous souhaitez une meilleure fidélité dans la conversion, vous pouvez obtenir une légère amélioration sans augmentation de la taille du fichier en spécifiant -define jpeg:dct-method=float- c'est-à-dire, utiliser la transformation cosinus discrète en virgule flottante plus précise, plutôt que la version entière rapide par défaut.

Felipe Buccioni
la source
2
Je vous remercie! ce code m'a donné l'image à 170kb, maintenant je peux aller expérimenter avec votre code merci, j'ai aussi trouvé l'option -define: extend = MAX_SIZE_IN_KB qui aide vraiment, merci!
Javis Perez
36
Si vous faites un tas de fichiers, vous pouvez également le faire mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg. Assurez-vous d'avoir une sauvegarde avant d'exécuter cette commande. Il écrira en place.
Richard Ayotte
3
-stripl'a fait pour moi. Merci
Nigel Angel
38
J'ai des images très floues. Il semble contre-productif de brouiller intentionnellement l'image pour économiser de l'espace. Ne serait-il pas plus judicieux d'utiliser simplement un% de qualité inférieure? Le processus de changement de qualité est assez bon pour économiser de l'espace tout en conservant une qualité d'image apparente. J'ai mis un flou gaussien de 0,05 sur mon image et cela a économisé de l'espace mais ressemblait à une merde totale. J'ai décidé d'utiliser mogrify -strip -quality 75% *.jpg. Strip est super. 0 perte de qualité et grande économie d'espace. Et la qualité à 75% se distingue à peine de 100%, mais prend la moitié de l'espace.
Buttle Butkus
80
Si vous n'aimez pas le flou, utilisez plutôt le facteur d'échantillonnage 4: 2: 0. Cela permet de réduire de moitié la résolution du canal de chrominance, sans gâcher la résolution de luminance sur laquelle vos yeux se verrouillent. Si vous voulez une meilleure fidélité dans la conversion, vous pouvez obtenir une légère amélioration sans augmentation de la taille du fichier en spécifiant -define jpeg: dct-method = float - c'est-à-dire, utilisez la transformation en cosinus discrète en virgule flottante plus précise, plutôt que la rapide par défaut version entière.
Fordi
67

J'utilise les directives d'optimisation d'image de Google Pagespeed Insights , et pour ImageMagick, ils recommandent ce qui suit:

-facteur d'échantillonnage 4: 2: 0
-strip -quality
85 [il peut varier, j'utilise la plage 60-80, un nombre inférieur ici signifie un fichier plus petit]
-entrelacement
-colorspace RGB

Commande dans ImageMagick:

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

Avec ces options, j'obtiens jusqu'à 40% d'économies sur la taille JPEG sans perte visible.

irina
la source
16

Je dis simplement à ceux qui utilisent la classe Imagick en PHP:

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

la source
14

Une fois que j'avais besoin de redimensionner les photos de l'appareil photo pour les développer:

  • Taille du fichier d'origine: 2800 kB
  • Résolution: 3264x2448

Commander:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • Taille du fichier de résultat 753 kB
  • Résolution 2048x2048

et je ne vois aucun changement en plein écran avec mon moniteur de résolution 1920x1080. La résolution 2048 est la meilleure pour développer des photos de 10 cm avec une qualité maximale de 360 ​​dpi. Je ne veux pas l'enlever.

edit: j'ai remarqué que j'obtiens même de bien meilleurs résultats sans flou. Sans flou, la taille du fichier représente 50% de l'original, mais la qualité est meilleure (lors du zoom).

tuipveus
la source
Vous n'avez pas besoin d'ajouter "-filter Lanczos". Il est défini par défaut imagemagick.org/script/command-line-options.php#filter
Ilya Prokin
comme cela a été dit ci-dessus - il est inutile de réduire la résolution de l'image pour réduire la taille du fichier. Baissez plutôt la qualité JPEG! Vous pouvez le tester vous-même - comparez deux images l'une avec 97% JPEG et une autre convertie en disons 68% et vous aurez vraiment du mal à voir des pixels différents même si vous regardez le zoom à 100%! Les paramètres de l'appareil photo et du téléphone sont ridiculement élevés juste pour vous donner envie d'acheter de nouveaux téléphones avec un stockage plus important et des disques durs plus grands pour vos PC ... photo.stackexchange.com/questions/30243/…
McVitas
10

J'ajouterais une note utile et une suggestion générale pour minimiser JPG et PNG.

Tout d'abord, ImageMagick lit (ou mieux "devine" ...) le niveau de compression JPEG d'entrée et donc si vous n'ajoutez pas -quality NNdu tout, la sortie devrait utiliser le même niveau que l'entrée. Parfois, cela pourrait être une caractéristique importante. Sinon, le niveau par défaut est -quality 92(voir www.imagemagick.org )

La suggestion concerne un outil gratuit vraiment génial ImageOptim , également pour le traitement par lots.
Vous pouvez obtenir des jpgs plus petits (et des pngs également, surtout après l'utilisation de l' ImageAlpha gratuit [pas de traitement par lots] ou du Pngyu gratuit si vous avez besoin d'un traitement par lots).
Non seulement, ces outils sont pour Mac et Win et comme ligne de commande (je suggère d'installer à l'aide de Brew puis de rechercher dans les formules Brew).

Steve
la source
J'ai utilisé pngquant pour Linux. Il a été référencé sur la page ImageAlpha. Merci pour l'allusion
Alexander Ryhlitsky
8

J'ai ajouté -adaptive-resize 60%à la commande suggérée, mais avec -quality 60%.

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

Ce sont mes résultats

  • img_original.jpg = 13 913 Ko
  • img_resized.jpg = 845 Ko

Je ne sais pas si cette conversion détruit trop mon image, mais honnêtement, je ne pensais pas que ma conversion ressemblait à de la merde. C'était un panorama grand angle et je ne me souciais pas d'une obstruction méticuleuse.

C.shin
la source
5

@JavisPerez - Existe-t-il un moyen de compresser cette image à 150 Ko au moins? Est-ce possible? Quelles options ImageMagick puis-je utiliser?

Voir les liens suivants où il existe une option dans ImageMagick pour spécifier la taille de fichier de sortie souhaitée pour l'écriture dans des fichiers 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

Vous perdrez une certaine qualité en décompressant et recompressant en plus de toute perte due à la baisse de la valeur de qualité de l'entrée.

fmw42
la source
4

Est-ce que certains m'ont expérimenté ici et mon garçon fait que le flou gausien fait une belle différence. La dernière commande que j'ai utilisée était:

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

Sans le flou gausien à 0,05, il était d'environ 261 Ko, avec environ 171 Ko pour l'image sur laquelle je testais. La différence visuelle sur un moniteur 1440p avec une grande image complexe n'est pas perceptible tant que vous n'avez pas zoomé à fond.

Ironbelly Studios
la source
Notez que le flou gaussien fonctionne mal avec les petites images mais un must have pour les grandes!
Antonin GAVREL
4

Voici une solution complète pour ceux qui utilisent Imagick en 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);
  }
}
emanuelbsilva
la source
0

Si l'image a de grandes dimensions, il est difficile d'obtenir de bons résultats sans redimensionnement, voici un redimensionnement de 60% qui, pour la plupart des utilisations, ne détruit pas trop l'image.

J'utilise ceci avec un bon résultat pour les images en niveaux de gris (je convertis de 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

Je l'utilise pour les pages en noir et blanc numérisées pour les obtenir en images en niveaux de gris (les arguments supplémentaires nettoient les ombres des pages précédentes):

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 

J'utilise ceci pour des images en couleur:

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 
Eduard Florinescu
la source