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


46

我想调整动画GIF文件的大小do.gif 在此处输入图片说明

如果可以,convert do.gif -resize 24x24\! do-24.gif我会在do-24.gif中将其调整大小,但不设置动画在此处输入图片说明

如何正确调整尺寸以获得相同的动画?

Answers:


56

首轮:

convert do.gif -coalesce temporary.gif

然后

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

2
-coalesce“在每个点上创建动画的完整视图,有点像真实的电影胶片,而不是动画序列。这种序列被称为合并动画,它更容易研究,编辑,修改和重新优化。”
2013年

28
gifsicle --resize 24x24 > do-24.gif也可以做到这一点
SAM

2
请注意,合并的视图比优化的视图大得多(在我的测试中为3.2倍),并且调整大小会生成合并的图像,即使分辨率较高,该图像的大小也可以比原始文件大(在我的测试中为2.3倍)。较小。当我尝试直接调整大小时,它看起来不错并且文件大小较小,尽管也许仅适用于此图像。
endlith 2014年

1
对于我的用例,gifsicle产生了更好,优化的输出。谢谢@sam!
sj26 '16

4
在不指定输入大小的情况下,对我有效。
AMB

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

out.gif

在此处输入图片说明

out-coalesce.gif

在此处输入图片说明

out-deconstruct.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.9 MiB。

    不会比d小很多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?

待办事项:为什么要缩小尺寸convert?他们只是选择更好的最小化差异矩形,还是其他?

在Ubuntu 18.10,ffpmeg 4.0.2-2,ImageMagick 6.9.10-8中进行了测试。


3

我一直在寻找熟悉的imagemagick解决方案,但最后我还是接受@sam的建议gifsicle。它确实满足了我的要求,没有麻烦。

可以通过多种方式优化生成的文件大小,但是我只是减小了大小并减少了颜色数量。像魅力一样工作:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.