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

如何修复使用GraphicsMagck收集的损坏alpha通道(卡住的像素)的.gif?,graphics,ffmpeg,gif,encode,graphicsmagick,Graphics,Ffmpeg,Gif,Encode,Graphicsmagick,我想将带有alpha通道的.avi转换为.gif。 首先,我使用 ffmpeg -i source.avi -vf scale=720:-1:flags=lanczos,fps=10 frames/ffout%03d.png 使用aplha通道将.avi转换为.png序列。 然后,我用 gm convert -loop 0 frames/ffout*.png output.gif 收集.gif文件。 但,似乎output.gif的像素只是在透明区域顶部渲染不透明的内容时被卡住了 这里有一个例

我想将带有alpha通道的.avi转换为.gif。
首先,我使用

ffmpeg -i source.avi -vf scale=720:-1:flags=lanczos,fps=10 frames/ffout%03d.png
使用aplha通道将.avi转换为.png序列。
然后,我用

gm convert -loop 0 frames/ffout*.png output.gif
收集.gif文件。
但,似乎output.gif的像素只是在透明区域顶部渲染不透明的内容时被卡住了

这里有一个例子:

正如你所看到的,心脏和爆炸并没有被忽视

附言。
FFMPEG输出(收集在.png上)很好。

我不使用Graphicsmagick,但您的GIF具有图像处理模式
0
(无动画)。您应该使用处理模式
2
(背景清除)或
3
(恢复以前的图像),这两种模式都适用于GIF。处置存在于
Packed
值中每个帧的gfx扩展中

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

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

当我使用Disposition
2在您的GIF上尝试此(C++脚本)时,我得到了以下结果:

处理在C++中更改如下:

struct\uuu gfxext
{
字节引入器;/*扩展引入器(始终为21h)*/
字节标签;/*图形控制标签(始终为F9h)*/
字节块大小;/*剩余字段的大小(始终为04h)*/
字节压缩;/*要使用的图形处理方法*/
字延迟时间;/*等待百分之一百秒*/
字节颜色索引;/*透明颜色索引*/
字节终止符;/*块终止符(始终为0)*/
__gfxext(){};\uuuugfxext(\uuuugfxext&a){*this=a;};~\uuuugfxext(){};\uuuugfxext*运算符=(const uuuu gfxext*a){*this=*a;返回this;}/*\uuuuugfxext*运算符=(const uuu gfxext&a){…复制…返回this;}*/
};
__gfxext-p;

p、 打包&=255-(7共享AVI文件如何?@MarkSetchell我添加了我的解决方案作为答案。顺便说一句,希望你知道GIF没有一个alpha通道,只是单一的透明颜色,但这与你的问题无关。出色的侦察!一个简单的实现方法(我已经测试过,它可以工作)使用GraphicsMagick是使用OP的原始脚本修改:这样的代码:GM转换-循环0 -处理2帧/*.pNG输出。GIF < /C> > MARSSECSECLE,很容易发现,因为我自己的C++编码器/解码器抛出信息,像处理,每个帧的清晰代码数量,更多的调试目的……我只需点击文件,看看什么是一看就错了:)非常感谢!这正是我想要的。我对你感激不尽@顺便说一句,这可能会引起你的兴趣,因为你正在构建GIF。。。