日韩欧美国产精品免费一二-日韩欧美国产精品亚洲二区-日韩欧美国产精品专区-日韩欧美国产另-日韩欧美国产免费看-日韩欧美国产免费看清风阁

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

【C#】Winform 顯示動(dòng)態(tài)gif圖片的方法

admin
2024年12月14日 12:38 本文熱度 1197

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


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

Image image = Image.FromFile("e://temp.gif");

 

FrameDimension fd = new FrameDimension(image.FrameDimensionsList[0]);

 

int count = image.GetFrameCount(fd);

 

Graphics g = this.panel1.CreateGraphics();

 

while (true) {

  for (int i = 0; i < count; i++){

    //g.Clear(Color.White);

    image.SelectActiveFrame(fd, i);

    g.DrawImage(image, new Point(0, 0));

    System.Threading.Thread.Sleep(100);

    Application.DoEvents();

  }

}


方法三:(推薦)

Bitmap animatedGif = new Bitmap("e://temp2.gif");

Graphics g = this.panel1.CreateGraphics();


// A Gif image's frame delays are contained in a byte array

// in the image's PropertyTagFrameDelay Property Item's

// value property.

// Retrieve the byte array...

int PropertyTagFrameDelay = 0x5100;

PropertyItem propItem = animatedGif.GetPropertyItem(PropertyTagFrameDelay);

byte[] bytes = propItem.Value;


// Get the frame count for the Gif...

FrameDimension frameDimension = new FrameDimension(animatedGif.FrameDimensionsList[0]);

int frameCount = animatedGif.GetFrameCount(FrameDimension.Time);


// Create an array of integers to contain the delays,

// in hundredths of a second, between each frame in the Gif image.

int[] delays = new int[frameCount + 1];

int i = 0;

for (i = 0; i <= frameCount - 1; i++)

{

  delays[i] = BitConverter.ToInt32(bytes, i * 4);

}

 

// Play the Gif one time...

while (true)

{

  for (i = 0; i <= animatedGif.GetFrameCount(frameDimension) - 1; i++)

  {

    animatedGif.SelectActiveFrame(frameDimension, i);

    g.DrawImage(animatedGif, new Point(0, 0));

    Application.DoEvents();

    Thread.Sleep(delays[i] * 10);

  }

}

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

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

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

這里介紹一個(gè).net自身攜帶的類ImageAnimator,這個(gè)類類似于控制動(dòng)畫的時(shí)間軸,使用ImageAnimator.CanAnimate可以判斷一個(gè)圖片是否為動(dòng)畫,調(diào)用ImageAnimator.Animate可以開始播放動(dòng)畫,即每經(jīng)過一幀的時(shí)間觸發(fā)一次OnFrameChanged委托,我們只要在該委托中將Image的活動(dòng)幀選至下一幀再迫使界面重繪就可以實(shí)現(xiàn)動(dòng)畫效果了。

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

using System;      

using System.Collections.Generic;      

using System.Text;      

using System.Drawing;      

using System.Drawing.Imaging;      

     

namespace GifTest      

{      

    /**//// <summary>      

  /// 表示一類帶動(dòng)畫功能的圖像。      

  /// </summary>      

  public class AnimateImage      

   {      

       Image image;      

       FrameDimension frameDimension;      

      /**//// <summary>      

      /// 動(dòng)畫當(dāng)前幀發(fā)生改變時(shí)觸發(fā)。      

      /// </summary>      

      public event EventHandler<EventArgs> OnFrameChanged;      

  

     /**//// <summary>      

      /// 實(shí)例化一個(gè)AnimateImage。      

      /// </summary>      

      /// <param name="img">動(dòng)畫圖片。</param>      

      public AnimateImage(Image img)      

       {      

           image = img;      

          lock (image)      

          {      

               mCanAnimate = ImageAnimator.CanAnimate(image);      

              if (mCanAnimate)      

               {      

                  Guid[] guid = image.FrameDimensionsList;      

                   mFrameCount = image.GetFrameCount(frameDimension);      

               }      

           }      

       }      

  

     bool mCanAnimate;      

     int mFrameCount = 1, mCurrentFrame = 0;      

  

      /**//// <summary>      

     /// 圖片。      

      /// </summary>      

      public Image Image      

       {      

          get { return image; }      

       }      

  

      /**//// <summary>      

      /// 是否動(dòng)畫。      

     /// </summary>      

      public bool CanAnimate      

       {      

          get { return mCanAnimate; }      

      }      

  

       /**//// <summary>      

    /// 總幀數(shù)。      

      /// </summary>      

      public int FrameCount      

       {      

           get { return mFrameCount; }      

        }      

  

       /**//// <summary>      

       /// 播放的當(dāng)前幀。      

       /// </summary>      

       public int CurrentFrame      

        {      

           get { return mCurrentFrame; }      

        }        

       /**//// <summary>      

      /// 播放這個(gè)動(dòng)畫。      

      /// </summary>      

       public void Play()      

       {      

          if (mCanAnimate)      

           {      

              lock (image)      

               {      

                   ImageAnimator.Animate(image, new EventHandler(FrameChanged));      

               }      

           }      

       }      

  

      /**//// <summary>      

      /// 停止播放。      

      /// </summary>      

      public void Stop()      

       {      

          if (mCanAnimate)      

           {      

              lock (image)      

               {      

                   ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged));      

               }      

           }      

       }      

  

      /**//// <summary>      

      /// 重置動(dòng)畫,使之停止在第0幀位置上。      

      /// </summary>      

      public void Reset()      

       {      

          if (mCanAnimate)      

           {      

               ImageAnimator.StopAnimate(image, new EventHandler(FrameChanged));      

              lock (image)      

               {      

                   image.SelectActiveFrame(frameDimension, 0);      

                   mCurrentFrame = 0;      

               }      

           }      

       }      

  

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

           }      

       }      

   }      

}

使用如下方法調(diào)用:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;      

using System.Drawing;      

using System.Drawing.Imaging;      

using System.Text;      

using System.Windows.Forms;      

     

namespace GifTest      

{      

    public partial class Form1 : Form      

     {      

         AnimateImage image;      

     

        public Form1()      

         {      

             InitializeComponent();      

             image = new AnimateImage(Image.FromFile(@"C:/Documents and Settings/Administrator/My Documents/My Pictures/未命名.gif"));      

             image.OnFrameChanged += new EventHandler<EventArgs>(image_OnFrameChanged);      

             SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint, true);      

         }      

     

        void image_OnFrameChanged(object sender, EventArgs e)      

         {      

             Invalidate();      

         }      

     

        private void Form1_Load(object sender, EventArgs e)      

         {      

             image.Play();      

         }      

     

        private void Form1_Paint(object sender, PaintEventArgs e)      

         {      

            lock (image.Image)      

             {      

                 e.Graphics.DrawImage(image.Image, new Point(0, 0));      

             }      

         }      

     

        private void button1_Click(object sender, EventArgs e)      

         {      

            if (button1.Text.Equals("Stop"))      

             {      

                 image.Stop();      

                 button1.Text = "Play";      

             }      

            else     

             {      

                 image.Play();      

                 button1.Text = "Stop";      

             }      

             Invalidate();      

         }      

     

        private void button2_Click(object sender, EventArgs e)      

         {      

             image.Reset();      

             button1.Text = "Play";      

             Invalidate();      

         }      

     }      

}


該文章在 2024/12/14 12:39:21 編輯過
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購管理,倉儲(chǔ)管理,倉庫管理,保質(zhì)期管理,貨位管理,庫位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 亚洲日韩国产一 | 老子影院午夜伦不卡 | 在线一区二区电影 | 97国产婷婷综合视 | 国产欧美一二三区男女交配 | 国产亚洲午夜高清亚洲精品 | 欧美亚洲校园第一页 | 成人午夜视频一区二区国语 | 日韩高清在线日韩视一区 | 免费人成视频年轻人在线无毒不卡 | 中文在线日韩 | 欧美高清性色生活片免费观 | 亚洲精品美女在线观看 | 亚洲欧美日韩一区在线观看 | 伊人精品| 91电影网| 成人日韩精品一区二区 | 国产又黄又猛又粗又爽的a 羞羞影视 | 亚洲国产欧美日韩精品18 | 中文天堂最新版资源 | 天美麻花星空大全在线观看免费 | 中文子幕在线观看 | 成人高清网站 | 免费99精品国 | 国产亚洲一区二区在线 | 97碰碰碰视频在线观看 | 日韩国产精品va一区二区 | 99国产免线观看九 | 亚洲人成a在线网站 | 9999热 | 在线亚洲人成电影网站色www | 综合欧美国产视频二区 | 在线观看亚洲精品专区 | 在线观看人成视频免费不卡 | 3d成人动漫在线观看 | 华人亚洲欧美精品国产 | 亚洲天堂日韩中文 | 国产精成人品日日拍夜夜免费 | 欧美视频亚洲视频日韩动漫 | 亚洲欧美精品一区二区三区四区 | 精品一精品国产一级 |