C# WPF性能:重置图像控件的源
我正在使用AForge.NET库定期从我的网络摄像头获取图像数据。出于调试原因,我必须将过滤后的图像绘制到屏幕上。 目前,我的主窗体上有6个WPF图像,每秒钟我都会处理一个事件,该事件会给我一个非托管图像,我将其转换为System.Drawing.Bitmap,然后再转换为BitmapSource-我的代码如下所示:C# WPF性能:重置图像控件的源,c#,.net,wpf,performance,imagesource,C#,.net,Wpf,Performance,Imagesource,我正在使用AForge.NET库定期从我的网络摄像头获取图像数据。出于调试原因,我必须将过滤后的图像绘制到屏幕上。 目前,我的主窗体上有6个WPF图像,每秒钟我都会处理一个事件,该事件会给我一个非托管图像,我将其转换为System.Drawing.Bitmap,然后再转换为BitmapSource-我的代码如下所示: private void OnImageFiltered(object sender, FilterEventArgs e) { var bitmapSource = e.
private void OnImageFiltered(object sender, FilterEventArgs e)
{
var bitmapSource = e.UnmanagedImage.ToManagedImage().ToBitmapSource();
pictureBox.Source = bitmapSource;
}
但正如我之前所说,我有6张图片,这会减慢整个程序的速度。
我怎样才能使它更快
我的ToBitmapSource扩展方法如下:
public static BitmapSource ToBitmapSource(this System.Drawing.Image source)
{
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(source);
var bitSrc = bitmap.ToBitmapSource();
bitmap.Dispose();
bitmap = null;
return bitSrc;
}
很抱歉写了一个答案,但我不能评论,因为我的低声誉
如果问题仍然存在,请使用
Freeze
方法将BitmapSource设置为只读,从而可以传递到其他线程。我相信bitmap.ToBitmapSource()
是成本最高的组件,但是使用bool参数构造函数可能会节省少量开销,asvar bitmapSource=e.UnmanagedImage.ToManagedImage(false.ToBitmapSource()代码>。因为它是事件驱动的,所以它可能已经在后台线程上发生了,对吗?整个事情(我指的是事件处理程序代码)都在DispatcherPriority.Send中进行调用,因为它在后台线程上运行。所以我想知道解决类似问题的“最佳实践”是什么?例如,在一个WPF表单中绘制6个网络摄像头?也许我在重置图像源时完全错了……在后台处理图像不会使程序“更快”,但会使它看起来更灵敏。尝试在后台线程中获取BitmapSource
,然后仅通过Dispatcher.Invoke
设置pictureBox.Source
。但是,当我在后台线程上调用ToBitmapSource时,我得到一个错误:“调用线程无法访问此对象*,因为它属于另一个线程”(*对象是BitmapSource对象,在本例中是InteropBitmap)