Un PictureBox può mostrare GIF animate nell’applicazione Windows?

Mi piacerebbe mostrare una gif animata in. Netform Winform. Come fare questo?

In precedenza ho utilizzato VB 6.0. Grazie mille.

  1. Metti una picturebox su un modulo e poi specifica un file immagine con un’estensione Gif. O:

  2. Animazione programmatica di un’immagine gif che carica i frame in un PictureBox con codice, ecco la 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 } } 

Utilizzo di C #:

Aprire un progetto Winform trascinandolo in un PictureBox, un Timer e un pulsante, con la class GifImage.cs mostrata sopra.

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

inserisci la descrizione dell'immagine qui

Sviluppando la risposta di @ JeremyThompson vorrei aggiungere uno snippet di codice per mostrare come è ansible implementare il primo approccio, perché è molto più semplice e non richiede di animare manualmente la gif, visto che la PictureBox ha un built-in funzionalità per gestire tale scenario. Basta aggiungere un PictureBox al modulo e nel costruttore del modulo assegnare il percorso dell’immagine a PictureBox.ImageLocation

C #

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

VB.Net

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

A mio parere questa è una soluzione molto più semplice, specialmente per chi è nuovo su .NET.

Ho giocato con questo e le animazioni a condizione che non si esegua un’altra operazione di lunga durata sullo stesso thread. Nel momento in cui si esegue un’altra operazione di lunga durata, si vorrebbe farlo in un altro thread.

Il modo più semplice per farlo è utilizzare il componente BackgroundWorker che è ansible trascinare sul modulo dalla casella degli strumenti. Inseriresti quindi il codice dell’operazione a esecuzione prolungata nell’evento DoWork () di BackgroundWorker. Il passaggio finale consiste nel richiamare il codice chiamando il metodo RunWorkerAsync () dell’istanza di BackgroundWorker.