建议使用ImageMagick压缩JPG文件

时间:2011-08-31 18:44:59

标签: image-processing imagemagick

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

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

11 个答案:

答案 0 :(得分:383)

我总是使用:

  • 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来获得略微改进而不增加文件大小 - 也就是说,使用更精确的浮点离散余弦变换,而不是默认的快速整数版本。 / p>

答案 1 :(得分:40)

我使用Google Pagespeed Insights图片优化指南,对于ImageMagick,他们建议使用以下内容:

- 采样因子4:2:0
   -strip
    - 质量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尺寸而不会有明显的损失。

答案 2 :(得分:16)

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

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

答案 3 :(得分:12)

我需要调整相机中的照片以进行开发:

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

命令:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
  • 结果filesize 753 kB
  • 第2048x2048号决议

我用1920x1080分辨率显示器无法看到全屏变化。 2048分辨率最适合以360 dpi的最高质量拍摄10厘米的照片。我不想剥夺它。

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

答案 4 :(得分:9)

我会添加一个有用的旁注和一般建议,以尽量减少JPG和PNG。

首先, ImageMagick 读取(或更好的"猜测" ...)输入jpeg压缩级别,所以如果你没有&#39 ; t添加-quality NN,输出应使用与输入相同的级别。有时候可能是一个重要的特征。否则,默认级别为-quality 92(请参阅www.imagemagick.org

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

答案 5 :(得分:7)

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

我不确定这种转换是否会破坏我的形象,但老实说,我认为我的转换看起来不像废话。这是一个广角全景,我不关心细致的阻碍。

答案 6 :(得分:4)

  

@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} 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

除了因输入降低质量值而导致的任何损失外,您还会通过解压缩和重新压缩来降低质量。

答案 7 :(得分:3)

有些人在这里试验自己和男孩做了Gausian模糊做了一个很好的不同。我使用的最后一个命令是:

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

没有Gausian模糊0.05,它大约是261kb,对于我正在测试的图像,它大约是171KB。具有大型复杂图像的1440p显示器的视觉差异在您缩放方式之前不明显。

答案 8 :(得分:3)

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

答案 9 :(得分:1)

一个非常古老但很有帮助的答案。

我要说的是,对于严肃的大型摄影,-gaussian-blur 是不可接受的,而不是压缩率。

在下面比较,带有 -gaussian-blur 0.05 的 %95 与没有模糊的 %85。原始 17.5MB(8MP 有很多失败),%95 不模糊 5MB,%85 不模糊 3036KB,%95 模糊 3365KB。

Comparing between blurring and compress ratio

也许像 0.02 这样的低模糊效果会更好。

答案 10 :(得分:0)

如果图像尺寸大,如果不调整大小就很难获得好的结果,下面是60%的调整大小,在大多数情况下不会破坏太多图像。

我将其用于灰度图像(从PNG转换)效果很好:

[
{
EventStartDate: "2019-12-03T00:00:00",
IsFeatured: false,
EventCategories: [
"Exhibition"
],
Location: "{"values":{"en-GB":"Paris, France"},"dtdGuid":"1355073c-2e61-439a-a8a7-2f3c1263d6a2"}",
SyncId: "17119-PGPI"
}
]

我将其用于扫描的黑白页面,使它们成为灰度图像(多余的参数清除了前一页的阴影):

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