我想手动修改动画 gif。因此,我尝试将其转换为单个(可编辑)帧,然后绘制修改内容,然后重新组装这些帧。
首先,我将 31 秒长的 mp4 转换为动画 gif:
ffmpeg -i Daisies.mp4 -r 15 -vf scale=512:-1 -ss 00:00:03 -to 00:00:06 DaisiesOK.gif
这个动图还可以。
然后我将此动画 gif 转换为单独的帧:
convert DaisiesOK.gif Daisies.png
第一帧看起来还好,除了它是 256 种颜色,但接下来的帧非常苍白,充满了透明像素。
这些帧转换为动画 gif:
convert -delay 20 -loop 0 *.png Daisies.gif
给出了非常丑陋的视频,雏菊有白色的“阴影”,它们开始的地方(它们摇摆)留下了白色雏菊边缘的印记。
如果我尝试使用 jpeg 而不是 png,情况会更糟,大部分视频都只是黑色。
我如何提取保留所有颜色信息的帧?问题出在 imagemagick 还是 ffmpeg?
您可能已经意识到这一点,但 gif 是一种基于调色板的图像格式,调色板条目只有 8 位,即最多 256 种不同的颜色。并且生成 gif 的方式不是“巧妙地”使用输入视频中最流行的颜色,而是使用固定的默认调色板。
这就是 gif 动画的工作原理。您提取的帧包含所有颜色信息。如果没有前一帧,它们就毫无用处。因此,问题不在于任何程序,而在于您要求它们执行的操作:生成动画 gif,它是一系列帧,其中包含透明像素,其中一帧与前一帧相同,而有变化的像素则包含彩色像素。
确保您确实想要动画 gif。如今,浏览器播放 MP4 比播放 gif消耗更少的CPU 能力,而且它们在任何情况下看起来都更好。您还可以尝试动画 PNG。
ffmpeg 也可以用来从 gif 中提取帧;
convert
不需要绕道:这里的问题是,为什么不直接将输入转换
Daisies.mp4
为 8 位色彩空间,在转换过程中生成最佳调色板(使用palettegen
视频滤镜),然后将帧直接转储到 PNG 中。绕道使用 GIF 似乎适得其反。你错过了
-coalesce
旗帜但还请注意,ImageMagick 确实喜欢将整个处理过的图像以原始格式加载到 RAM 中。您需要足够的内存来实现这一点。