如何将.gif文件拆分为帧?

6
我找到的所有代码都给我相同的结果:一堆看起来完全相同的帧。这意味着:它会给我一个第一帧的列表,重复X次。我使用的.gif有30个帧,所以我得到了30次第一帧,而不是30个不同的帧。
    public static Image[] GetFramesFromAnimatedGIF(Image IMG)
    {
        List<Image> IMGs = new List<Image>();
        int Length = IMG.GetFrameCount(FrameDimension.Time);

        for (int i = 0; i < Length; i++)
        {
            IMG.SelectActiveFrame(FrameDimension.Time, i);
            IMGs.Add(IMG);
        }

        return IMGs.ToArray();
    }

我错过了什么?我查看的所有代码都会重复X次第一帧。
这是应该显示的样子(使用网页)。看到每个帧是不同的吗?

enter image description here

这是我在将每个帧保存到文件夹位置的数组中之后看到的样子(一堆相同的帧):

enter image description here

附言:是的,我使用的图片是 .gif 格式。

更新:问题似乎出现在我使用 OpenFileDialog 读取文件时,如果我通过代码传递我的 .gif 文件,则可以正常工作。那么如何在 OpenFileDialog 中读取动画 gif?谢谢。


这可能会有帮助:http://stackoverflow.com/questions/951786/wpf-how-to-extract-frames-from-multiframe-images-tif-gif?rq=1 - Zhr Saghaie
@aisa 谢谢你,但现在问题解决了,我通过代码传递我的 .gif 文件就可以了。所以问题出在 OpenFileDialog 上,它把我的动画 .gif 当作简单的 .gif 读取。 - soulblazer
你尝试过在WPF中使用GifBitmapEncoder吗? - dbc
+dbc很遗憾,这不需要使用WPF。它是为旧PC设计的。 - soulblazer
从代码来看,你应该会得到30次last帧,因为你有一个重复了30次的相同对象列表(最后一次调用是MG.SelectActiveFrame(FrameDimension.Time, 30);)。你应该以某种方式保存“当前帧”(我不知道如何做到这一点——只是你的代码看起来不完整)。 - Alexei Levenkov
+Alexei Levenkov,谢谢你的帮助。我被告知将IMGs.Add(IMG)更改为IMGs.Add(new Bitmap(IMG)) - soulblazer
1个回答

9
   IMGs.Add(IMG);

这是个bug,你一遍又一遍地添加相同的IMG对象。你需要对帧进行深度复制,这很容易做到:

   IMGs.Add(new Bitmap(IMG));

所有这些副本以后都需要被处理掉。 - dbc
所以那就是问题所在。谢谢。 - soulblazer
不错。现在我只好想知道为什么.NET框架要假装它们是无调色板的32位RGBA而不是8位调色板的。 - Nyerguds
当然,使用Bitmap构造函数将为您获取与显示器设置匹配的像素格式。旨在达到最佳效果。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接