PictureBox可以在Windows应用程序中显示动画GIF吗?

我想在.Net Winform中展示一个GIF动画。 这该怎么做?

我之前使用的是VB 6.0。

  1. 将图片框放在表单上,​​然后指定带有Gif扩展名的图片文件。 要么:

  2. 以编程方式为gif设置动画图像将帧加载到带有代码的PictureBox中,这里是Gif类:

VB.NET

Public Class GifImage Private gifImage As Image Private dimension As FrameDimension Private frameCount As Integer Private currentFrame As Integer = -1 Private reverse As Boolean Private [step] As Integer = 1 Public Sub New(path As String) gifImage = Image.FromFile(path) 'initialize dimension = New FrameDimension(gifImage.FrameDimensionsList(0)) 'gets the GUID 'total frames in the animation frameCount = gifImage.GetFrameCount(dimension) End Sub Public Property ReverseAtEnd() As Boolean 'whether the gif should play backwards when it reaches the end Get Return reverse End Get Set reverse = value End Set End Property Public Function GetNextFrame() As Image currentFrame += [step] 'if the animation reaches a boundary... If currentFrame >= frameCount OrElse currentFrame < 1 Then If reverse Then [step] *= -1 '...reverse the count 'apply it currentFrame += [step] Else currentFrame = 0 '...or start over End If End If Return GetFrame(currentFrame) End Function Public Function GetFrame(index As Integer) As Image gifImage.SelectActiveFrame(dimension, index) 'find the frame Return DirectCast(gifImage.Clone(), Image) 'return a copy of it End Function End Class 

C#

 public class GifImage { private Image gifImage; private FrameDimension dimension; private int frameCount; private int currentFrame = -1; private bool reverse; private int step = 1; public GifImage(string path) { gifImage = Image.FromFile(path); //initialize dimension = new FrameDimension(gifImage.FrameDimensionsList[0]); //gets the GUID //total frames in the animation frameCount = gifImage.GetFrameCount(dimension); } public bool ReverseAtEnd { //whether the gif should play backwards when it reaches the end get { return reverse; } set { reverse = value; } } public Image GetNextFrame() { currentFrame += step; //if the animation reaches a boundary... if (currentFrame >= frameCount || currentFrame < 1) { if (reverse) { step *= -1; //...reverse the count //apply it currentFrame += step; } else { currentFrame = 0; //...or start over } } return GetFrame(currentFrame); } public Image GetFrame(int index) { gifImage.SelectActiveFrame(dimension, index); //find the frame return (Image)gifImage.Clone(); //return a copy of it } } 

C#用法:

使用上面显示的GifImage.cs类,在PictureBox,Timer和Button中拖放一个Winform项目。

 public partial class Form1 : Form { private GifImage gifImage = null; private string filePath = @"C:\Users\Jeremy\Desktop\ExampleAnimation.gif"; public Form1() { InitializeComponent(); //a) Normal way //pictureBox1.Image = Image.FromFile(filePath); //b) We control the animation gifImage = new GifImage(filePath); gifImage.ReverseAtEnd = false; //dont reverse at end } private void button1_Click(object sender, EventArgs e) { //Start the time/animation timer1.Enabled = true; } //The event that is animating the Frames private void timer1_Tick(object sender, EventArgs e) { pictureBox1.Image = gifImage.GetNextFrame(); } } 

在此处输入图像描述

在@ JeremyThompson的答案上开发我想添加一个代码片段来展示如何实现第一种方法,因为它更简单,并且不要求你手动设置gif的动画,看到PictureBox有一个内置的处理这种情况的function。 只需将PictureBox添加到表单中,然后在表单构造函数中将图像路径分配给PictureBox.ImageLocation

C#

  public PictureForm() { InitializeComponent(); pictureBoxGif.ImageLocation = "C:\\throbber.gif"; } 

VB.Net

 Public Sub New() InitializeComponent() pictureBoxGif.ImageLocation = "C:\throbber.gif" End Sub 

在我看来,这是一个更简单的解决方案,特别是对于.NET新手。

我已经玩过这个和动画播放,只要你不在同一个线程上执行另一个长时间运行的操作。 当你执行另一个长时间运行的操作时,你想要在另一个线程中执行它。

最简单的方法是使用BackgroundWorker组件,您可以从工具箱中拖动到表单上。 然后,您将长时间运行的操作代码放在BackgroundWorker的DoWork()事件中。 最后一步是通过调用BackgroundWorker实例的RunWorkerAsync()方法来调用您的代码。