![如何使用 ImageMagick 调整动画 GIF 文件的大小?](https://linux22.com/image/1040798/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20ImageMagick%20%E8%B0%83%E6%95%B4%E5%8A%A8%E7%94%BB%20GIF%20%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%A7%E5%B0%8F%EF%BC%9F.png)
我想调整此类动画 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