推荐使用ImageMagick压缩JPG文件

我想用ImageMagick压缩一个JPG图像文件,但在大小上不能得到太大的差异。默认情况下,输出大小大于输入。我不知道为什么,但添加了一些+配置文件选项和设置质量后,我可以得到一个较小的尺寸,但仍然类似于原始。

输入图像为255kb,处理图像为264kb(使用+profile删除profile,设置质量为70%)。有没有办法将图像压缩到至少150kb ?这可能吗?我可以使用哪些ImageMagick选项?

212803 次浏览

我用always:

  • 质量在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

来自@Fordi的评论(如果你喜欢这个,别忘了给他投票): 如果你不喜欢模糊,使用-sampling-factor 4:2:0代替。这样做的目的是将色度通道的分辨率降低到一半,而不会打乱你眼睛所看到的亮度分辨率。如果你想在转换中获得更好的保真度,你可以通过指定-define jpeg:dct-method=float来获得稍微的改进,而不增加文件大小——也就是说,使用更精确的浮点离散余弦变换,而不是默认的快速整数版本

有一次我需要调整相机照片的大小来冲洗:

  • 原始文件大小:2800 kB
  • 分辨率:3264 x2448

命令:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05
  • 结果文件大小为753 kB
  • 2048号决议高模

我用1920x1080分辨率的显示器全屏看不出任何变化。2048分辨率是最好的10厘米照片在360 dpi的最大质量。我不想剥了它。

编辑:我注意到,如果没有模糊,我甚至得到了更好的结果。没有模糊的文件大小是原始的50%,但质量更好(缩放时)。

对于那些在PHP中使用Imagick类的人

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

我将添加一个有用的边注和一个减少JPG和PNG的一般性建议。

首先,ImageMagick读取(或更好的“猜”…)输入jpeg压缩级别,因此如果你根本不添加-quality NN,输出应该使用与输入相同的级别。有时可能是一个重要的特征。否则,默认级别为-quality 92(参见www.imagemagick.org)

这个建议是关于一个非常棒的免费工具ImageOptim,也用于批处理 你可以得到更小的jpg(以及png,特别是在使用免费的ImageAlpha[非批处理过程]或免费的Pngyu(如果你需要批处理过程)之后) 这些工具不仅适用于Mac和Win,而且作为命令行(我建议使用酿造安装,然后在Brew公式中搜索)

我正在使用谷歌页面速度洞察图像优化指南,对于ImageMagick,他们推荐以下:

< p > -sampling-factor 4:2:0 < br > 条< br > -quality 85[它可以变化,我使用的范围是60-80,这里的数字越小文件越小]
交错< br > 色彩RGB < / p >

ImageMagick中的命令:

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

使用这些选项,我可以节省高达40%的JPEG大小,而没有太多明显的损失。

我在这里做了一些实验,孩子,高斯模糊是一个很好的不同。我使用的最后一个命令是:

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显示器上,只有当你把图像放大时,才会发现视觉上的差异。

我在建议的命令中添加了-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 = 13913kb
  • img_resized.jpg = 845KB

我不确定这种转变是否严重破坏了我的形象,但说实话,我不认为我的转变看起来像垃圾。这是一个广角全景,我不介意一丝不苟的阻碍。

@JavisPerez—有什么方法可以将图像压缩到至少150kb ?是, 可能吗?我可以使用哪些ImageMagick选项?< / p >

请参阅以下链接,其中ImageMagick中有一个选项,用于指定写入JPG文件所需的输出文件大小。

http://www.imagemagick.org/Usage/formats/#jpg_write http://www.imagemagick.org/script/command-line-options.php#define < / p > < p > <代码>——jpeg:程度上={大小} 从IM v6.5.8-2开始,您可以为JPEG图像指定最大输出文件大小。大小由后缀指定。例如"400kb".

.
convert image.jpg -define jpeg:extent=150kb result.jpg

通过解压和重新压缩,除了由于降低输入的质量值而造成的损失外,还会损失一些质量。

下面是在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);
}
}

如果图像有很大的尺寸,不调整大小很难得到好的结果,下面是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

我使用这个扫描B&W页得到他们的灰度图像(额外的参数清除阴影从前一页):

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

一个非常古老但有用的答案。

我需要说的是,对于严肃的大尺寸摄影,-gaussian-blur是不能接受的,而不是压缩比。

比较下面,%95与-gaussian-blur 0.05对比%85没有模糊。原始17.5MB(800万像素,有很多细节),%95不模糊5MB, %85不模糊3036KB, %95模糊3365KB。

模糊和压缩比的比较

也许低一点的模糊度,比如0.02会更好。