Pode um PictureBox mostrar GIF animado no Windows Application?

Gostaria de mostrar um gif animado em .net Winform. Como fazer isso?

Eu usei anteriormente o VB 6.0. Muito obrigado.

  1. Coloque um picturebox em um formulário e, em seguida, especifique um arquivo de imagem com uma extensão Gif. Ou:

  2. Programaticamente anima um gif Imagem carregando frameworks em um PictureBox com código, aqui está a class 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 } } 

Uso de C #:

Abra um projeto WinForm arrastar e soltar em um PictureBox, um timer e um botão, com a class GifImage.cs mostrada acima.

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

insira a descrição da imagem aqui

Desenvolvendo na resposta do @ JeremyThompson, eu gostaria de adicionar um trecho de código para mostrar como você pode implementar a primeira abordagem, porque é muito mais simples, e não requer que você anime manualmente o gif, visto que o PictureBox tem um built-in recurso para lidar com esse cenário. Basta adicionar um PictureBox ao seu formulário e, no construtor de formulário, atribuir o caminho da imagem ao PictureBox.ImageLocation

C #

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

VB.Net

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

Na minha opinião, esta é uma solução muito mais simples, especialmente para alguém que é novo no .NET.

Eu brinquei com isso e a animação é reproduzida desde que você não execute outra operação longa no mesmo thread. No momento em que você realiza outra operação longa, você deve fazer isso em outro thread.

A maneira mais simples de fazer isso é usar o componente BackgroundWorker que você pode arrastar para o formulário a partir da sua checkbox de ferramentas. Em seguida, você colocaria seu código de operação longa no evento DoWork () do BackgroundWorker. A etapa final seria invocar seu código chamando o método RunWorkerAsync () da instância BackgroundWorker.