ImageMagickでJPG画像ファイルを圧縮したいのですが、サイズに大きな違いはありません。デフォルトでは、出力サイズは入力より大きくなります。理由はわかりませんが、いくつかの+ profileオプションを追加して品質を設定すると、サイズは小さくなりますが、元のサイズに似ています。
入力画像は255kb、処理画像は264kbです(+ profileを使用してプロファイルを削除し、品質を70%に設定)。その画像を少なくとも150kbに圧縮する方法はありますか?それは可能ですか?どのImageMagickオプションを使用できますか?
私はいつも使用します:
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
を指定することで、ファイルサイズを増やすことなくわずかな改善を得ることができます。つまり、デフォルトの高速整数バージョンではなく、より正確な浮動小数点離散コサイン変換を使用します。
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%節約できます。
PHPでImagickクラスを使用している人にだけ言ってください。
$im -> gaussianBlurImage(0.8, 10); //blur
$im -> setImageCompressionQuality(85); //set compress quality to 85
現像のためにカメラの写真のサイズを変更する必要があると:
コマンド:
mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05
1920x1080の解像度のモニターでは、フルスクリーンで変更を確認できません。解像度2048は、最高品質の360 dpiで10 cmの写真を現像するのに最適です。剥ぎたくありません。
編集:ぼかすことなく、はるかに良い結果が得られることに気付きました。ぼかしを使用しない場合、ファイルサイズは元の50%ですが、品質は向上します(ズーム時)。
JPGとPNGを最小化するための便利なサイドノートと一般的な提案を追加します。
まず、ImageMagickは入力jpeg圧縮を読み取ります(または、より良い "guess"...)レベルなので、-quality NN
をまったく追加しない場合、出力は入力と同じレベルを使用する必要があります。時には重要な機能になる可能性があります。それ以外の場合、デフォルトレベルは-quality 92
です( www.imagemagick.org を参照)
提案は本当に素晴らしい無料ツールについてです ImageOptim 、これもバッチ処理用です。
特に必要な場合は、無料の ImageAlpha [バッチ処理ではない]または無料の Pngy を使用すると、より小さなjpg(およびpngも取得できます。バッチ処理)。
これらのツールはMacおよびWin用であり、コマンドラインとしても使用できます( Brew を使用してインストールし、Brew式で検索することをお勧めします)。
提案されたコマンドに-adaptive-resize 60%
を追加しましたが、-quality 60%
を使用しました。
convert -strip -interlace Plane -gaussian-blur 0.05 -quality 60% -adaptive-resize 60% img_original.jpg img_resize.jpg
これらは私の結果でした
その変換が私のイメージをあまりにも破壊するかどうかはわかりませんが、正直に言って、私の変換がくだらないように見えるとは思いませんでした。それは広角のパノラマであり、細心の障害は気にしませんでした。
@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値を下げることによる損失に加えて、圧縮解除と再圧縮を行うと、品質がいくらか失われます。
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);
}
}
ここで自分自身を実験した人もいましたが、少年はガウスのぼかしがニースを異なるものにしていることをしました。最後に使用したコマンドは次のとおりです。
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モニターでの視覚的な違いは、ズームインするまで顕著ではありません。