C# 显示GIF 暂停 播放 重置

本文介绍了一个自定义类AnimateImage,用于实现GIF动画的播放、停止及重置功能。通过该类可以有效控制动画的播放状态,并且解决了停止时无法停留在首帧的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天用到显示GIF,需要停止的功能,在网上找到了相关资料,但是有点问题。解决如下

 

 /**/
    ///  
    /// 表示一类带动画功能的图像。 
    ///  
    public class AnimateImage
    {
        Image image;
        FrameDimension frameDimension;
        /**/
        ///  
        /// 动画当前帧发生改变时触发。 
        ///  
        public event EventHandler OnFrameChanged;

        /**/
        ///  
        /// 实例化一个AnimateImage。 
        ///  
        /// 动画图片。 
        public AnimateImage(Image img)
        {
            image = img;
            lock (image)
            {
                mCanAnimate = ImageAnimator.CanAnimate(image);
                if (mCanAnimate)
                {
                    Guid[] guid = image.FrameDimensionsList;

                    frameDimension = new FrameDimension(guid[0]); //旧版没有此句,参照网上添加的代码

                    mFrameCount = image.GetFrameCount(frameDimension);
                }
            }
        }

        bool mCanAnimate; //是否具有动画的图片
        int mFrameCount = 1, mCurrentFrame = 0;

        /**/
        ///  
        /// 图片。 
        ///  
        public Image Image
        {
            get { return image; }
        }

        /**/
        ///  
        /// 是否动画。 
        ///  
        public bool CanAnimate
        {
            get { return mCanAnimate; }
        }

        /**/
        ///  
        /// 总帧数。 
        ///  
        public int FrameCount
        {
            get { return mFrameCount; }
        }

        /**/
        ///  
        /// 播放的当前帧。 
        ///  
        public int CurrentFrame
        {
            get { return mCurrentFrame; }
        }
        /**/
        ///  
        /// 播放这个动画。 
        ///  
        public void Play()
        {
            if (mCanAnimate)
            {
                lock (image)
                {
                    ImageAnimator.Animate(image, new EventHandler(FrameChanged));
                }
            }
        }

        /**/
        ///  
        /// 停止播放。 
        ///  
        public void Stop()
        {
            if (mCanAnimate)
            {
                lock (image)
                {
                    ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged));
                }
            }
        }

        /**/
        ///  
        /// 重置动画,使之停止在第0帧位置上。 
        ///  
        public void Reset()
        {
            if (mCanAnimate)
            {
                ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged));

                mCurrentFrame = 0; //这里修改了去掉旧的代码,添加下一行代码。旧代码并没有显示第一帧。FrameChanged没有执行,因此手动执行

 

                FrameChanged(null, null);
            }
        }

        private void FrameChanged(object sender, EventArgs e)
        {
            mCurrentFrame = mCurrentFrame + 1 >= mFrameCount ? 0 : mCurrentFrame + 1;
            lock (image)
            {
                image.SelectActiveFrame(frameDimension, mCurrentFrame);
            }
            if (OnFrameChanged != null)
            {
                OnFrameChanged(image, e);
            }
        }
    } 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值