IndustProg
IndustProg

Reputation: 647

How to show a specific frame of a GIF image in C#?

I want to show a frame of a gif image. I searched and found that the following code should work, but it doesn't work. it detects the number of frames correctly but it shows the whole frames of gif instead of the specified frame. thanks everybody.

Image[] frames = new Image[36];
Image GG = Image.FromFile(@"C:\Users\Administrator\TEST C#\TEST2frame2\chef.gif");
FrameDimension dimension = new FrameDimension(GG.FrameDimensionsList[0]);
            // Number of frames
int frameCount = GG.GetFrameCount(dimension);
label1.Text = frameCount.ToString();

            // Return an Image at a certain index
GG.SelectActiveFrame(dimension, 1);
frames[1] = ((Image)GG.Clone());
pictureBox1.Image = frames[1];

Upvotes: 3

Views: 3121

Answers (2)

Ondrej Janacek
Ondrej Janacek

Reputation: 12616

Oh it works, but not as you expect it to.

When you set an active frame of a gif image it actually restarts its animation from that frame. You have to stop it when you change a frame, by setting the pictureBox.IsEnabled to false, for instance. Try the following code

private Image img;

public Form1()
{
    InitializeComponent();
    img = Image.FromFile(@"C:\Users\Administrator\TEST C#\TEST2frame2\chef.gif");
    pictureBox1.Image = img;
}

private void button1_Click(object sender, EventArgs e)
{
    var dim = new FrameDimension(img.FrameDimensionsList[0]);
    img.SelectActiveFrame(dim, 1);
    pictureBox1.Enabled = false;
}

Try pressing the button in different moments and you will see that the active image frame will change.

Upvotes: 3

ba__friend
ba__friend

Reputation: 5903

Use your own code up until the call of SelectActiveFrame() and after that change to this lines:

frames[0] = new Bitmap(GG);
pictureBox1.Image = frame[0];

This should do the trick. Please do not forget do dispose the created Images.

Upvotes: 4

Related Questions