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

zub*_*uba 48 imagemagick

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

如果我这样做,convert do.gif -resize 24x24\! do-24.gif我会在do-24.gif 中调整它的大小但没有动画在此处输入图片说明

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

phi*_*bim 60

第一次运行:

convert do.gif -coalesce temporary.gif
Run Code Online (Sandbox Code Playgroud)

然后

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
Run Code Online (Sandbox Code Playgroud)

  • `gifsicle --resize 24x24 &gt; do-24.gif` 也可以 (31认同)
  • 转换临时.gif -resize 24x24 small.gif 对我有用。,无需指定输入大小。 (6认同)
  • `-coalesce`“在每个点创建动画的完整视图,有点像真正的电影胶片,而不是动画序列。这样的序列,称为 [Coalesced Animation](http://www.imagemagick. org/Usage/anim_basics/#coalesced)更容易研究、编辑、修改和重新优化。” (2认同)
  • 请注意,合并后的视图比优化后的视图大得多(我测试中的 3.2 倍),并且调整大小会生成合并后的图像,即使分辨率降低,该图像的文件大小也可能大于原始文件大小(我测试中的 2.3 倍)较小。当我尝试直接调整大小时,它看起来不错并且文件很小,尽管它可能仅适用于该图像。 (2认同)

Pet*_*háč 10

我一直在寻找我熟悉的 imagemagick 解决方案,但最后我接受了@sam 的gifsicle. 它做了我想要的,没有麻烦。

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

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
Run Code Online (Sandbox Code Playgroud)


Cir*_*郝海东 6

-coalesce + -deconstruct

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

convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
Run Code Online (Sandbox Code Playgroud)

问题的根本原因是您的输入 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
Run Code Online (Sandbox Code Playgroud)

输出.gif

在此处输入图片说明

out-coalesce.gif

在此处输入图片说明

解构.gif

在此处输入图片说明

首先,我们看到如何输入文件,out-convert.gif,实际上是压缩的,因为第 2 帧仅516x516在 offset 处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。

    不比 小很多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
Run Code Online (Sandbox Code Playgroud)

并且两者都产生了更小正确的 1.5 MiB 输出。

另请参阅:如何从静止图像创建动画 gif(最好使用命令行)?

TODO:为什么他们可以使它小于convert?他们只是选择更好的最小差异矩形,还是其他什么?

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