Imagesharp - 静止图像以填充GIF动画

时间:2017-12-13 18:01:32

标签: c# asp.net imagesharp

我一直在尝试使用ImageSharp并希望做一些更聪明的事情。我有一个带有透明背景的静止图像,以及一个大于或等于静止图像的动画gif图像。下面的代码是我创建的接口的一部分,它调用方法ProcessImage并作为内存流返回,以便稍后作为任何类型的图像输出。

一切都很好,并且它识别了gif图像的帧。然而,框架似乎在相互进行时相互拍打,而不是引用静止图像的初始帧的单个帧。

我可能会在我的代码中忽略一个明显的错误,但是如何防止每个帧相互叠加并让每个帧都获取静止图像的清晰平板的副本并用每个帧填充空白动画gif图像?

以下是参考资料。我确实必须减小gif的大小,因为上传限制为2mb

Circle - Still Image

Thunder - Animated Image

The Result of the Thunder and Circle Combined

代码:

    public MemoryStream ProcessImage()
    {
        MemoryStream ms = new MemoryStream();
        const int min = 128; // Grey midpoint
        using (var img = Image.Load(ImagePath))
        using (var texture = Image.Load(Texture))
        {
            if (img.Width > texture.Width || img.Height > texture.Height)
            {
                throw new InvalidOperationException("Image dimensions must be less than or equal to texture dimensions!");
            }

            Image<Rgba32> animated = new Image<Rgba32>(img.Width, img.Height);
            ImageFrame<Rgba32> imageFrame = img.Frames[0];
            foreach (var Frame in texture.Frames)
            {
                ImageFrame<Rgba32> currentFrame = imageFrame;
                for (int y = 0; y < currentFrame.Height; y++)
                {
                    for (int x = 0; x < currentFrame.Width; x++)
                    {
                        var pixel = currentFrame[x, y];
                        if (pixel.R >= min && pixel.G >= min && pixel.B >= min && pixel.A >= min)
                        {
                            currentFrame[x, y] = Frame[x, y];
                        }
                    }
                }
                animated.Frames.AddFrame(currentFrame);
            }
            animated.SaveAsGif(ms);
            return ms;
        }
    }

1 个答案:

答案 0 :(得分:1)

找到问题的解决方案。我需要克隆源图像(圆圈)并在gif的每一帧之后处理它。我可以通过 using 语句来实现这一点,这是一种方便的方法来确保像imageFrame这样的对象正确处理。实施此解决方案后,框架不再搭在一起。

setExact()