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;
       }
    }
posted @ 2011-06-27 17:01  大气象  阅读(3307)  评论(3编辑  收藏  举报
http://www.tianqiweiqi.com