web-dev-qa-db-ja.com

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

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

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

200
Javis Perez

私はいつも使用します:

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

imagemagickでは

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

これが役に立つことを願っています。

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

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

388
Felipe Buccioni

Google Pagespeed Insights 画像最適化ガイドラインを使用していますが、ImageMagickには次のことをお勧めします。

-サンプリング係数4:2:0
-ストリップ
-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%節約できます。

42
irina

PHPでImagickクラスを使用している人にだけ言ってください。

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

現像のためにカメラの写真のサイズを変更する必要があると:

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

コマンド:

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

1920x1080の解像度のモニターでは、フルスクリーンで変更を確認できません。解像度2048は、最高品質の360 dpiで10 cmの写真を現像するのに最適です。剥ぎたくありません。

編集:ぼかすことなく、はるかに良い結果が得られることに気付きました。ぼかしを使用しない場合、ファイルサイズは元の50%ですが、品質は向上します(ズーム時)。

12
tuipveus

JPGとPNGを最小化するための便利なサイドノートと一般的な提案を追加します。

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

提案は本当に素晴らしい無料ツールについてです ImageOptim 、これもバッチ処理用です。
特に必要な場合は、無料の ImageAlpha [バッチ処理ではない]または無料の Pngy を使用すると、より小さなjpg(およびpngも取得できます。バッチ処理)。
これらのツールはMacおよびWin用であり、コマンドラインとしても使用できます( Brew を使用してインストールし、Br​​ew式で検索することをお勧めします)。

9
Steve

提案されたコマンドに-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

その変換が私のイメージをあまりにも破壊するかどうかはわかりませんが、正直に言って、私の変換がくだらないように見えるとは思いませんでした。それは広角のパノラマであり、細心の障害は気にしませんでした。

7
C.shin

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

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

入力の-quality値を下げることによる損失に加えて、圧縮解除と再圧縮を行うと、品質がいくらか失われます。

4
fmw42

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

ここで自分自身を実験した人もいましたが、少年はガウスのぼかしがニースを異なるものにしていることをしました。最後に使用したコマンドは次のとおりです。

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モニターでの視覚的な違いは、ズームインするまで顕著ではありません。

3