我希望能够逐帧移动gif。在下面的示例中,我使用轨迹栏来选择我想要看到的gif的哪个帧。对于设计师我只是将一个PictureBox放在屏幕中央,并在屏幕底部粘贴了一个TrackBar。
using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Imaging;
namespace TestGifProject {
public partial class Form1 : Form {
private Image gif;
private FrameDimension fd;
public Form1() {
InitializeComponent();
gif = Image.FromFile("PATH\\TO\\SOME\\GIF.gif");
// just for this quick example...
this.Width = gif.Width + 20;
this.Height = gif.Height + 53;
pictureBox1.Width = gif.Width;
pictureBox1.Height = gif.Height;
pictureBox1.Image = gif;
fd = new FrameDimension(gif.FrameDimensionsList[0]);
trackBar1.SetRange(0, gif.GetFrameCount(fd) - 1);
}
private void trackBar1_MouseUp(object sender, MouseEventArgs e) {
gif.SelectActiveFrame(fd, trackBar1.Value);
pictureBox1.Image = gif;
}
}
}
当您移动并释放轨迹栏时,框架会正确显示,但是当您向后滚动而不是向前滚动时速度要慢得多(可能快10倍),通常足够长以使应用程序看起来像是已经崩溃了。有什么办法可以加快向后滚动浏览gif吗?
答案 0 :(得分:0)
一个选项是创建一个添加每个帧的列表。 SelectActiveFrame()
可以用更复杂的逻辑解析正确的图像,这可能是行动缓慢的原因。
为您的班级根创建一个新列表:
private List<Image> frames = new List<Image>();
使用帧图像填充列表:
for(int i = 0; i < gif.GetFrameCount(fd); i++)
{
gif.SelectActiveFrame(fd, i);
frames.Add((Image)gif.Clone());
}
然后使用列表将图像设置为PictureBox
:
pictureBox1.Image = frames[trackBar1.Value];
我没有对此进行测试,但我认为它应该可行。