如何检测GIF的状态

时间:2016-05-23 21:28:16

标签: c# winforms

正如标题所示,我有一张带有GIF图像的PictureBox

假设它包含5张图片。如何检测当前显示的图像?我尝试使用图像阵列实现这种效果,并使用计时器迭代它,但它看起来不太好,所以我正在寻找不同的解决方案。

1 个答案:

答案 0 :(得分:1)

遗憾的是,确实没有一种简单的方法可以确定你当前的画面。

可能,根据您在问题中的说法,您可能有类似的解决方案。它不是很漂亮,但它基本上可以让您访问以确定您当前正在显示的帧。

这可能需要一些调试,但它只是一个快速的模型。它应该主要工作,但是当您使用图像播放退出表单时可能会引发线程或对象引用异常:

public partial class frmGifPlayer : Form
{
    List<Image> images = new List<Image>();
    int imageIdx = 0;
    bool playing = false;
    public frmGifPlayer()
    {
        InitializeComponent();
    }

    private void btnLoadGIF_Click(object sender, EventArgs e)
    {
        OpenFileDialog file = new OpenFileDialog();
        if (file.ShowDialog(this) != System.Windows.Forms.DialogResult.OK)
        {
            return;
        }
        Image img = Image.FromFile(file.FileName);

        lock (images)
        {
            // Load your images into a List<Image> collection...
            images.Clear();
            for (int i = 0; i < img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time); i++)
            {
                img.SelectActiveFrame(System.Drawing.Imaging.FrameDimension.Time, i);
                images.Add(new Bitmap(img));
            }
        }


    }

    private void PlayImages(List<Image> images)
    {
        // Cycle through the images in a thread...
        ThreadPool.QueueUserWorkItem(new WaitCallback((o) =>
            {
                List<Image> img = (List<Image>)o;
                int curIdx = 0;
                do
                {
                    lock (images)
                    {
                        // Update your variables then callback to the form to change the image.
                        imageIdx = curIdx;
                        pbGif.Image = img[imageIdx];
                        Invoke(new Action(() =>
                        {
                            txtCurFrame.Text = imageIdx.ToString();
                        }));
                        curIdx++;
                        if (curIdx >= img.Count)
                            curIdx = 0;
                    }
                    Thread.Sleep(TimeSpan.FromSeconds(.5));
                } while (playing);
            }), images);
    }


    private void btnStartStop_Click(object sender, EventArgs e)
    {
        lock (images)
        {
            playing = !playing;
        }
        if (playing)
        {
            btnStartStop.Text = "Stop";
            PlayImages(images);
        }
        else
            btnStartStop.Text = "Start";
    }
}