Производительность WPF: сброс источника элементов управления Image

Я использую библиотеку AForge.NET для периодического получения данных изображения с моей веб-камеры. По причинам отладки мне приходится выводить отфильтрованные изображения на экран. В настоящее время у меня есть 6 изображений WPF в моей основной форме, и каждую секунду я обрабатываю событие, которое дает мне UnmanagedImage, которое я конвертирую в 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;
}

person Zsolt    schedule 29.05.2012    source источник
comment
Я считаю, что bitmap.ToBitmapSource() является наиболее дорогостоящим компонентом, однако вы, вероятно, можете сэкономить небольшое количество накладных расходов, используя конструктор логического параметра, например var bitmapSource = e.UnmanagedImage.ToManagedImage(false).ToBitmapSource();. Поскольку это управляется событиями, это, вероятно, уже происходит в фоновом потоке, верно?   -  person Mike Guthrie    schedule 29.05.2012
comment
Все это (я имею в виду код обработчика событий) находится внутри Dispatcher.Invoke с DispatcherPriority.Send, потому что он выполняется в фоновом потоке.   -  person Zsolt    schedule 29.05.2012
comment
Поэтому мне было бы интересно узнать, как лучше всего решать такие проблемы? Например, нарисовать 6 веб-камер в одной форме WPF? Может быть, я делаю это совершенно неправильно при сбросе источников изображения...   -  person Zsolt    schedule 29.05.2012
comment
Обработка изображения в фоновом режиме не ускорит работу программы, но сделает ее более отзывчивой. Попробуйте получить BitmapSource в фоновом потоке, а затем установите только pictureBox.Source через Dispatcher.Invoke.   -  person Mike Guthrie    schedule 30.05.2012
comment
Но когда я вызываю ToBitmapSource в фоновом потоке, я получаю сообщение об ошибке: Вызывающий поток не может получить доступ к этому объекту*, потому что им владеет другой поток (*объект — это объект BitmapSource, который в данном случае является InteropBitmap)   -  person Zsolt    schedule 30.05.2012


Ответы (1)


Извините, что написал ответ, но я пока не могу комментировать из-за своей низкой репутации.

Если проблема не устранена, используйте метод Freeze, чтобы сделать BitmapSource доступным только для чтения и, следовательно, передать его другому потоку.

person xoxox    schedule 19.08.2013