带有动画 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 跳过帧的主要内容,如果未能解决你的问题,请参考以下文章

WPF显示Gif动画

图片框可见性中的动画gif随委托子和后台线程而变化

C# 在带有 Graphics.DrawLine() 的 PictureBox 上绘制不适用于 Paint 事件

C#里面清空pictureBox为啥用Image=null还是不行

C# 区分静态 GIF 和动画

带有 2 个动画 gif 的 Jquery gif 雪