簡體   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