正如标题所示,我有一张带有GIF图像的PictureBox
。
假设它包含5张图片。如何检测当前显示的图像?我尝试使用图像阵列实现这种效果,并使用计时器迭代它,但它看起来不太好,所以我正在寻找不同的解决方案。
答案 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";
}
}