問題描述
運行幾幀後位圖動畫停止工作 (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();