Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/323.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带有动画GIF跳过帧的C PictureBox_C#_Winforms_Gif_Picturebox - Fatal编程技术网

C# 带有动画GIF跳过帧的C PictureBox

C# 带有动画GIF跳过帧的C PictureBox,c#,winforms,gif,picturebox,C#,Winforms,Gif,Picturebox,我的问题是,我在PictureBox控件中用作图像值的动画gif显示速度比在资源管理器中慢 我正在使用WinC窗体 这里的问题应该是在执行过程中跳过了一些帧 有人能确认这个问题,并可能有一个解决方案吗 我的图片框用于预加载,在后台线程中完全工作 是否有可能从gif中逐个读取帧,并将其制作成picturebox动画 谢谢 使用此代码。由于每秒显示25帧,我将计时器设置为40,这意味着每40毫秒显示一帧。1000ms/25帧=40ms 第一步。此方法显示了如何使用 第二步。添加计时器滴答声 第三步。

我的问题是,我在PictureBox控件中用作图像值的动画gif显示速度比在资源管理器中慢

我正在使用WinC窗体

这里的问题应该是在执行过程中跳过了一些帧

有人能确认这个问题,并可能有一个解决方案吗

我的图片框用于预加载,在后台线程中完全工作

是否有可能从gif中逐个读取帧,并将其制作成picturebox动画

谢谢

使用此代码。由于每秒显示25帧,我将计时器设置为40,这意味着每40毫秒显示一帧。1000ms/25帧=40ms

第一步。此方法显示了如何使用

第二步。添加计时器滴答声

第三步。将gif转换为帧


=> . 阅读AnimateImages50ms和ImageAnimator类顶部的说明,如果您计划在背景线程上使用PictureBox进行动画制作,ImageAnimator是用于在PictureBox控件中生成动画的类框架版本很重要。谢谢你的建议。计时器的解决方案在我的网站上不起作用@Jimi我如何根据自己的需要实施/更改此功能?是否有更好的方式显示加载屏幕?您需要发布代码,可能是以允许运行代码进行测试的方式发布代码,例如。不需要背景线程来显示动画。动画可以以不同的速度呈现在不同的环境中:不是所有的应用都考虑定制的帧延迟或者考虑它。我上传了一个小的演示项目,它使用的是来自参考资料的带有动画gif的picturebox。我还将gif图像本身放在zip文件中。如果我运行项目-也使用计时器。动画速度比在windows照片查看器中打开的原始文件慢。这里是链接:非常感谢!这就是我要找的。工作出色!我计算了76帧,现在效果很好。不客气。谢谢
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();
}
private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    pictureBox1.Image = images[frameCount];
    frameCount++;
    if (frameCount > images.Length - 1)
        frameCount = 0;
}
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;
}