C# 动画使用列表<;图像>;

C# 动画使用列表<;图像>;,c#,.net,animation,C#,.net,Animation,我怀疑我的做法是否正确 我必须以每秒60帧的速度播放动画。我正在使用列表在初始化时加载所有帧。然后使用System.Timers.Timer每隔10ms调用一个事件,这将更改图片框中的图像 List<Image> imageList = new List<Image>(); private static Timer_Event(o, e) { pictureBox.Image = imageList[i++]; } List imageList=new Lis

我怀疑我的做法是否正确

我必须以每秒60帧的速度播放动画。我正在使用
列表
在初始化时加载所有帧。然后使用
System.Timers.Timer
每隔10ms调用一个事件,这将更改
图片框中的图像

List<Image> imageList = new List<Image>();

private static Timer_Event(o, e)
{
    pictureBox.Image = imageList[i++];
}
List imageList=new List();
专用静态计时器\u事件(o,e)
{
pictureBox.Image=imageList[i++];
}

那么,我这样做对吗?有更好的方法吗?

可以选择.avi否则,如果你有一堆图像,那么使用线程/计时器显然是一条前进的道路。

你所描述的似乎不太可能以健壮的方式工作。以下是一个简短的总结:

  • 根据我的经验,计时器通常不准确。由于计时器消息通过Windows消息泵传递,因此它们的移动速度只能与Windows UI处理消息的速度一样快。任何干扰消息的应用程序都会导致计时器断断续续,尽管仔细工作可以防止大部分这种情况。这里有一些关于计时器的经典讨论:

  • 通常,列表是一种非常低效的图像存储方式。对于每秒60帧的1秒动画,您必须在内存中保存60个图像,并分别解压缩每个图像

以下是一些可能的解决方案,以及它们所带来的权衡:

全动态视频

如果你想在你的表单上呈现一个完整的动态视频,你应该真正考虑使用<代码>媒体元素< /> >(对于WPF应用程序)或<代码>媒体播放器< /Cord>对象(对于WiFrm应用程序):

这将允许您播放包含极高质量图像、各种压缩的长视频,并任意启动或停止播放。但是,全视频播放器的启动和内存使用要求比仅在屏幕上显示单个图像更高。你会发现你的应用程序需要一点时间来初始化视频子系统,这可能会很烦人

动画图像

可以在Windows窗体或WPF的picturebox中显示动画图像。您只需生成动画图像-通常使用GIF动画文件。这将对大多数简单动画顺利运行,并且可以从以下网站免费使用动画GIF:

以下是如何在窗体上放置动画GIF的演练:

精灵动画

假设您需要准确地表示每个图像(如果您只是想让自己看起来更吸引人,这是不必要的),并且您不需要视频系统的开销(如果您只播放一两秒钟的动画,这是可以的)。然后,您要做的是创建一个合成的“精灵”图像。这降低了应用程序的内存开销要求,并减少了解压缩文件的时间

例如,这里有一个为您生成PNG精灵的网站:

使用精灵生成图像后,可以将其放置在picturebox中,并通过更改图像在picturebox中的相对位置来设置图像动画。以下是如何完成此任务的演练:

摘要


无论您选择以何种方式显示动画图像,都会有一些折衷。我喜欢为自己选择最简单的解决方案——就我而言,我喜欢使用动画GIF图像。祝你好运

最简单的方法是在图片盒中使用动画gif,不要弄乱计时器。

您也可以使用或Silverlight将动画放在一起。。。如果您需要动画是交互式的或可编程控制的,那么这可能是最好的选择

另一方面,如果动画内容是静态的,那么AVI(或MPEG等)可能是最好的选择


你没有说清楚你想要完成什么,所以我不能确定。

如果你使用视频文件而不是图像列表,你可能会有更好的视觉体验。肯定有比这更好的东西……使用.gif文件的可能性吗?@AdilMughal,我已经考虑过了,但它们是否有损?是的,但在任何速度超过每秒10帧的情况下,您通常不会注意到中等的视频压缩。您还可以在压缩和视频保真度之间取得正确的平衡。@Sean AFAIK,GIF文件不会丢失。然而,上次我听说,GIF格式被专利保护。JPEG虽然没有专利权,但有损。使用
定时器的结果非常平滑。您能否进一步了解
AVI
部分。如何将
AVI
合并到我的
表单中
?似乎您正在编写WinForms应用程序-如果是,您可以存放Windows Media Player元素-。如果您使用的是WPF,那么可以使用
MediaElement
。但是,您是否只是尝试播放一个平滑的动画来显示您的窗体正在工作?就像一个“进行中”的指示器?这可能是你想要的:不是我想要的,而是thanx.)@TEDSpence你能更具体地说明你在找什么吗?仅供参考,制作完全无损的动画GIF是可能的——例如,这家伙的网站制作的动画GIF没有人工制品:为什么
AVI
更好?AVI不也是一堆图像吗@大卫,AVI视频中的帧是静止图像。但是视频文件格式也支持声音,并且可能有内置的压缩,你可以“免费”得到。但真正的关键是,视频播放器几乎肯定会卸载至少一些已经渲染的帧(图像)(一些帧可能会被缓存以提高性能),此外,您几乎可以随时开始播放动画