在gif中向后移动比向前移动慢得多

本文关键字:移动 gif | 更新日期: 2023-09-27 18:08:26

我希望能够通过一个gif帧逐帧移动。在下面的例子中,我使用一个跟踪栏来选择我想要看到的gif的哪一帧。对于设计师来说,我只是在屏幕中央放置了一个图片框,并在屏幕底部放置了一个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吗?

在gif中向后移动比向前移动慢得多

一种选择是创建一个列表,在其中添加每个帧。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];

我还没有测试过,但我认为它应该可以工作。