WinForm中正确显示GIF动画

转载 2015年11月21日 15:56:51

1.摘抄

从网上查到了一些WinForm中显示GIF动画的方法,其中有一些懒人方法,不管是PictureBox控件、Label控件还是什么的,直接将动画图像丢给它们的Image,又或者添加到资源,你会发现动画要么不动,要么被窗体遮挡后窗体的重画会使动画失效(在Vista系统中百试百灵)。正确显示动画并不是什么难题,只是懒人采用了错误的方法。

System.Drawing命名空间中为我们提供了处理这些包含时间帧的动画图像的密封类ImageAnimator。查看MSDN文档中《ImageAnimator.Animate 方法》的文章时会看到一个不错的范例。我把它摘出来,演示利用ImageAnimator与直接引用资源两种方法的不同。

WinForm中正确显示GIF动画 - qiulei_21 - 见证我心

using System;    
using System.Drawing;    
using System.Reflection;    
using System.Windows.Forms;    
   
public class animateImage : Form    
{    
    //动画图像(来自嵌入资源)    
     Image animatedImage = Image.FromStream(    
         Assembly.GetAssembly(typeof(animateImage))    
         .GetManifestResourceStream("ImageAnimatorExample.Animation.gif"));    
    //是否正在显示动画    
    bool currentlyAnimating = false;    
   
    //开始动画    
    public void AnimateImage()    
     {    
        if (!currentlyAnimating)    
         {    
             ImageAnimator.Animate(animatedImage, new EventHandler(this.OnFrameChanged));    
             currentlyAnimating = true;    
         }    
     }    
   
    //动画帧发生更改触发的事件处理代码    
    private void OnFrameChanged(object o, EventArgs e)    
     {    
        //重绘窗体    
        this.Invalidate();    
        //Controls[0].Invalidate(); //让窗体上的Label控件重绘    
     }    
   
    protected override void OnPaint(PaintEventArgs e)    
     {    
        //开始动画    
         AnimateImage();    
        //得到动画的下一帧准备渲染    
         ImageAnimator.UpdateFrames();    
        //将这帧画到窗体上    
         e.Graphics.DrawImage(this.animatedImage, new Point(0, 40));    
        //为了区分与Label控件而显示的文字    
         e.Graphics.DrawString("ImageAnimator+OnPaint", Font, SystemBrushes.ControlText, new PointF(0, 40));    
     }    
   
    protected override void OnLoad(EventArgs e)    
     {    
        //加载一个Label控件,为了区别与ImageAnimator方式显示动画的不同    
        new Label()    
         {    
             AutoSize = false,    
             Image = animatedImage,    
             Parent = this,    
             Location = new Point(0, 10),    
             Size = animatedImage.Size,    
             Text = "Label"   
         };    
   
         Text = "ImageAnimator显示动画图像   F1-博客";    
        //DoubleBuffered = true; //可以开启窗体的双缓冲减少闪烁    
        base.OnLoad(e);    
     }    
   
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)    
     {    
        if (keyData.Equals(Keys.F1))    
         {    
             System.Diagnostics.Process.Start(    
                "http://hi.baidu.com/wingingbob/blog/item/97fba0039185527e3912bb1b.html");    
         }    
        return base.ProcessCmdKey(ref msg, keyData);    
     }    
   
    //入口点    
    public static void Main()    
     {    
         Application.Run(new animateImage());    
     }    
}   

以上的代码大部分来自MSDN,在测试的时候,试着想办法使窗口重绘(比如被其它窗口遮挡)。我在Vista系统下测试,可以较明显的区分出两个动画的不同

2.我自己的处理:

public partial class gifFrm : Form
    {
        private Image m_img = null;//首先定义私有变量
        private EventHandler evtHandler = null;
        public gifFrm()
        {
            InitializeComponent();
        }

//重载当前winform的OnPaint方法,当界面被重绘时去显示当前gif显示的某一帧
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            if (m_img != null)
            {

         //获得当前gif动画下一步要渲染的帧。
                UpdateImage();

 //将获得的当前gif动画需要渲染的帧显示在界面上的某个位置。
                e.Graphics.DrawImage(m_img, new Rectangle(145, 140, m_img.Width, m_img.Height));
            }
        }

//实现Load方法

        private void gifFrm_Load(object sender, EventArgs e)
        {
            evtHandler = new EventHandler(OnImageAnimate);//为委托关联一个处理方法
            string fileName = Application.StartupPath + "\\dsds.gif";//获取要加载的gif动画文件
            if (System.IO.File.Exists(fileName) == true)
            {
                m_img = Image.FromFile(fileName);

                BeginAnimate();//调用开始动画方法
            }
        }
        private void BeginAnimate()//开始动画方法
        {
            if (m_img != null)
            {
                //当gif动画每隔一定时间后,都会变换一帧那么就会触发一事件,该方法就是将当前image每变换一帧时,都会调用当前这个委托所关联的方法。
                ImageAnimator.Animate(m_img, evtHandler);
            }
        }
        private void OnImageAnimate(Object sender, EventArgs e)//委托所关联的方法
        {
            this.Invalidate();//该方法中,只是使得当前这个winform重绘,然后去调用该winform的OnPaint()方法进行重绘)
        }
        private void UpdateImage()
        {//获得当前gif动画的下一步需要渲染的帧,当下一步任何对当前gif动画的操作都是对该帧进行操作
            ImageAnimator.UpdateFrames(m_img);
        }
        private void StopAnimate()        
        {//关闭显示动画,该方法可以在winform关闭时,或者某个按钮的触发事件中进行调用,以停止渲染当前gif动画。
            m_img = null;
            ImageAnimator.StopAnimate(m_img, evtHandler);
        }

//关闭动画

private void gifFrm_FormClosing(object sender, FormClosingEventArgs e)
        {
            StopAnimate();
        }
    }

(后续实现:终于可以看到gif动画了,如果动画左侧或者上沿再标上一段文字"loading....",这不是和web2,0的效果一样的了么,但是实现起来却复杂的许多。。。)

相关文章推荐

WinForm上显示gif动画

http://www.cnblogs.com/RascallySnake/archive/2010/02/07/1665596.html WinForm上的ProgressBar,老实说,实在是不敢...

c# winform 显示动态gif图片的方法

原文来自:http://blog.csdn.net/wyfde123/article/details/6034592   方法一(简单):用label,然后设置为背景图片 方法二:使用GDI+ ...

C# Winform 显示Gif动图

转载于 http://www.cnblogs.com/cpw999cn/archive/2009/02/07/1385885.html 原文标题是:C# Winform中绘制动画的方法...
  • lj22377
  • lj22377
  • 2017年05月20日 15:26
  • 827

c# winform 显示动态gif图片的方法

方法一(简单):用label,然后设置为背景图片 方法二:使用GDI+ 来实现 (很粗略的实现,没有帧间隔)             Image image = Image.FromFile("e...

让swing正确显示gif图片

今天美工做了一幅gif的图片,我放到JLabel里面去,gif图片闪动得特别厉害。以为美工提供的图片有问题,又双击用IE打开,却显示正常。心想应该是java组建对gif图片显示的问题。网上查了下swi...
  • wqjsir
  • wqjsir
  • 2012年04月20日 00:28
  • 4800

让swing正确显示gif图片

今天美工做了一幅gif的图片,我放到JLabel里面去,gif图片闪动得特别厉害。以为美工提供的图片有问题,又双击用IE打开,却显示正常。心想应该是java组建对gif图片显示的问题。网上查了下swi...
  • ycb1689
  • ycb1689
  • 2012年07月11日 14:30
  • 533

Swing正确显示Gif

package com.jiepu.testgif; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.G...
  • earbao
  • earbao
  • 2014年07月14日 16:35
  • 2509

Android中用GifView显示Gif动画及Gifview简介

最近项目中要用到是实现Gif格式的动画,查了查Android压根就不支持Gif动画,于是乎就研究下了开源的“Gifview”。 一、Gifview简介 作者:ant.cy.liao 主页:http:/...

PMEdit一个富文本框可以编辑文本、并可以显示GIF动画

PMEdit一个富文本框可以编辑文本、并可以显示GIF动画 发布时间:2013-04-14 发布来源:    护士必必要有同情心和一双愿意工作的手。 一、在开端之前起首吐槽...

PMEdit一个富文本框可以编辑文本、图片并可以显示GIF动画

一、在开始之前首先吐槽一下,本人是一个独立开发者,在中国独立开发者就代表一个比较苦逼的行业,特别是对底层东西进行开发者,尤其本人研究方向是编译器、解析器基本上没有公司要,所以出来做个独立开发者。作为独...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:WinForm中正确显示GIF动画
举报原因:
原因补充:

(最多只允许输入30个字)