c# winform 顯示動態gif圖片的方法


方法一(簡單):用label,然后設置為背景圖片

方法二:使用GDI+ 來實現 (很粗略的實現,沒有幀間隔)

 

  1. Image image = Image.FromFile( "e://temp.gif");
  2.  
  3. FrameDimension fd = new FrameDimension(image.FrameDimensionsList[0]);
  4.  
  5. int count = image.GetFrameCount(fd);
  6.  
  7. Graphics g = this.panel1.CreateGraphics();
  8.  
  9. while (true) {
  10. for (int i = 0; i < count; i++){
  11. //g.Clear(Color.White);
  12. image.SelectActiveFrame(fd, i);
  13. g.DrawImage(image, new Point(0, 0));
  14. System.Threading.Thread.Sleep( 100);
  15. Application.DoEvents();
  16. }
  17. }

方法三:(推薦)

           

  1. Bitmap animatedGif = new Bitmap("e://temp2.gif");
  2. Graphics g = this.panel1.CreateGraphics();
  3. // A Gif image's frame delays are contained in a byte array
  4. // in the image's PropertyTagFrameDelay Property Item's
  5. // value property.
  6. // Retrieve the byte array...
  7. int PropertyTagFrameDelay = 0x5100;
  8. PropertyItem propItem = animatedGif.GetPropertyItem(PropertyTagFrameDelay);
  9. byte[] bytes = propItem.Value;
  10. // Get the frame count for the Gif...
  11. FrameDimension frameDimension = new FrameDimension(animatedGif.FrameDimensionsList[0]);
  12. int frameCount = animatedGif.GetFrameCount(FrameDimension.Time);
  13. // Create an array of integers to contain the delays,
  14. // in hundredths of a second, between each frame in the Gif image.
  15. int[] delays = new int[frameCount + 1];
  16. int i = 0;
  17. for (i = 0; i <= frameCount - 1; i++)
  18. {
  19. delays[i] = BitConverter.ToInt32(bytes, i * 4);
  20. }
  21.  
  22. // Play the Gif one time...
  23. while (true)
  24. {
  25. for (i = 0; i <= animatedGif.GetFrameCount(frameDimension) - 1; i++)
  26. {
  27. animatedGif.SelectActiveFrame(frameDimension, i);
  28. g.DrawImage(animatedGif, new Point(0, 0));
  29. Application.DoEvents();
  30. Thread.Sleep(delays[i] * 10);
  31. }
  32. }

方法四: 使用.NET 自帶的類:System.Drawing.ImageAnimator

例子:摘自(http://www.cnblogs.com/cpw999cn/archive/2009/02/07/1385885.html

最近在做一個圖片查看器,由於使用一般的PctureBox,在性能和縮放控制上都無法滿足預期的要求,因此所有組件的呈現均是通過重寫控件的OnPaint事件來繪制。在查看gif圖片時發現Graphics.DrawImage只呈現第一幀,無法滿足預期要求,因此經過摸索尋找到了解決自繪gif的較好辦法。

這里介紹一個.net自身攜帶的類ImageAnimator,這個類類似於控制動畫的時間軸,使用ImageAnimator.CanAnimate可以判斷一個圖片是否為動畫,調用ImageAnimator.Animate可以開始播放動畫,即每經過一幀的時間觸發一次OnFrameChanged委托,我們只要在該委托中將Image的活動幀選至下一幀再迫使界面重繪就可以實現動畫效果了。

為了方便以后的使用,我將這些代碼整合到了一起,形成一個AnimateImage類,該類提供了CanAnimate、FrameCount、CurrentFrame等屬性,以及Play()、Stop()、Reset()等動畫常用的方法,代碼如下

 
  1. using System;      
  2. using System.Collections.Generic;      
  3. using System.Text;      
  4. using System.Drawing;      
  5. using System.Drawing.Imaging;      
  6.      
  7. namespace GifTest      
  8. {      
  9.     /**//// <summary>      
  10.   /// 表示一類帶動畫功能的圖像。      
  11.   /// </summary>      
  12.   public class AnimateImage      
  13.    {      
  14.        Image image;      
  15.        FrameDimension frameDimension;      
  16.       /**//// <summary>      
  17.       /// 動畫當前幀發生改變時觸發。      
  18.       /// </summary>      
  19.       public event EventHandler<EventArgs> OnFrameChanged;      
  20.   
  21.      /**//// <summary>      
  22.       /// 實例化一個AnimateImage。      
  23.       /// </summary>      
  24.       /// <param name="img">動畫圖片。</param>      
  25.       public AnimateImage(Image img)      
  26.        {      
  27.            image = img;      
  28.           lock (image)      
  29.           {      
  30.                mCanAnimate = ImageAnimator.CanAnimate(image);      
  31.               if (mCanAnimate)      
  32.                {      
  33.                   Guid[] guid = image.FrameDimensionsList;      
  34.                    mFrameCount = image.GetFrameCount(frameDimension);      
  35.                }      
  36.            }      
  37.        }      
  38.   
  39.      bool mCanAnimate;      
  40.      int mFrameCount = 1, mCurrentFrame = 0;      
  41.   
  42.       /**//// <summary>      
  43.      /// 圖片。      
  44.       /// </summary>      
  45.       public Image Image      
  46.        {      
  47.           get { return image; }      
  48.        }      
  49.   
  50.       /**//// <summary>      
  51.       /// 是否動畫。      
  52.      /// </summary>      
  53.       public bool CanAnimate      
  54.        {      
  55.           get { return mCanAnimate; }      
  56.       }      
  57.   
  58.        /**//// <summary>      
  59.     /// 總幀數。      
  60.       /// </summary>      
  61.       public int FrameCount      
  62.        {      
  63.            get { return mFrameCount; }      
  64.         }      
  65.   
  66.        /**//// <summary>      
  67.        /// 播放的當前幀。      
  68.        /// </summary>      
  69.        public int CurrentFrame      
  70.         {      
  71.            get { return mCurrentFrame; }      
  72.         }        
  73.        /**//// <summary>      
  74.       /// 播放這個動畫。      
  75.       /// </summary>      
  76.        public void Play()      
  77.        {      
  78.           if (mCanAnimate)      
  79.            {      
  80.               lock (image)      
  81.                {      
  82.                    ImageAnimator.Animate(image, new EventHandler(FrameChanged));      
  83.                }      
  84.            }      
  85.        }      
  86.   
  87.       /**//// <summary>      
  88.       /// 停止播放。      
  89.       /// </summary>      
  90.       public void Stop()      
  91.        {      
  92.           if (mCanAnimate)      
  93.            {      
  94.               lock (image)      
  95.                {      
  96.                    ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged));      
  97.                }      
  98.            }      
  99.        }      
  100.   
  101.       /**//// <summary>      
  102.       /// 重置動畫,使之停止在第0幀位置上。      
  103.       /// </summary>      
  104.       public void Reset()      
  105.        {      
  106.           if (mCanAnimate)      
  107.            {      
  108.                ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged));      
  109.               lock (image)      
  110.                {      
  111.                    image.SelectActiveFrame(frameDimension, 0);      
  112.                    mCurrentFrame = 0;      
  113.                }      
  114.            }      
  115.        }      
  116.   
  117.       private void FrameChanged(object sender, EventArgs e)      
  118.        {      
  119.            mCurrentFrame = mCurrentFrame + 1 >= mFrameCount ? 0 : mCurrentFrame + 1;      
  120.           lock (image)      
  121.            {      
  122.                image.SelectActiveFrame(frameDimension, mCurrentFrame);      
  123.            }      
  124.           if (OnFrameChanged != null)      
  125.            {      
  126.                OnFrameChanged(image, e);      
  127.            }      
  128.        }      
  129.    }      

 

使用如下方法調用:

  1. using System;      
  2. using System.Collections.Generic;      
  3. using System.ComponentModel;      
  4. using System.Data;      
  5. using System.Drawing;      
  6. using System.Drawing.Imaging;      
  7. using System.Text;      
  8. using System.Windows.Forms;      
  9.      
  10. namespace GifTest      
  11. {      
  12.     public partial class Form1 : Form      
  13.      {      
  14.          AnimateImage image;      
  15.      
  16.         public Form1()      
  17.          {      
  18.              InitializeComponent();      
  19.              image = new AnimateImage(Image.FromFile(@"C:/Documents and Settings/Administrator/My Documents/My Pictures/未命名.gif"));      
  20.              image.OnFrameChanged += new EventHandler<EventArgs>(image_OnFrameChanged);      
  21.              SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);      
  22.          }      
  23.      
  24.         void image_OnFrameChanged(object sender, EventArgs e)      
  25.          {      
  26.              Invalidate();      
  27.          }      
  28.      
  29.         private void Form1_Load(object sender, EventArgs e)      
  30.          {      
  31.              image.Play();      
  32.          }      
  33.      
  34.         private void Form1_Paint(object sender, PaintEventArgs e)      
  35.          {      
  36.             lock (image.Image)      
  37.              {      
  38.                  e.Graphics.DrawImage(image.Image, new Point(0, 0));      
  39.              }      
  40.          }      
  41.      
  42.         private void button1_Click(object sender, EventArgs e)      
  43.          {      
  44.             if (button1.Text.Equals("Stop"))      
  45.              {      
  46.                  image.Stop();      
  47.                  button1.Text = "Play";      
  48.              }      
  49.             else     
  50.              {      
  51.                  image.Play();      
  52.                  button1.Text = "Stop";      
  53.              }      
  54.              Invalidate();      
  55.          }      
  56.      
  57.         private void button2_Click(object sender, EventArgs e)      
  58.          {      
  59.              image.Reset();      
  60.              button1.Text = "Play";      
  61.              Invalidate();      
  62.          }      
  63.      }      
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM