2017-04-09 96 views
2

我想将带有alpha通道的.avi转换为.gif文件。
首先,我用如何修复与Graphicsmagick收集损坏的alpha通道(卡住像素).gif?

ffmpeg -i source.avi -vf scale=720:-1:flags=lanczos,fps=10 frames/ffout%03d.png 

为.avi转换为巴纽的序列与APLHA通道。
然后,我用

gm convert -loop 0 frames/ffout*.png output.gif 

收集一个.gif。
但是,在透明区域顶部呈现不透明的东西时,output.gif的像素似乎只会卡住。

下面是一个例子:

img

正如你所看到的心灵和爆炸没有得到derendered。

P.S. FFMPEG输出(在.png上收集)很好。

+0

如何共享AVI文件? –

+0

@MarkSetchell [你在这里。](https://www.dropbox.com/s/wmvno7jaw8uijar/vid.avi?dl=0) –

+1

我添加了我的解决方案作为答案。顺便说一句,希望你知道** GIF **没有一个alpha通道只是单一的透明颜色,但这与你的问题无关。 – Spektre

回答

2

我不使用GraphicsMagick工具,但你的GIF具有图像处置模式0(不包括动画)。您应该使用处理模式2(清除背景)或3(恢复以前的图像)都适用于您的GIF。这个处置是以Packed的值在每帧的gfx扩展中出现的。

所以,如果你可以尝试配置编码器使用disposal = 23或写脚本,直接流复制您的GIF和框架改变GFX延伸块帧的Packed值。与此相似:

如果您需要脚本帮助,然后看看:

当我试图这(C++脚本)上使用的处置2GIF我得到了这样的结果:

disposal=2

处置前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的其他位,因为没有人知道可以在那里编码的内容......

+2

优秀的侦探!用** GraphicsMagick **实现这个(我已经测试过并且工作正常)的简单方法是使用OP的原始脚本,像这样修改:'gm convert -loop 0 -dispose 2 frames/*。png output.gif' –

+2

@MarkSetchell很容易发现,因为我自己的C++编码器/解码器会抛出像处置这样的信息,每帧清除代码的数量以及更多用于调试的目的......我只需单击该文件并查看一个外观上的错误: ) – Spektre

+0

非常感谢!这正是我想要的。 我不能够感谢你! –