处理GIF部分

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Drawing.Imaging; namespace AnimatePaint
{
/// <summary>
/// 处理gif动画
/// </summary>
public class AnimateImage
{
private Image _image;
private FrameDimension _frameDimension;
private bool _bCanAnimate;
private int _iFrameCount = 1, _iCurrentFrame = 0; public event EventHandler OnFrameChanged;
public Image Image { get { return _image;} }
public bool CanAnimate { get { return _bCanAnimate;} }
public int FrameCount { get { return _iFrameCount; } }
public int CurrentFrame { get { return _iCurrentFrame; } } private void FrameChanged(object sender, EventArgs e)
{
_iCurrentFrame = _iCurrentFrame + 1 >= _iFrameCount ? 0 : _iCurrentFrame + 1;
lock (_image)
{
_image.SelectActiveFrame(_frameDimension, _iCurrentFrame);
if (OnFrameChanged != null)
{
OnFrameChanged(sender, e);
}
}
} public AnimateImage(Image img)
{
_image = img;
lock (_image)
{
_bCanAnimate = ImageAnimator.CanAnimate(_image);
if (_bCanAnimate)
{
Guid[] guids = _image.FrameDimensionsList;
_frameDimension = new FrameDimension(guids[0]);
_iFrameCount = _image.GetFrameCount(_frameDimension);
}
}
} public void Play()
{
if (_bCanAnimate)
{
lock (_image)
{
ImageAnimator.Animate(_image, new EventHandler(FrameChanged));
}
}
} public void Stop()
{
if (_bCanAnimate)
{
lock (_image)
{
ImageAnimator.StopAnimate(_image, new EventHandler(FrameChanged));
}
}
} public void Reset()
{
if (_bCanAnimate)
{
ImageAnimator.StopAnimate(_image, new EventHandler(FrameChanged));
lock (_image)
{
_image.SelectActiveFrame(_frameDimension, 0);
_iCurrentFrame = 0;
}
}
} }
}

自定义控件部分

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace AnimatePicture
{
public partial class AnimatePictureBox : PictureBox
{
private AnimatePaint.AnimateImage _animateimg; private void image_OnFrameChanged(object sender, EventArgs e)
{
Invalidate();
} public AnimatePictureBox()
{
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);
} public void LoadGIF(string strFileName)
{
_animateimg = new AnimatePaint.AnimateImage(Image.FromFile(strFileName));
_animateimg.OnFrameChanged += new EventHandler(image_OnFrameChanged);
_animateimg.Play();
} protected override void OnPaint(PaintEventArgs pe)
{
base.OnPaint(pe);
if (_animateimg != null)
if (_animateimg.Image != null)
lock (_animateimg.Image)
{
pe.Graphics.DrawImage(_animateimg.Image, new Point(0, 0));
}
}
}
}

继承PictureBox显示GIF的自定义控件实现的更多相关文章

  1. EmguCV控件Emgu.CV.UI.ImageBox及C# picturebox显示图片连续刷新出现闪烁问题

    在上一篇里,EmguCV(OpenCV)实现高效显示汉字及叠加  实现了视频叠加及显示,但存在问题,就是 Emgu.CV.UI.ImageBox及C# picturebox显示图片时都会出现闪烁,尤其 ...

  2. C#继承基本控件实现自定义控件

    C#继承基本控件实现自定义控件 摘自:http://www.cnblogs.com/greatverve/archive/2012/04/25/user-control-inherit.html 自定 ...

  3. Android单独继承View类来实现自定义控件

    一个单独继承view类来实现自定义控件,在该方法中,需要重写ondraw方法来绘制自己所需要的控件,下面也以一个简单的例子来说明如何实现自定义控件.该方法可以实现所需要的所有的自定义控件. 属性文件中 ...

  4. 关于C# winform中使用pictureBox显示大红叉的原因

    pictureBox的关于image的属性有三 个,InitalImage,Image,ErrorImage分别表示picturebox的默认初始图片,当前可以设置的图片和出错之后默认显示的图 片,而 ...

  5. C#继承基本控件实现自定义控件 (转帖)

    自定义控件分三类: 1.复合控件:基本控件组合而成.继承自UserControl 2.扩展控件:继承基本控件,扩展一些属性与事件.比如继承Button 3.自定义控件:直接继承自Control 第一种 ...

  6. winfrom datagridview ,picturebox,显示图片,以及删除问题

     private void write_listview(DataSet ds)         {             DataTable dt = ds.Tables[0];          ...

  7. winform下 PictureBox 显示网络图片

    Image pic = new Image.FromStream(WebRequest.Create("http://x.com/x.jpg").GetResponse().Get ...

  8. winform中让pictureBox 显示的图片旋转

    img.RotateFlip(RotateFlipType.Rotate90FlipNone);顺时针旋转90度 RotateFlipType.Rotate90FlipNone 逆时针旋转90度 Ro ...

  9. c#用picturebox显示多页TIF

    //引用 using System.Drawing; using System.Drawing.Imaging; //以下是方法 private Bitmap myImage = null; priv ...

随机推荐

  1. 刚接触js感觉好吃力啊

    我是一个新手,最近刚刚开始学习js这门语言,感觉好难,有一种无从下手的感觉,不知道应该从哪里学习,虽然也看了很多的书,但是对于一个没有计算机基础的人来说,真的是一种煎熬,每一个名词都要去查.万事开头难 ...

  2. java反射机制 struts2 获取 action、method、invocation、proxy

    ActionInvocation invocation = ActionContext.getContext().getActionInvocation(); Object action = invo ...

  3. linux执行文件命令

    1.如果path中有你的程序所在的目录,那么直接执行filename即可 2.如果path中没有程序所在目录,那么进入目录./filename或者path/filename 比如 wj@ubuntu: ...

  4. sqlserver中的统计语法

    set statisitcs io {on | off} 显示与执行的sql语句有关的磁盘活动量的信息 set statistics profile {on | off} 显示语句的配置文件信息 se ...

  5. oracle 复制一条记录只改变主键不写全部列名

    场景:表TEST中有C1,C2,C3...字段,其中C1为主键,先需要复制表TEST中一条(C1='1'的)记录,修改主键列C1和需要变更的列后,再插入到表TEST中. procedure P_TES ...

  6. Php 常用类

    图表库下面的类库可以让你很简单就能创建复杂的图表和图片.当然,它们需要GD库的支持.pChart - 一个可以创建统计图的库.Libchart - 这也是一个简单的统计图库.JpGraph - 一个面 ...

  7. myql查询创建表语句SHOW CREATE TABLE table_name

    技术背景:刚开始学习MySQL时候,有时偷懒,会用SHOW CREATE TABLE 表名\G来复制表创建语句,可是当运行的时候总会因为"表名和列名上有单引号",提示语法错误不能运 ...

  8. poj1182 并查集

     题目连接:http://poj.org/problem?id=1182 基础并查集,需要维护与根节点关系,解析见代码: /* poj 1182 并查集 思路分析:让你分析这些话里面多少假的 只需要用 ...

  9. 在linux下用tomcat部署java web项目的过程与注意事项(转)

    一.安装JDK到http://www.oracle.com/technetwork/java/javase/downloads/index.html下载Java SE 6 Update 27根据操作系 ...

  10. ASP.net 中关于Session的存储信息及其它方式存储信息的讨论与总结

    通过学习和实践笔者总结一下Session 的存储方式.虽然里面的理论众所周知,但是我还是想记录并整理一下.作为备忘录吧.除了ASP.net通过Web.config配置的方式,还有通过其它方式来存储的方 ...