2016-11-24 33 views
0

我试图在Windows窗体应用程序上创建一个动画位图。一个计时器对象被设置为100ms的间隔,并且代码的工作原理是这样的:运行几帧后,位图动画停止工作

我有一个2560x2560位图,它是我的地图,名为'pb'的图片框包含此地图,图片框的大小为800x800与图像拉伸参数,以提供更好的分辨率。我有一个包含火炬帧的7个元素的位图数组。这个想法是,我将当前火炬位图绘制到地图上,将'pb'图像设置为地图并调用无效过程来重绘它。然后,将绘制到其上的火炬的位图恢复为原始地图位图'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

编辑:在“点()”是20 * 64,因为火炬的尺寸为64×64,它是在20位和地图40 * 40瓦。

+0

在'pb.Invalidate();'之前,检查'pb.InvokeRequired'是否为'true'。 –

+0

问题仍然存在,因为它是:( – Deivis

+0

其实,我删除了代码行,我做了'torch_anim [i] .maketransparent(Color.FromArgb(255,255,255,255));'这似乎解决了卡住的问题,我不知道没有任何线索为什么,但是我仍然需要使动画透明 – Deivis

回答

0

用photoshop将其转换为GIF格式,然后使用这个类

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

在formload初始化它OT每当

GifImage gifImage = new GifImage(filePath); 

设置反向变量设置为true,如果妍想在扭转它end

at timer tick使用该代码

pb.Image = gifImage.GetNextFrame(); 
+0

谢谢,这没有工作相当好 – Deivis

+0

不客气@Deivis – Th3Wolf

-1

change pb.Invalidate();与pb.Update();

+0

我改变它,它似乎做同样的事情 – Deivis