¿Puede un PictureBox mostrar un GIF animado en una aplicación de Windows?

Me gustaría mostrar un gif animado en .Net Winform. ¿Como hacer esto?

Anteriormente utilicé VB 6.0. Muchas gracias.

  1. Coloque un cuadro de imagen en un formulario y luego especifique un archivo de imagen con una extensión Gif. O:

  2. Progtwigr animadamente un gif Imagen cargando cuadros en un PictureBox con código, aquí está la clase 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 

DO#

 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 un proyecto de Winform arrastrando y soltando en un PictureBox, un temporizador y un botón, con la clase GifImage.cs muestra arriba.

 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

Desarrollando la respuesta de @ JeremyThompson Me gustaría agregar un fragmento de código para mostrar cómo puede implementar el primer enfoque, porque es mucho más simple y no requiere que se active manualmente el archivo gif, dado que el PictureBox tiene una función incorporada. característica para manejar tal escenario. Simplemente agregue un PictureBox a su formulario, y en el formulario el constructor asignará la ruta de la imagen al PictureBox.ImageLocation

DO#

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

VB.Net

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

En mi opinión, esta es una solución mucho más simple, especialmente para alguien que es nuevo en .NET.

He jugado con esto y la animación se reproduce siempre que no realice otra operación de ejecución larga en el mismo hilo. En el momento en que realice otra operación de larga ejecución, querrá hacerlo en otro hilo.

La forma más sencilla de hacerlo es utilizar el componente BackgroundWorker que puede arrastrar al formulario desde su caja de herramientas. Luego colocaría su código de operación de larga ejecución en el evento DoWork () del BackgroundWorker. El último paso sería invocar su código llamando al método RunWorkerAsync () de la instancia de BackgroundWorker.