c#动画设计初探(CompositionTarget与DispatcherTimer)

     最近需要做个图像采集的工作,其中一个步骤是需要将从摄像机采集的图像播放出来,由于摄像机采集的是一帧帧的图片,而播放的时候需要对播放速度进行控制,因此我考虑将图片放在一个缓冲区中,然后从缓存区中读取后进行播放。因此首先要做的就是如何将一帧帧的图片播放出来,

      通过几天WPF学习,发现可以通过改变image控件的Imagesource或者改变 imageBrush.ImageSource,然后改变Rectangle等的Fill属性,来实现图片的切换。但是做了一个例子发现不是那回事,我在一个循环中不断改变ImageSource值却发现只有最后一帧放出来了,其它帧根本没有显示。并且加入Thread.sleep()让线程等待一段时间也不行。

      再研究发现一些例子中都用了CompositionTarget这个类,但是MSDN中帮助让我看一头雾水,“使用 CompositionTarget 对象,可以基于每个帧回调来创建自定义动画。 CompositionTarget是一个静态类,表示您的应用程序要在其上进行绘制的显示图面。 每次绘制应用程序的场景时,都会引发 Rendering 事件。 呈现帧速率是指每秒绘制场景的次数。”弄了好半天才搞明白,其实说白了,就是程序窗口会按照一定的频率进行刷新,在这个刷新时会触发 Rendering 这个事件,在这个事件中编写你的动画过程(例如改变ImageSource)就可以了。真怀念VB6的帮助,详尽易懂,当时市面的书籍基本上照抄,无出其右。现在的帮助搞的我都怀疑自己是不是中国人,怎么中文搞得比英文还难看懂。
from:
http://greatverve.cnblogs.com/archive/2011/06/27/csharp-flash.html

      如果用CompositionTarget,可以用二种方法改变刷新频率(抄来的,没试过,不保证可用。以后有机会再试)。

      方法一:

< param  name ="maxFramerate"  value ="15"   />  //设置最大帧频。
< param  name ="enableGPUAcceleration"  value ="true"   />  //开启硬件加速
< param  name ="enableCacheVisualization"  value ="true"   />  //测试时,帮忙诊断是否性能有所提示
< param  name ="enableFrameRateCounter"  value ="true"   />  //发布时,和上述参数可一并删除
方法二:
App.Current.Host.Settings.MaxFrameRate  =   30 ; // 播放速度
CompositionTarget.Rendering  +=   new  EventHandler(CompositionTarget_Rendering);
最后我没有用CompositionTarget,而是用的定时器DispatcherTimer,来实现图片连续播放。
 DispatcherTimer timer  =   new  DispatcherTimer();
 timer.Tick 
+=   this .timer_Tick;

  
// 定义刷新频率(帧率),即DispatcherTimer启动的间隔时间
    int  x  =  Convert.ToInt32(((cmbFrames.SelectedItem  as  ComboBoxItem).Content));
   
int  p  =   1000   /  x;
   timer.Interval 
=  TimeSpan.FromMilliseconds(p);
   timer.Start();
   IEnumerator it 
=  al.GetEnumerator();

   
   
private   void  timer_Tick( object  sender, EventArgs e)
   {
      
// 图片切换
       if  (it.MoveNext())
      {
         ImageBrush imageBrush 
=   new  ImageBrush();
         imageBrush.ImageSource 
=  (ImageSource)it.Current;
         img.Fill 
=  imageBrush;
       }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值