NGif动画师背景问题

时间:2011-11-01 16:06:53

标签: c# animated-gif ngif

我一直在玩NGif Animator来调整GIF动画的大小,它确实调整大小,但是我试过的许多动画GIF中的部分被删除了。我查看了该页面上的评论,但没有看到其他人提及它。

为了消除调整大小的原因,我只需循环遍历框架并保存每个框架。每个帧都是一个System.Drawing.Image。透明度设置为无(Color.Empty)。

这是我目前的测试方法:

        GifDecoder gifDecoder = new GifDecoder();
        MemoryStream memoryStream = new MemoryStream();
        new BinaryWriter((Stream)memoryStream).Write(imageToResize); // byte array
        memoryStream.Position = 0L;

        gifDecoder.Read((Stream)memoryStream);
        memoryStream.Dispose();

        string filename = Guid.NewGuid().ToString().Replace("-", String.Empty) + ".gif";
        string output = path + @"\" + filename;

        AnimatedGifEncoder animatedGifEncoder = new AnimatedGifEncoder();
        animatedGifEncoder.Start(output);
        animatedGifEncoder.SetRepeat(gifDecoder.GetLoopCount());
        animatedGifEncoder.SetQuality(10); // They say 20 is max quality will get, I've tried higher.  Makes it a little bit better but black areas instead of gray. 10 is their default.
        animatedGifEncoder.SetTransparent(Color.Empty); // This is default either way

        int frameCount = gifDecoder.GetFrameCount();
        int num = 0;

        Image frame;
        Image image = null;

        for (int index = frameCount; num < index; ++num)
        {
            frame = gifDecoder.GetFrame(num);
            animatedGifEncoder.SetDelay(gifDecoder.GetDelay(num));

            string fname = @"C:\Development\images\frame_" + num.ToString() + ".gif";
            if (File.Exists(fname)) { File.Delete(fname); }
            frame.Save(fname);

            animatedGifEncoder.AddFrame(image);
        }

        animatedGifEncoder.Finish();

以下是正在发生的事情的一个例子:

Background is gone

背景消失了,它是灰色的。

它应该看起来像:

Good background

任何人都有使用NGif的经验并知道会导致这种情况的原因是什么?第一帧总是很好。之后的其他人有问题所以我猜测某些东西没有被逐帧重置(或重新读取)。我一直在为他们的重置帧方法添加更多东西,但到目前为止它没有帮助。现在看起来像:

    protected void ResetFrame() 
    {
        lastDispose = dispose;
        lastRect = new Rectangle(ix, iy, iw, ih);
        lastImage = image;
        lastBgColor = bgColor;

        delay = 0;
        transparency = false; // I don't want transparency
        lct = null;
        act = null;
        transIndex = -1;
    }

1 个答案:

答案 0 :(得分:0)

他们的代码中确实存在一个错误,一个字节数组没有被重置。查看其页面上的评论以获取解决方案