使用ImageMagick压缩JPG文件的建议

332

我想使用ImageMagick压缩一张JPG图片,但是大小并没有明显变化。默认情况下输出的尺寸比输入的还要大。我不知道为什么,在添加一些+profile选项和调低质量后,虽然大小减小了,但仍与原始图片相似。

输入的图片大小为255kb,处理后的图片大小为264kb(使用+profile删除配置文件和将质量设置为70%)。是否有办法将该图片至少压缩到150kb?这是否可能?我可以使用哪些ImageMagick选项?


5
重新压缩JPEG图像将始终导致降质,即使它比原来更大。最好从第一次保存之前的原始图像开始。 - Mark Ransom
我知道,但不幸的是我没有原始图像,我只有一个大的jpg文件,但我认为我可以在质量和大小之间取得一个良好的平衡。 - Javis Perez
11个回答

601

我总是使用:

  • 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来稍微提高而不增加文件大小——即使用更精准的浮点离散余弦变换,而不是默认的快速整数版本。


3
谢谢!这段代码让我的图片压缩到了170kb,现在我可以拿着你的代码去尝试一下了,谢谢。另外,我发现了“-define:extent=MAX_SIZE_IN_KB”选项,它确实帮了我很多,谢谢! - Javis Perez
46
如果你要处理一堆文件,你也可以使用命令 mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg。在运行该命令之前确保已备份文件。该命令会直接写入原文件。 - Richard Ayotte
47
我的图像非常模糊。故意使图像模糊以节省空间似乎是不明智的。使用更低的质量百分比会更合理,因为改变图像质量的过程可以在保持视觉品质的同时有效地节省空间。我在我的图像上加了0.05高斯模糊,虽然节省了一些空间,但看起来很糟糕。最终我决定使用“mogrify -strip -quality 75%*.JPG”命令。Strip功能很棒,没有任何质量损失,可以大大节省空间。而且,75%的质量几乎与100%相同,但只需要一半的空间。 - Buttle Butkus
111
如果你不喜欢模糊效果,可以使用“-sampling-factor 4:2:0”,它会将色度通道的分辨率减半,而不会影响亮度通道的分辨率。这样可以使图像更清晰。如果你想要更好的转换保真度,可以通过指定“-define jpeg:dct-method=float”来获得略微的改进,而不会增加文件大小。也就是说,使用更精确的浮点离散余弦变换,而不是默认的快速整数版本。 - Fordi
3
不要模糊图像,那很愚蠢。使用质量设置来减小文件大小,它被设计为在保持视觉相似性的同时最优化地减小文件大小。个人建议使用“-quality 40”,这可以显著减小图像的大小而不会有明显的失真(当然这也取决于图片类型)。 - Automatico
显示剩余16条评论

107

我正在使用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%。


5
谷歌推荐使用sRGB... 你为什么写RGB?有特别的原因吗? - collimarco
1
@collimarco 我发现使用线性颜色空间(RGB)的原因仅仅是为了临时调整大小 - Pablo Bianchi
3
完美的命令可以扩展@irina的描述,因为mogrify在需要从完整目录创建目标目录时不会创建它。 SOURCE =. / * .jpg DESTINE = $(mkdir -p ./resize; echo $ _); mogrify -monitor -sampling-factor 4:2:0 -strip -interlace JPEG -colorspace sRGB -path $ DESTINE -resize 1000 -compress JPEG -quality 80 $ SOURCE - jcarlosweb

17

对于那些在PHP中使用Imagick类的人,只是想说:

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

15

有一次我需要为冲洗照片而从相机中调整照片大小:

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

命令:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • 结果文件大小为753 kB
  • 分辨率为2048x2048

我的1920x1080分辨率显示器全屏看不到任何变化。 2048分辨率是以最高的 360 dpi 开发10厘米照片的最佳分辨率。我不想削减它。

编辑:我注意到甚至在没有模糊的情况下,效果更好。 没有模糊时文件大小仅为原始文件大小的50%,但质量更好(放大时)。


您不必添加“-filter Lanczos”。它已默认设置。http://www.imagemagick.org/script/command-line-options.php#filter - Ilya Prokin
如上所述,降低图像分辨率以使文件更小是无用的。相反,应该降低JPEG质量!您可以自行测试-比较两个图像,一个使用97%的JPEG,另一个转换为68%,即使您以100%缩放查看,也很难看到任何像素不同!库存相机和手机设置过高,只是为了让您购买具有更大存储空间和更大硬盘驱动器的新手机和电脑... https://photo.stackexchange.com/questions/30243/what-quality-to-choose-when-converting-to-jpg - McVitas

12

@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} 从 IM v6.5.8-2 开始,您可以为 JPEG 图像指定最大输出文件大小。该大小是带后缀的。例如,“400kb”。

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

当您解压缩和重新压缩时,除了由于将输入的“质量值”降低而导致的任何损失外,还会损失一些质量。


11
我会添加一个有用的侧记和一个一般性建议,以最小化JPG和PNG。
首先,ImageMagick读取(或更好地说“猜测”...)输入jpeg压缩级别,因此如果您根本不添加-quality NN,输出应该使用与输入相同的级别。有时可能是一个重要的特点。否则,默认级别是-quality 92(参见www.imagemagick.org)。
这则建议是关于一个真的很棒的免费工具ImageOptim,还支持批处理。
你可以使用它来压缩 jpgs(还有pngs,特别是在使用免费的ImageAlpha[不支持批处理]或者免费的Pngyu进行批处理之后)。
这些工具除了Mac和Win版本外,还有命令行版本(我建议使用Brew安装,然后在Brew公式中搜索)。

我在Linux上使用了pngquant。这是在ImageAlpha页面上提到的。感谢提示。 - Aleksander Ryhlitski

11

我在建议的命令中添加了-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

我不确定转换是否会破坏我的图像,但是我并没有觉得我的转换看起来很差。这是一个广角全景图像,我并不在意精细的遮挡。


8
以下是使用Imagick的PHP用户的完整解决方案:

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

6

我在这里进行了一些实验,哇,高斯模糊确实让图像变得不同。我使用的最终命令是:

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

如果不使用高斯模糊,测试图片的大小约为261KB,使用高斯模糊后大小约为171KB。在分辨率为1440p且为复杂大型图片的显示器上,除非你放大查看,否则视觉差异并不明显。


请注意,高斯模糊在小图像上效果不佳,但对于大图像来说是必不可少的! - Antonin GAVREL
@AntoninGAVREL 可能是因为模糊因子需要根据图像的大小进行调整。 - xeruf

5
一个非常古老但有用的答案。
我需要说,对于严肃的大型摄影,与其使用高斯模糊(-gaussian-blur),不如使用压缩比。如下所示,95%带有高斯模糊0.05 vs。不模糊85%。原始文件大小为17.5MB(8MP,具有很多细节),95%未模糊5MB,85%未模糊3036KB,95%带模糊3365KB。
在高斯模糊方面,也许0.02以下会更好。
比较高斯模糊和压缩比之间的差异。 点击此处查看

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接