運行幾幀後位圖動畫停止工作 (Bitmap animation stops working, after running a few frames)


問題描述

運行幾幀後位圖動畫停止工作 (Bitmap animation stops working, after running a few frames)

我嘗試在 Windows 窗體應用程序上創建動畫位圖。一個定時器對像被設置為100ms的間隔,代碼是這樣工作的:

我有一個2560x2560的位圖是我的地圖,一個叫做'pb'的圖片框包含了這個地圖和大小圖片框為 800x800,圖像拉伸參數打開以提供更好的分辨率。我有一個包含火炬框架的 7 個元素的位圖數組。這個想法是我將當前的火炬位圖繪製到地圖上,將“pb”的圖像設置到地圖上並調用無效過程來重繪它。然後將繪製有torch的位圖還原為原始地圖位圖'org_btm'。

代碼如下:

        private void animationtick_Tick(object sender, EventArgs e)
        {
            using (Graphics g = Graphics.FromImage(btm))
            { g.DrawImage(torch_anim[torch_anim_c], new Point(20*64, 20*64)); }
            pb.Image = btm;
            pb.Invalidate();
            btm = org_btm;

            if (torch_anim_c < 6)
            {
                torch_anim_c++;
            }
            else
            {
                torch_anim_c = 0;
            }
            pb.Invalidate();
        }

'torch_anim_c'是位圖數組的索引計數器. 所以出現的問題是,手電筒在前幾幀工作,然後停止工作,卡在 1 幀上,當我在調試器中運行帶有斷點的代碼時,它顯示代碼運行通過,即使圖像卡住了,程序響應,其他功能仍在工作。你有任何想法如何解決這個問題嗎?提前謝謝你。

我有一個帶有卡住火炬動畫的地圖片段:Torch Stuck Snippet

編輯:'Point()' 為 20*64,因為 Torch 尺寸為 64x64,位於位置 20,地圖為 40*40 瓷磚。

當我在帶有斷點的調試器中運行代碼時,它表明即使圖像卡住了代碼也會運行,並且程序響應其他功能仍在工作。你有任何想法如何解決這個問題嗎?提前謝謝你。

我有一個帶有卡住火炬動畫的地圖片段:Torch Stuck Snippet

編輯:'Point()' 為 20*64,因為 Torch 尺寸為 64x64,位於位置 20,地圖為 40*40 瓷磚。

當我在帶有斷點的調試器中運行代碼時,它表明即使圖像卡住了代碼也會運行,並且程序響應其他功能仍在工作。你有任何想法如何解決這個問題嗎?提前謝謝你。

我有一個帶有卡住火炬動畫的地圖片段:Torch Stuck Snippet

編輯:'Point()' 為 20*64,因為 Torch 尺寸為 64x64,位於位置 20,地圖為 40*40 瓷磚。


參考解法

方法 1:

convert it to gif format using photoshop and then use this class

public class GifImage
{
    private Image gifImage;
    private FrameDimension dimension;
    private int frameCount;
    private int currentFrame = ‑1;
    private bool reverse;
    private int step = 1;

    public GifImage(string path)
    {
        gifImage = Image.FromFile(path);
        dimension = new FrameDimension(gifImage.FrameDimensionsList[0]);
        frameCount = gifImage.GetFrameCount(dimension);
    }

    public bool ReverseAtEnd {
        get { return reverse; }
        set { reverse = value; }
    }

    public Image GetNextFrame()
    {

        currentFrame += step;
        if (currentFrame >= frameCount || currentFrame < 1) {
            if (reverse) {
                step *= ‑1;
                currentFrame += step;
            }
            else {
                currentFrame = 0;
            }
        }
        return GetFrame(currentFrame);
    }

    public Image GetFrame(int index)
    {
        gifImage.SelectActiveFrame(dimension, index);
        return (Image)gifImage.Clone();
    }
}

Initialize it at formload ot whenever

GifImage gifImage = new GifImage(filePath);

set the Reverse variable to true if youn want to reverse it at the end

at timer tick use that code

pb.Image = gifImage.GetNextFrame();

(by DeivisTh3Wolf)

參考文件

  1. Bitmap animation stops working, after running a few frames (CC BY‑SA 2.5/3.0/4.0)

#bitmap #animation #winforms #C#






相關問題

在 WPF 4.0 中:如何渲染到(PNG)位圖和窗口一樣好? (In WPF 4.0: How to render to a (PNG) bitmap as good as to the window?)

Android 使用手勢移動和縮放 (Android using hand gestures to move and zoom)

Android轉換為位圖崩潰 (Android Converting to bitmap crash)

本機堆不斷增加 (Native heap keeps increasing)

如何為自定義 NSImageRep 子類實現 -draw (How to implement -draw for custom NSImageRep subclass)

為什麼 getBitmap 方法不起作用? (Why is getBitmap method not working?)

這個 3x3 均值過濾器我做錯了什麼? (What am I doing wrong with this 3x3 Mean filter?)

用於顯示位圖和處理按鈕按下的簡單框架 (Simple Frameworks for Displaying Bitmaps and Handling Button Presses)

如何在Android中位圖壓縮後保存Exif數據 (How to save Exif data after bitmap coppression in Android)

運行幾幀後位圖動畫停止工作 (Bitmap animation stops working, after running a few frames)

Silverlight PrtScr 一些控件 (Silverlight PrtScr some controls)

如何使用 PdfiumViewer 將 PDF 轉換為位圖圖像? (How to convert a PDF to a Bitmap image using PdfiumViewer?)







留言討論