如何使用 ImageMagick 调整动画 GIF 文件的大小?

如何使用 ImageMagick 调整动画 GIF 文件的大小?

我想调整此类动画 GIF 文件的大小做.gif 在此处输入图片描述

如果我这样做,convert do.gif -resize 24x24\! do-24.gif我会调整它的大小do-24.gif但不是动画在此处输入图片描述

如何以正确的方式调整其大小以获得相同的动画?

答案1

第一次运行:

convert do.gif -coalesce temporary.gif

然后

convert -size <original size> temporary.gif -resize 24x24 smaller.gif

答案2

我一直在寻找 imagemagick 解决方案,因为我对它很熟悉,但最后我还是采纳了 @sam 的建议gifsicle。它完全满足了我的要求,没有任何麻烦。

可以通过多种方式优化生成的文件大小,但我只选择了减小大小和减少颜色数量。效果非常好:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif

答案3

-coalesce+-deconstruct

之后-coalesce,您可能想要添加-deconstruct

convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif

问题的根本原因是您输入的 GIF 已被正确最小化:GIF 允许下一帧仅仅是前一帧偏移后的修改后的矩形。

-coalesce然后将所有帧扩展为原始大小,这使得调整大小有效,但它不会再次重新压缩帧,因为您的输入图像-deconstruct是必需的!

使用此答案的测试数据:如何从静止图像创建动画 gif(最好使用命令行)?我们可以清楚地看到这一点identify

$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019

$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010

出.gif

在此处输入图片描述

出-合并.gif

在此处输入图片描述

解构.gif

在此处输入图片描述

首先,我们看到输入文件out-convert.gif实际上是被压缩了,因为第 2 帧仅516x516在偏移量处252+257,而第 1 帧的全尺寸是1024x1024

然后,如果我们比较这三次转换:

  • out.gif:所有帧都256x256大于或等于 5MiB,TODO 为什么?

    视觉上不正确,因为那些近似256x256帧具有非零偏移,例如125+128第 2 帧!

  • out-coalesce.gif:所有帧都256x256具有正确的偏移0+0

    输出看起来正确,但输出文件大小为 2.0 MiB,大于out-deconstruct.gif

  • out-deconstruct.gif:压缩帧,最终输出大小1.9MiB。

    并不比小很多out-coalesce.gif,但我认为这只是因为黑色地面压缩得很好,而且总体来说可能非常显著。

ffmpeg 和 gifsicle

我还尝试了以下命令:

ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif

并且两者都产生了看起来更小的 1.5 MiB 输出。

也可以看看:如何从静止图像创建动画 gif(最好使用命令行)?

TODO:为什么他们可以把它做得比 更小convert?他们只是选择了更好、更小的差异矩形,还是其他什么?

在 Ubuntu 18.10、ffpmeg 4.0.2-2、ImageMagick 6.9.10-8 中测试。

答案4

wget https://upload.wikimedia.org/wikipedia/commons/f/f9/STS-132_Liftoff_Space_Shuttle_Atlantis.ogv
ffmpeg -i STS-132_Liftoff_Space_Shuttle_Atlantis.ogv -r 15 -vf scale=512:-1 \
 -ss 00:00:17 -to 00:00:22 STS-132_Liftoff_Space_Shuttle_Atlantis.gif

相关内容