我想用 ImageMagick 压缩 JPG 图像文件,但大小差别不大。默认情况下,输出大小大于输入。我不知道为什么,但是在添加了一些 +profile 选项并设置了质量之后,我可以获得更小的尺寸,但仍然与原始尺寸相似。
输入图像为 255kb,处理后的图像为 264kb(使用 +profile 删除配置文件并将质量设置为 70%)。有没有办法将该图像压缩到至少 150kb?那可能吗?我可以使用哪些 ImageMagick 选项?
我总是使用:
质量 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
From @Fordi in the comments(如果您喜欢,别忘了给他点赞):如果您不喜欢模糊,请改用 -sampling-factor 4:2:0
。这样做的目的是将色度通道的分辨率降低到一半,而不会影响您眼睛锁定的亮度分辨率。如果您想要更好的转换保真度,您可以通过指定 -define jpeg:dct-method=float
在不增加文件大小的情况下获得轻微的改进 - 也就是说,使用更准确的浮点离散余弦变换,而不是默认的快速整数版本。
我正在使用 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
只是对那些在 PHP 中使用 Imagick 类的人说:
$im -> gaussianBlurImage(0.8, 10); //blur
$im -> setImageCompressionQuality(85); //set compress quality to 85
一旦我需要从相机调整照片的大小以进行开发:
原始文件大小: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%,但质量更好(缩放时)。
我会添加一个有用的旁注和一个一般性建议,以尽量减少 JPG 和 PNG。
首先,ImageMagick 读取(或更好的 "guess"...)输入 jpeg 压缩级别,因此如果您根本不添加 -quality NN
,则输出应使用与输入相同的电平。有时可能是一个重要特征。否则,默认级别为 -quality 92
(请参阅 www.imagemagick.org)
该建议是关于一个非常棒的免费工具 ImageOptim,也适用于批处理。
您可以获得更小的 jpg(以及 png,尤其是在使用免费 ImageAlpha [非批处理] 或免费Pngyu,如果您需要批处理)。
这些工具不仅适用于 Mac 和 Win,还可以作为命令行(我建议使用 Brew 安装,然后在 Brew 公式中搜索)。
我将 -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
我不确定这种转换是否会过多地破坏我的形象,但老实说,我并不认为我的转换看起来像垃圾。这是一个广角全景,我不在乎一丝不苟的阻碍。
@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
除了由于输入的质量值降低而导致的任何损失之外,您还将通过解压缩和重新压缩而损失一些质量。
以下是在 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
如果没有 0.05 的高斯模糊,它大约是 261kb,而我正在测试的图像大约是 171KB。除非您将其放大,否则在具有大型复杂图像的 1440p 显示器上的视觉差异并不明显。
一个非常古老但很有帮助的答案。
不得不说,对于严肃的大型摄影,-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 这样的较低模糊效果会更好。
如果图像尺寸很大,如果不调整大小很难获得好的结果,下面是 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
mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg
。确保在运行该命令之前有备份。它会写在原地。-strip
为我做的。谢谢mogrify -strip -quality 75% *.jpg
。脱衣舞很棒。 0质量损失,并节省大量空间。 75% 的质量与 100% 几乎没有区别,但占用了一半的空间。