Can a PictureBox display animated GIFs in a Windows application?

I would like to show an animated gif in .Net Winform. How to do it?

I used to use VB 6.0. Many thanks.

+7
source share
3 answers
  • Put the image on the form and specify the file with the Gif extension. Or:

  • Programmatically animate gif Loading images into a PictureBox with code, here's the Gif class:

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 

FROM#

 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 } } 

Using C #:

Open a Winform project with drag and drop in the PictureBox, Timer, and Button with the GifImage.cs class shown above.

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

enter image description here

+16
source

In developing the answer to @JeremyThompson, I would like to add a code snippet to show how you can implement the first approach, because it is much simpler and does not require you to manually animate the gif, seeing that the PictureBox has a built-in function to handle such a scenario. Just add a PictureBox to your form and in the form constructor assign the image path to the PictureBox.ImageLocation

FROM#

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

Vb.net

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

In my oppinion, this is a much simpler solution, especially for those new to .NET.

+10
source

I played with this, and the animation plays back on the condition that you do not perform another lengthy operation on the same thread. At that moment, when you perform another long operation, you want to do it in another thread.

The easiest way to do this is to use the BackgroundWorker component, which you can drag into the form from the toolbar. Then you put your long operation code in the DoWork () BackgroundWorker event. The final step is to call your code by calling the RunWorkerAsync () method of the BackgroundWorker instance.

+1
source

All Articles