带有动画 GIF 的 C# PictureBox 跳过帧
Posted
技术标签:
【中文标题】带有动画 GIF 的 C# PictureBox 跳过帧【英文标题】:C# PictureBox with animated GIF skips Frames 【发布时间】:2021-05-19 03:56:27 【问题描述】:我的问题是我在 PictureBox 控件中用作 IMAGE 值的动画 gif 的显示速度比在资源管理器中显示的速度慢。
我正在使用 C# Winforms。
这里的问题应该是执行时跳过了一些帧。
有人可以确认这个问题并可能有解决方案吗?
我的图片框用于预加载并完全在后台线程中工作。
是否可以从 gif 中一一读取帧并将其动画制作成图片框?
谢谢!
【问题讨论】:
***.com/questions/25382400/… ImageAnimator.Animate() => ImageAnimator.AnimateImages50ms()。阅读AnimateImages50ms
和 ImageAnimator 类之上的注释,如果您以任何方式计划在后台线程上使用 PictureBox 进行动画处理(ImageAnimator 是用于在 PictureBox 控件中生成动画的类)。 + 框架版本很重要。
感谢您的建议。计时器的解决方案不适用于我的网站。 @Jimi 我怎样才能根据我的需要实施/更改它?有没有更好的方法来显示加载屏幕?
您需要发布您的代码,可能以允许运行它进行测试的方式发布(例如,Create a Minimal, Reproducible Example)。不需要后台线程来显示动画。动画可以在不同的环境中以不同的速度呈现:并非所有应用程序都考虑自定义帧延迟或根本不考虑它。它通常使用默认延迟呈现。
我上传了一个小型演示项目,它使用了来自资源的带有动画 gif 的图片框。我还将 gif 图像本身放在 zip 文件中。如果我运行该项目——也使用计时器。动画比在 Windows 照片查看器中打开的原始文件慢。这是链接:link
【参考方案1】:
使用此代码。 由于每秒显示 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;
【讨论】:
非常感谢!这就是我要找的。工作出色!我必须计算 76 帧,现在效果很好。以上是关于带有动画 GIF 的 C# PictureBox 跳过帧的主要内容,如果未能解决你的问题,请参考以下文章
C# 在带有 Graphics.DrawLine() 的 PictureBox 上绘制不适用于 Paint 事件