建议使用ImageMagick压缩JPG文件


246

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

输入图像为255kb,处理后的图像为264kb(使用+ profile删除配置文件并将质量设置为70%)。有什么办法可以将该图像至少压缩到150kb?那可能吗?我可以使用哪些ImageMagick选项?


3
重新压缩JPEG总是会导致图像质量下降,即使它更大。如果您可以在第一次保存原始文档之前先从它开始,那会更好。
马克·兰瑟姆

我知道,但是不幸的是我没有原始图像,我只有一个大jpg文件,但是我认为我可以在质量和尺寸之间取得良好的平衡
Javis Perez 2011年

Answers:


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
谢谢!这段代码使我的图像达到了170kb,现在我可以去尝试一下您的代码了,谢谢,我也发现了-define:extent = MAX_SIZE_IN_KB选项,确实很有帮助,谢谢!
哈维斯·佩雷斯

36
如果您要处理大量文件,也可以这样做mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg。在运行该命令之前,请确保已备份。它将在适当位置写入。
理查德·阿约特

3
-strip为我做了。谢谢
奈杰尔·安吉尔

38
我的图像非常模糊。故意模糊图像以节省空间似乎适得其反。仅使用质量较低的%会更有意义吗?更改质量的过程很好地节省了空间,同时又保持了明显的图像质量。我在图像上放置了0.05高斯模糊,它节省了一些空间,但看起来像个废话。我决定使用mogrify -strip -quality 75% *.jpg。脱衣舞很好。0质量损失,并节省大量空间。质量为75%的产品与100%的产品几乎没有区别,但占据了一半的空间。
Buttle Butkus

80
如果您不喜欢模糊,请改用-sampling-factor 4:2:0。这样做是将色度通道的分辨率降低到一半,而不会干扰您的眼睛锁定的亮度分辨率。如果要在转换中获得更高的保真度,则可以通过指定-define jpeg:dct-method = float来在不增加文件大小的情况下进行一些改进,即使用更精确的浮点离散余弦变换,而不是使用默认的快速整数版本。
2014年

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

使用这些选项,我可以节省多达40%的JPEG大小,而不会造成太多可见损失。


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分辨率监视器在全屏上看不到任何变化。2048分辨率最适合以360 dpi的最大质量显影10厘米的照片。我不想剥离它。

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


您不必添加“ -filter Lanczos”。默认设置为imagemagick.org/script/command-line-options.php#filter
Ilya Prokin

如上文所述-降低图像分辨率以缩小文件大小是没有用的。降低JPEG质量!您可以自己进行测试-比较两幅图像,一张具有97%的JPEG,另一张则转换为68%,即使查看100%缩放,您也很难看到任何不同的像素!备用
McVitas

10

我会添加一个有用的旁注和一个一般性建议,以最小化JPG和PNG。

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

这个建议是关于一个非常棒的免费工具ImageOptim,它也适用于批处理。
您可以获得较小的jpg(以及png),尤其是在使用免费的ImageAlpha(不是批处理)或免费的Pngyu(如果需要批处理)之后)。
这些工具不仅适用于Mac和Win,而且适用于命令行(我建议使用Brew进行安装,然后在Brew公式中进行搜索)。


我在Linux上使用了pngquant。它在ImageAlpha页面上被引用。感谢您的提示
Alexander Ryhlitsky

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/ 用法/ 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

除了由于降低输入中的-quality值而导致的任何损失之外,您还将通过解压缩和重新压缩而损失一些质量。


4

在这里做了一些实验,男孩做过高斯模糊带来了很大的不同。我使用的最后一条命令是:

mogrify *-采样因子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 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.