Answers:
首轮:
convert do.gif -coalesce temporary.gif
然后
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
gifsicle --resize 24x24 > do-24.gif
也可以做到这一点
-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中进行了测试。
-coalesce
“在每个点上创建动画的完整视图,有点像真实的电影胶片,而不是动画序列。这种序列被称为合并动画,它更容易研究,编辑,修改和重新优化。”