我想将带有alpha通道的.avi转换为.gif。
首先,我使用
ffmpeg -i source.avi -vf scale=720:-1:flags=lanczos,fps=10 frames/ffout%03d.png
将.avi转换为带有aplha频道的.png序列 然后,我用
gm convert -loop 0 frames/ffout*.png output.gif
收集.gif。
但似乎在透明区域顶部呈现不透明的东西时,output.gif的像素会卡住。
以下是一个例子:
正如你所看到的,心灵和爆炸都没有被放弃。
P.S。 FFMPEG输出(.png' s上的集合)很好。
答案 0 :(得分:2)
我不使用Graphicsmagick,但 GIF 的图片处理模式 0
(无动画)。您应该使用处理模式 2
(背景清除)或3
(恢复上一张图片)同时适用于 GIF 。处置存在于Packed
值中每帧的gfx扩展中。
因此,如果您可以尝试配置编码器以使用disposal = 2
或3
或编写直接流式复制 GIF 的脚本并更改Packed
的值gfx扩展块逐帧。与此类似:
如果您需要有关脚本的帮助,请查看:
当我使用处置2
在 GIF 上尝试此操作( C ++ 脚本)时,我得到了以下结果:
处理在 C ++ 中更改为:
struct __gfxext
{
BYTE Introducer; /* Extension Introducer (always 21h) */
BYTE Label; /* Graphic Control Label (always F9h) */
BYTE BlockSize; /* Size of remaining fields (always 04h) */
BYTE Packed; /* Method of graphics disposal to use */
WORD DelayTime; /* Hundredths of seconds to wait */
BYTE ColorIndex; /* Transparent Color Index */
BYTE Terminator; /* Block Terminator (always 0) */
__gfxext(){}; __gfxext(__gfxext& a){ *this=a; }; ~__gfxext(){}; __gfxext* operator = (const __gfxext *a) { *this=*a; return this; }; /*__gfxext* operator = (const __gfxext &a) { ...copy... return this; };*/
};
__gfxext p;
p.Packed&=255-(7<<2); // clear old disposal and leave the rest as is
p.Packed|= 2<<2; // set new disposal=2 (the first 2 is disposal , the <<2 just shifts it to the correct position in Packed)
最好留下Packed
的其他位,因为没有人知道那里可以及时编码的内容......