建议使用ImageMagick压缩JPG文件

Jav*_*rez 218 imagemagick image-processing

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

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

Fel*_*oni 409

我总是使用:

  • 85年的质量
  • 渐进式(压缩压缩)
  • 一个非常小的高斯模糊来优化尺寸(半径的0.05或0.5)取决于图片的质量和尺寸,这显着优化了jpeg的大小.
  • 删除任何评论或exif标记

在imagemagick应该是

convert -strip -interlace Plane -gaussian-blur 0.05 -quality 85% source.jpg result.jpg
Run Code Online (Sandbox Code Playgroud)

希望这很有用.

来源链接:http://www.yuiblog.com/blog/2008/12/05/imageopt-4/

来自@Fordi的评论(如果你愿意的话,别忘了竖起他的评论):如果你不喜欢模糊,请-sampling-factor 4:2:0改用.这样做可以将色度通道的分辨率降低一半,而不会影响眼睛锁定的亮度分辨率.如果你想在转换中获得更好的保真度,你可以通过指定-define jpeg:dct-method=float- 即使用更精确的浮点离散余弦变换而不是默认的快速整数版本来获得略微改进而不增加文件大小.

  • 如果您不喜欢模糊,请使用-sampling-factor 4:2:0代替.这样做可以将色度通道的分辨率降低一半,而不会影响眼睛锁定的亮度分辨率.如果你想在转换中获得更好的保真度,你可以通过指定-define jpeg:dct-method = float来获得略微改进而不增加文件大小 - 也就是说,使用更准确的浮点离散余弦变换,而不是默认的快速整数版本. (72认同)
  • 我的图像非常模糊.故意模糊图像以节省空间似乎适得其反.仅仅使用较低质量的%不是更有意义吗?质量改变过程非常适合节省空间,同时保持明显的图像质量.我在我的图像上放了一个0.05高斯模糊,它节省了一些空间,但看起来像完全废话.我决定使用`mogrify -strip -quality 75%*.jpg`.地带很棒.0质量损失,节省大量空间.75%的质量几乎与100%不同,但占用的空间只有一半. (37认同)
  • 如果你正在做一堆文件,你也可以做`mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85%*.jpg`.在运行该命令之前,请确保您有备份.它会写到位. (31认同)
  • `-strip`为我做了.谢谢 (3认同)
  • 谢谢!这段代码让我的图像达到了170kb,现在我可以去试验你的代码谢​​谢了,我也找到了-define:extent = MAX_SIZE_IN_KB这个选项真有帮助,谢谢! (2认同)
  • @Fordi:我只使用质量75%而不使用高斯模糊或-sampling-factor或jpeg:dct-method = float来获得更小尺寸且更好的图像.也许我们应该停止尝试超越计划? (2认同)
  • 不要模糊图像.那是愚蠢的.使用质量设置来减小尺寸.它旨在最佳地减小尺寸,同时保持视觉相似性.我个人使用`-quality 40`并且它大大减小了图像的大小而没有任何明显的伪像.(当然取决于图片类型) (2认同)
  • 如果预计图像不会从低速互联网连接加载,那么提供“-interlace Plane”选项即使不错,也是完全没有必要的。对于从硬盘渲染图像,隔行扫描图像比非隔行扫描图像花费的时间长 2-3 倍。而且没有大小差异。 (2认同)
  • @FelipeAlcacibar 我发现的所有“优点”都围绕着网络浏览器。但如果我只想在本地查看怎么办?那么对我来说,这只是计算开销……绝对没有质量差异。 (2认同)

小智 51

我正在使用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
Run Code Online (Sandbox Code Playgroud)

使用这些选项,我可以节省高达40%的JPEG尺寸而不会有明显的损失.

  • sRGB是Google推荐的...为什么写RGB?有具体原因吗? (4认同)
  • 这是扩展 @irina 描述的完美命令,因为当您需要从完整目录创建目标目录时,“mogrify”不会创建目标目录。`SOURCE=./*.jpg DESTINE=$(mkdir -p ./resize; echo $_); mogrify -monitor -采样因子 4:2:0 -strip -interlace JPEG -colorspace sRGB -path $DESTINE -resize 1000 -compress JPEG -quality 80 $SOURCE` (3认同)

小智 16

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

$im -> gaussianBlurImage(0.8, 10);      //blur
$im -> setImageCompressionQuality(85);  //set compress quality to 85
Run Code Online (Sandbox Code Playgroud)


tui*_*eus 12

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

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

命令:

mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05 
Run Code Online (Sandbox Code Playgroud)
  • 结果filesize 753 kB
  • 第2048x2048号决议

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

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


小智 9

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

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

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


小智 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
Run Code Online (Sandbox Code Playgroud)

这些是我的结果

  • img_original.jpg = 13,913KB
  • img_resized.jpg = 845KB

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


fmw*_*w42 7

@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
Run Code Online (Sandbox Code Playgroud)

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


ema*_*lva 7

对于在 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);
  }
}
Run Code Online (Sandbox Code Playgroud)


Iro*_*ios 6

在这里自己做了一些实验,男孩确实让高斯模糊产生了很大的不同。我使用的最终命令是:

mogrify * -sampling-factor 4:2:0 -strip -quality 88 -interlace Plane -define jpeg:dct-method=float -colorspace RGB -gaussian-blur 0.05 
Run Code Online (Sandbox Code Playgroud)

如果没有 0.05 的高斯模糊,它大约为 261kb,对于我正在测试的图像,它大约为 171KB。在放大复杂图像之前,1440p 显示器上的视觉差异是不明显的。


小智 5

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

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

下面进行比较,%95 与-gaussian-blur 0.05%85 没有模糊。原始 17.5MB(8MP,有很多缺陷),%95 无模糊 5MB,%85 无模糊 3036KB,%95 有模糊 3365KB。

模糊和压缩比之间的比较

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