如何使用Graphicsmagick收集损坏的alpha通道(卡住像素)修复.gif文件?

时间:2017-04-09 20:17:58

标签: graphics ffmpeg gif encode graphicsmagick

我想将带有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的像素会卡住。

以下是一个例子:

img

正如你所看到的,心灵和爆炸都没有被放弃。

P.S。 FFMPEG输出(.png' s上的集合)很好。

1 个答案:

答案 0 :(得分:2)

我不使用Graphicsmagick,但 GIF 的图片处理模式 0(无动画)。您应该使用处理模式 2(背景清除)或3(恢复上一张图片)同时适用于 GIF 。处置存在于Packed值中每帧的gfx扩展中。

因此,如果您可以尝试配置编码器以使用disposal = 23或编写直接流式复制 GIF 的脚本并更改Packed的值gfx扩展块逐帧。与此类似:

如果您需要有关脚本的帮助,请查看:

当我使用处置2 GIF 上尝试此操作( C ++ 脚本)时,我得到了以下结果:

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