C# WPF性能:重置图像控件的源

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.

我正在使用AForge.NET库定期从我的网络摄像头获取图像数据。出于调试原因,我必须将过滤后的图像绘制到屏幕上。 目前,我的主窗体上有6个WPF图像,每秒钟我都会处理一个事件,该事件会给我一个非托管图像,我将其转换为System.Drawing.Bitmap,然后再转换为BitmapSource-我的代码如下所示:

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参数构造函数可能会节省少量开销,as
var bitmapSource=e.UnmanagedImage.ToManagedImage(false.ToBitmapSource()。因为它是事件驱动的,所以它可能已经在后台线程上发生了,对吗?整个事情(我指的是事件处理程序代码)都在DispatcherPriority.Send中进行调用,因为它在后台线程上运行。所以我想知道解决类似问题的“最佳实践”是什么?例如,在一个WPF表单中绘制6个网络摄像头?也许我在重置图像源时完全错了……在后台处理图像不会使程序“更快”,但会使它看起来更灵敏。尝试在后台线程中获取
BitmapSource
,然后仅通过
Dispatcher.Invoke
设置
pictureBox.Source
。但是,当我在后台线程上调用ToBitmapSource时,我得到一个错误:“调用线程无法访问此对象*,因为它属于另一个线程”(*对象是BitmapSource对象,在本例中是InteropBitmap)