最近需要做个图像采集的工作,其中一个步骤是需要将从摄像机采集的图像播放出来,由于摄像机采集的是一帧帧的图片,而播放的时候需要对播放速度进行控制,因此我考虑将图片放在一个缓冲区中,然后从缓存区中读取后进行播放。因此首先要做的就是如何将一帧帧的图片播放出来,
通过几天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 ="enableGPUAcceleration" value ="true" /> //开启硬件加速
< param name ="enableCacheVisualization" value ="true" /> //测试时,帮忙诊断是否性能有所提示
< param name ="enableFrameRateCounter" value ="true" /> //发布时,和上述参数可一并删除
CompositionTarget.Rendering += new EventHandler(CompositionTarget_Rendering);
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;
}
}