带有动画 GIF 的 C# PictureBox 跳过帧
C# PictureBox with animated GIF skips Frames
我有一个问题,我在 PictureBox 控件中用作图像值的动画 gif 显示速度比在资源管理器中显示速度慢。
我正在使用 C# Winforms。
这里的问题应该是执行时跳过了一些帧
有人可以确认这个问题并且可能有解决方案吗?
我的图片框用于预加载并在后台线程中完全工作。
是否可以从 gif 中逐一读取 Frames 并将其动画化为 picturebox?
谢谢!
使用此代码。 由于每秒显示25帧,我把定时器设置为40,也就是每40毫秒一帧。 (1000ms / 25 frames = 40ms)
第 1 步。此方法显示如何使用
static Image[] images;
int frameCount = 0;
private void Btn_Click(object sender, EventArgs e)
{
//get gif image
object ezgif_com_video_to_gif = Resources.ResourceManager.GetObject("ezgif_com_video_to_gif");
images = getFrames((Image)ezgif_com_video_to_gif);//convert to frames array
//show frames
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 40;
timer.Elapsed += Timer_Elapsed;
timer.Start();
}
步骤 2. 添加计时器滴答声
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
pictureBox1.Image = images[frameCount];
frameCount++;
if (frameCount > images.Length - 1)
frameCount = 0;
}
步骤 3. 将 gif 转换为帧
Image[] getFrames(Image originalImg)
{
int numberOfFrames = originalImg.GetFrameCount(FrameDimension.Time);
Image[] frames = new Image[numberOfFrames];
for (int i = 0; i < numberOfFrames; i++)
{
originalImg.SelectActiveFrame(FrameDimension.Time, i);
frames[i] = ((Image)originalImg.Clone());
}
return frames;
}
我有一个问题,我在 PictureBox 控件中用作图像值的动画 gif 显示速度比在资源管理器中显示速度慢。
我正在使用 C# Winforms。
这里的问题应该是执行时跳过了一些帧
有人可以确认这个问题并且可能有解决方案吗?
我的图片框用于预加载并在后台线程中完全工作。
是否可以从 gif 中逐一读取 Frames 并将其动画化为 picturebox?
谢谢!
使用此代码。 由于每秒显示25帧,我把定时器设置为40,也就是每40毫秒一帧。 (1000ms / 25 frames = 40ms)
第 1 步。此方法显示如何使用
static Image[] images;
int frameCount = 0;
private void Btn_Click(object sender, EventArgs e)
{
//get gif image
object ezgif_com_video_to_gif = Resources.ResourceManager.GetObject("ezgif_com_video_to_gif");
images = getFrames((Image)ezgif_com_video_to_gif);//convert to frames array
//show frames
System.Timers.Timer timer = new System.Timers.Timer();
timer.Interval = 40;
timer.Elapsed += Timer_Elapsed;
timer.Start();
}
步骤 2. 添加计时器滴答声
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
pictureBox1.Image = images[frameCount];
frameCount++;
if (frameCount > images.Length - 1)
frameCount = 0;
}
步骤 3. 将 gif 转换为帧
Image[] getFrames(Image originalImg)
{
int numberOfFrames = originalImg.GetFrameCount(FrameDimension.Time);
Image[] frames = new Image[numberOfFrames];
for (int i = 0; i < numberOfFrames; i++)
{
originalImg.SelectActiveFrame(FrameDimension.Time, i);
frames[i] = ((Image)originalImg.Clone());
}
return frames;
}