繁体   English   中英

Imagesharp-用动画gif填充的静止图像

[英]Imagesharp - Still image to fill with an animated gif

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

一切都很好,并且可以识别gif图像的帧。 然而,随着帧的进行,这些帧似乎相互重叠,而不是参考静止图像的初始帧的各个帧。

我可能忽略了代码中的一个明显错误,但是如何防止每个帧彼此重叠并让每个帧都复制静止图像的干净副本,并用gif动画图像的每个帧填充空白?

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

圆-静止图像

雷霆-动画图像

雷电与圆环相结合的结果

码:

    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;
        }
    }

找到了解决问题的办法。 我需要克隆源图像(圆圈),并在gif的每一帧之后将其丢弃。 我可以通过using语句来实现这一点,这是确保诸如imageFrame之类的对象正确配置的便捷方法。 实施此解决方案后,框架不再重叠在一起。

        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);
            foreach (var Frame in texture.Frames)
            {
                using (var imageFrame = img.Frames.CloneFrame(0))
                {
                    Image<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.Frames.First());
                }
            }
            GifEncoder GifEncode = new GifEncoder();
            animated.SaveAsGif(ms);
            return ms;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM