我想使用ImageMagick压缩一张JPG图片,但是大小并没有明显变化。默认情况下输出的尺寸比输入的还要大。我不知道为什么,在添加一些+profile选项和调低质量后,虽然大小减小了,但仍与原始图片相似。
输入的图片大小为255kb,处理后的图片大小为264kb(使用+profile删除配置文件和将质量设置为70%)。是否有办法将该图片至少压缩到150kb?这是否可能?我可以使用哪些ImageMagick选项?
我想使用ImageMagick压缩一张JPG图片,但是大小并没有明显变化。默认情况下输出的尺寸比输入的还要大。我不知道为什么,在添加一些+profile选项和调低质量后,虽然大小减小了,但仍与原始图片相似。
输入的图片大小为255kb,处理后的图片大小为264kb(使用+profile删除配置文件和将质量设置为70%)。是否有办法将该图片至少压缩到150kb?这是否可能?我可以使用哪些ImageMagick选项?
我总是使用:
在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
来稍微提高而不增加文件大小——即使用更精准的浮点离散余弦变换,而不是默认的快速整数版本。
mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg
。在运行该命令之前确保已备份文件。该命令会直接写入原文件。 - Richard Ayotte我正在使用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%。
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对于那些在PHP中使用Imagick类的人,只是想说:
$im -> gaussianBlurImage(0.8, 10); //blur
$im -> setImageCompressionQuality(85); //set compress quality to 85
有一次我需要为冲洗照片而从相机中调整照片大小:
命令:
mogrify -quality "97%" -resize 2048x2048 -filter Lanczos -interlace Plane -gaussian-blur 0.05
我的1920x1080分辨率显示器全屏看不到任何变化。 2048分辨率是以最高的 360 dpi 开发10厘米照片的最佳分辨率。我不想削减它。
编辑:我注意到甚至在没有模糊的情况下,效果更好。 没有模糊时文件大小仅为原始文件大小的50%,但质量更好(放大时)。
@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
当您解压缩和重新压缩时,除了由于将输入的“质量值”降低而导致的任何损失外,还会损失一些质量。
我在建议的命令中添加了-adaptive-resize 60%
,但使用了-quality 60%
。
convert -strip -interlace Plane -gaussian-blur 0.05 -quality 60% -adaptive-resize 60% img_original.jpg img_resize.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);
}
}
我在这里进行了一些实验,哇,高斯模糊确实让图像变得不同。我使用的最终命令是:
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且为复杂大型图片的显示器上,除非你放大查看,否则视觉差异并不明显。