web-dev-qa-db-fra.com

Recommandation pour la compression de fichiers JPG avec ImageMagick

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 la sortie est supérieure à celle de l'entrée. Je ne sais pas pourquoi, mais après avoir ajouté quelques options de profil et défini la qualité, je peux obtenir une taille plus petite mais tout de même similaire à l'original.

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

210
Javis Perez

J'utilise toujours:

  • qualité dans 85
  • progressive (compression compressée)
  • un très léger flou gaussien pour optimiser la taille (0,05 ou 0,5 du rayon) dépend de la qualité et de la taille de la photo, ceci optimise notamment la taille du jpeg.
  • Supprimer tout commentaire ou tag exif

dans imagemagick devrait être

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

espérons que cela soit utile.

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

De @Fordi dans les commentaires (n'oubliez pas d'ajouter son commentaire si vous le souhaitez): Si vous n'aimez pas le flou, utilisez plutôt -sampling-factor 4:2:0. Cela permet de réduire de moitié la résolution du canal de la chrominance, sans altérer la résolution de luminance que vos yeux 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 - autrement dit, utilisez la transformation de cosinus discrète à virgule flottante plus précise, plutôt que la version par défaut de l'entier rapide.

402
Felipe Buccioni

J'utilise les Google Pagespeed Insights directives d'optimisation d'image. Pour ImageMagick, ils recommandent ce qui suit:

facteur d'échantillonnage 4: 2: 0
-bande
- qualité 85 [cela peut varier, j'utilise les plages 60-80]
-entrelacer
- Espace couleur RVB

Commande dans ImageMagick:

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

Avec ces options, je peux économiser jusqu'à 40% de la taille JPEG sans trop de perte visible.

44
irina

Juste pour dire à ceux qui utilisent la classe Imagick en PHP:

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

Une fois que j'ai eu besoin de redimensionner les photos de la caméra pour le développement:

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

Commander:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • Résultat taille du fichier 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 le dépouiller.

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

12
tuipveus

J'ajouterais une note latérale utile et une suggestion générale visant à réduire au minimum les formats JPG et PNG.

Tout d’abord, ImageMagick lit (ou mieux "suppose" ...) la compression jpeg en entrée et donc si vous n’ajoutez pas du tout -quality NN, la sortie devrait utiliser le même niveau que l’entrée. Parfois, 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 de plus petits fichiers jpgs (et pngs également, en particulier après l’utilisation du logiciel libre ImageAlpha [sans traitement par lots] ou du logiciel libre Pngy si vous en avez besoin. traitement par lots).
Non seulement, ces outils sont pour Mac et Win et en tant que ligne de commande (je suggère d’installer à l’aide de Brew , puis de chercher dans les formules Brew).

9
Steve

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

C'étaient mes résultats

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

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 n'aimais pas une obstruction méticuleuse.

7
C.shin

@JavisPerez - Est-il possible de compresser cette image au moins à 150 Ko? Est-ce possible? Quelles options d'ImageMagick puis-je utiliser?

Voir les liens suivants où ImageMagick contient une option permettant de spécifier la taille de fichier de sortie souhaitée pour l'écriture dans des fichiers JPG.

http://www.imagemagick.org/Usage/formats/#jpg_writehttp://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 un peu de qualité en décompressant et en recompressant en plus de toute perte due à une valeur de qualité inférieure de l'entrée.

4
fmw42

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);
  }
}
3
emanuelbsilva

Est-ce que certains ont fait moi-même des expériences ici et que le flou gausien a rendu Nice différent. La dernière commande que j'ai utilisée était:

mogrify * - facteur d’échantillonnage 4: 2: 0 - bande de qualité - 88 - entrelacé Plan - définition de

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

3
Ironbelly Studios