ImageMagickでJPGファイルを圧縮するための推奨事項


246

ImageMagickでJPG画像ファイルを圧縮したいのですが、サイズに大きな違いがありません。デフォルトでは、出力サイズは入力よりも大きくなります。理由はわかりませんが、いくつかの+ profileオプションを追加して品質を下げた後、サイズは小さくなりますが、元のサイズに似ています。

入力画像は255kb、処理画像は264kbです(+ profileを使用してプロファイルを削除し、品質を70%に設定します)。その画像を少なくとも150kbに圧縮する方法はありますか?それは可能ですか?どのImageMagickオプションを使用できますか?


3
JPEGを再圧縮すると、画像のサイズが大きくても、常に画像が劣化します。初めて保存する前に、オリジナルから始められるとよいでしょう。
Mark Ransom 2011

わかっていますが、残念ながら元の画像はありません。大きなjpgファイルしかありませんが、品質とサイズのバランスが取れていると思います
Javis Perez 2011

回答:


440

私はいつも使っています:

  • 85年の品質
  • プログレッシブ(圧縮圧縮)
  • サイズ(半径の0.05または0.5)を最適化するための非常に小さなガウスぼかしは、画像の品質とサイズに依存します。これにより、jpegのサイズが特に最適化されます。
  • コメントやexifタグを取り除きます

imagemagickでは

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

または新しいバージョンでは:

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

これがお役に立てば幸いです。

ソースリンク:http : //www.yuiblog.com/blog/2008/12/05/imageopt-4/

コメントの@Fordiから(必要に応じて彼のコメントを高く評価することを忘れないでください):ぼかしが嫌いな場合は、-sampling-factor 4:2:0代わりに使用してください。これは、目がラッチする輝度の解像度をいじることなく、クロマチャネルの解像度を半分に減らします。変換の忠実度を高めたい場合は、ファイルサイズを増やすことなくわずかに改善でき-define jpeg:dct-method=floatます。つまり、デフォルトの高速整数バージョンではなく、より正確な浮動小数点離散コサイン変換を使用します。


2
ありがとうございました!このコードで画像が170 kbになりました。コードを試すことができるようになりました。また、本当に役立つ-define:extent = MAX_SIZE_IN_KBオプションを見つけました。ありがとうございます。
Javis Perez 2011

36
一連のファイルを実行している場合は、も実行できますmogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg。そのコマンドを実行する前に、バックアップがあることを確認してください。それはその場で書きます。
Richard Ayotte 2013年

3
-strip私のためにやった。ありがとう
Nigel Angel

38
画像が非常にぼやけています。スペースを節約するために意図的に画像をぼかすことは逆効果のようです。より低い品質の%を使用するほうが理にかなっていますか?品質変更プロセスは、見かけの画像品質を維持しながらスペースを節約するのに非常に適しています。画像に0.05ガウスのぼかしを適用したところ、スペースが節約されましたが、まったくがらくたのように見えました。を使うことにしましたmogrify -strip -quality 75% *.jpg。ストリップは素晴らしいです。0品質の低下、および大幅な省スペース。そして75%の品質は100%とほとんど区別できませんが、半分のスペースを取ります。
バトルButkus

80
ぼかしが気に入らない場合は、代わりに-sampling-factor 4:2:0を使用してください。これは、目がラッチする輝度の解像度をいじることなく、クロマチャネルの解像度を半分に減らします。変換の忠実度を高めたい場合は、-define jpeg:dct-method = floatを指定することで、ファイルサイズを増やすことなくわずかに改善できます。つまり、デフォルトの高速ではなく、より正確な浮動小数点離散コサイン変換を使用します。整数バージョン。
Fordi

67

私はGoogle Pagespeed Insightsの画像最適化ガイドラインを使用しています。ImageMagickでは、次のことを推奨しています。

-sampling-factor 4:2:0
-strip
-quality 85 [変化する可能性があります、私は60-80の範囲を使用します。ここでの数値が小さいほど、ファイルが小さいことを意味します]
-interlace
-colorspace RGB

ImageMagickのコマンド:

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

これらのオプションを使用すると、目に見える損失はほとんどなく、JPEGサイズを最大40%節約できます。


16

PHPでImagickクラスを使用している人のために言うと:

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

14

開発のためにカメラから写真のサイズを変更する必要があった場合:

  • 元のファイルサイズ:2800 kB
  • 解像度:3264x2448

コマンド:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • 結果ファイルサイズ753 kB
  • 解像度2048x2048

また、1920x1080解像度のモニターでは、フルスクリーンの変化を確認できません。最大解像度360 dpiで10 cmの写真を現像するには、2048解像度が最適です。私はそれを取り除きたくありません。

編集:ぼやけずにはるかに良い結果が得られることに気づきました。ぼかしなしのファイルサイズは元のサイズの50%ですが、品質は向上しています(ズーム時)。


「-filter Lanczos」を追加する必要はありません。デフォルトで設定されていますimagemagick.org/script/command-line-options.php#filter
Ilya Prokin

上で述べたように、ファイルを小さくするために画像の解像度を下げるのは無意味です。代わりにJPEG品質を下げてください!あなたはそれを自分でテストすることができます-2つの画像を97%JPEGで比較し、別の画像を68%に変換すると、100%ズームを見ても、ピクセルが異なるのを確認するのに苦労します!ストックカメラや携帯電話の設定は、ちょうどあなたがあなたのPCのための大きなストレージと大きなHDDを...と新しい携帯電話を購入したい作るために途方もなく高いですphoto.stackexchange.com/questions/30243/...
McVitas

10

JPGとPNGを最小限に抑えるために、役立つサイドノートと一般的な提案を追加します。

まず第一に、ImageMagickは入力jpeg圧縮レベルを読み取る(またはより正確に推測する)ため、まったく追加しない場合-quality NN、出力は入力と同じレベルを使用する必要があります。時には重要な機能になる可能性があります。それ以外の場合、デフォルトのレベルは-quality 92www.imagemagick.orgを参照)

提案は、バッチプロセス用の本当に素晴らしい無料ツールImageOptimに関するものです。
小さいjpg(およびpngも同様に、バッチプロセスが必要な場合は無料のImageAlpha [バッチプロセスではない]または無料のPngyuを使用した後は特に)を取得できます。
だけでなく、これらのツールはMacとWin用で、コマンドラインとして使用できます(Brewを使用してインストールし、Brewの数式で検索することをお勧めします)。


Linux にはpngquantを使用しました。ImageAlphaページで参照されました。ヒントをありがとう
アレクサンドルリフリツキー

8

私は、追加-adaptive-resize 60%提案したコマンドに、しかし、と-quality 60%

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

これらは私の結果でした

  • img_original.jpg = 13,913KB
  • img_resized.jpg = 845KB

その変換によって画像が破壊されすぎるかどうかはわかりませんが、正直に言って、私の変換がくだらないものだとは思いませんでした。それは広角のパノラマで、細心の注意を払って障害物を気にしませんでした。


5

@JavisPerez-その画像を少なくとも150kbに圧縮する方法はありますか?それは可能ですか?どのImageMagickオプションを使用できますか?

ImageMagickにオプションがあり、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

入力からの品質値の低下による損失に加えて、圧縮解除と再圧縮によって品質がいくらか失われます。


4

ガウシアンのぼかしが素晴らしい違いを生むということを、ここで自分で実験した人がいますか。私が使用した最後のコマンドは:

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

0.05のガウスぼかしなしでは、約261kbで、テストした画像では約171KBでした。大きく複雑な画像を表示する1440pモニターでの視覚的な違いは、ズームインするまで目立ちません。


ガウスぼかしは小さな画像ではうまく機能しませんが、大きな画像では必須です!
Antonin GAVREL

4

PHPでImagickを使用する場合の完全なソリューションは次のとおりです。

$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

画像のサイズが大きく、サイズを変更しないと良好な結果を得ることが難しい場合、以下は60%のサイズ変更であり、ほとんどの目的で画像の多くを破壊しません。

私はこれをグレースケール画像に良い結果で使用しています(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

私はこれをスキャンした白黒ページに使用して、それらをグレースケール画像にします(追加の引数により、前のページからのシャドウをクリーンアップします)。

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 

私はこれをカラー画像に使用します:

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 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.