ChatGPT解决这个技术问题 Extra ChatGPT

使用 ImageMagick 压缩 JPG 文件的建议

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

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

重新压缩 JPEG 总是会导致图像质量下降,即使它更大。如果您可以在第一次保存之前从原件开始,那就更好了。
我知道,但不幸的是我没有原始图像,我只有一个大的 jpg 文件,但我认为我可以在质量和大小之间取得很好的平衡

F
Felipe Buccioni

我总是使用:

质量 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

Source

From @Fordi in the comments(如果您喜欢,别忘了给他点赞):如果您不喜欢模糊,请改用 -sampling-factor 4:2:0。这样做的目的是将色度通道的分辨率降低到一半,而不会影响您眼睛锁定的亮度分辨率。如果您想要更好的转换保真度,您可以通过指定 -define jpeg:dct-method=float 在不增加文件大小的情况下获得轻微的改进 - 也就是说,使用更准确的浮点离散余弦变换,而不是默认的快速整数版本。


谢谢!这段代码让我得到了 170kb 的图像,现在我可以去试验你的代码了,谢谢,我还发现了 -define:extent=MAX_SIZE_IN_KB 选项真的很有帮助,谢谢!
如果您要处理一堆文件,也可以执行 mogrify -strip -interlace Plane -gaussian-blur 0.05 -quality 85% *.jpg。确保在运行该命令之前有备份。它会写在原地。
-strip 为我做的。谢谢
我得到了非常模糊的图像。故意模糊图像以节省空间似乎适得其反。只使用较低质量的百分比不是更有意义吗?质量更改过程非常适合节省空间,同时保持明显的图像质量。我在图像上添加了 0.05 高斯模糊,它节省了一些空间,但看起来完全是废话。我决定使用 mogrify -strip -quality 75% *.jpg。脱衣舞很棒。 0质量损失,并节省大量空间。 75% 的质量与 100% 几乎没有区别,但占用了一半的空间。
如果您不喜欢模糊,请改用 -sampling-factor 4:2:0。这样做的目的是将色度通道的分辨率降低到一半,而不会影响您眼睛锁定的亮度分辨率。如果您想在转换中获得更好的保真度,您可以通过指定 -define jpeg:dct-method=float 来获得轻微的改进而不增加文件大小 - 也就是说,使用更准确的浮点离散余弦变换,而不是默认的快速整数版本。
r
rogerdpack

我正在使用 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%,而没有太多可见的损失。


sRGB 是谷歌推荐的……为什么要写 RGB?有具体原因吗?
@collimarco 我发现使用线性空间空间(RGB)的原因is only temporarily, to resize
扩展@irina 描述的完美命令,因为当您需要从完整目录创建目标目录时,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

t
tuipveus

一旦我需要从相机调整照片的大小以进行开发:

原始文件大小: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
如上所述 - 降低图像分辨率以使文件更小是没有用的。而是降低JPEG质量!您可以自己进行测试 - 比较两张图像,一张是 97% JPEG,另一张转换为 68%,即使您查看 100% 缩放,您也很难看到任何不同的像素!库存相机和手机的设置高得离谱,只是为了让您想为您的 PC 购买具有更大存储空间和更大 HDD 的新手机...photo.stackexchange.com/questions/30243/…
S
Steve

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

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

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


我将 pngquant 用于 Linux。它在 ImageAlpha 页面上被引用。感谢您的提示
g
gre_gor

我将 -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

我不确定这种转换是否会过多地破坏我的形象,但老实说,我并不认为我的转换看起来像垃圾。这是一个广角全景,我不在乎一丝不苟的阻碍。


f
fmw42

@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

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


e
emanuelbsilva

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

P
Pablo Bianchi

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

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 显示器上的视觉差异并不明显。


请注意,高斯模糊对小图像效果不佳,但对于大图像必须具备!
@AntoninGAVREL 可能是因为必须将模糊因子调整为图像的大小
b
butfly

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

不得不说,对于严肃的大型摄影,-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 这样的较低模糊效果会更好。


E
Eduard Florinescu

如果图像尺寸很大,如果不调整大小很难获得好的结果,下面是 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 

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅