web-dev-qa-db-fra.com

Une imagebox peut-elle afficher un gif animé dans l'application Windows?

Je souhaite montrer un gif d'animation dans Winform .NET. Comment faire cela?

J'ai précédemment utilisé VB 6.0.

8
Angela
  1. Placez une image sur un formulaire, puis spécifiez un fichier d'image avec une extension GIF. Ou:

  2. Animez par programme une image GIF Chargement des cadres dans une boîte à images avec code, voici la classe 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 # Utilisation :

Ouvrez un projet WinForm un glisser-déposer dans une boîte à images, une minuterie et un bouton, avec le GifImage.cs classe indiquée ci-dessus.

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

20
Jeremy Thompson

Développement de la réponse de @ Jeremythompson Je voudrais ajouter un extrait de code pour montrer comment vous pouvez implémenter la première approche, car il est beaucoup plus simple, et ne vous oblige pas à animer manuellement le GIF, en voyant que le PictureBox A une fonctionnalité intégrée pour gérer un tel scénario. Il suffit d'ajouter un PictureBox à votre formulaire et dans le constructeur de formulaire, attribuez le chemin d'image sur le PictureBox.ImageLocation

C #

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

Vb.net

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

Dans mon oppinion, c'est une solution beaucoup plus simple, en particulier pour quelqu'un qui est nouveau à .NET.

11
mematei

J'ai joué avec cela et l'animation joue à condition que vous n'effectuez pas une autre opération longue fonctionnement sur le même fil. Au moment où vous effectuez une autre opération de course longue, vous voudrez le faire dans un autre fil.

Le moyen le plus simple de le faire est d'utiliser le composant du travail d'arrière-plan que vous pouvez faire glisser sur le formulaire de votre boîte à outils. Vous mettriez alors votre long code d'opération de course dans l'événement Dowork () du travailleur d'arrière-plan. La dernière étape consisterait à appeler votre code en appelant la méthode RunworkerAsync () de l'instance de bus d'arrière-plan.

1
sober