WPF 2D производительность привязки изображений - PullRequest
0 голосов
/ 02 июня 2010

У меня есть высокоскоростная камера, которая отображается в элементе управления WPF. SDK камеры предоставляет мне массив байтов, представляющих данные изображения. Я ищу наиболее эффективный способ привязки к этим изображениям в элементе управления Canvas. Эти изображения отображаются рядом друг с другом из коллекции, состоящей из 20 изображений.

Мой текущий метод работает именно так, как я хочу, но я чувствую, что слишком много ненужных преобразований.

Сначала я преобразовываю свой байтовый массив в растровое изображение следующим образом:

//note dataAdress is an IntPtr I get from the 3rd party SDK    
//i also have width and height ints

bmp = new Bitmap(width, weight, PixelFormat.Format32bppRgb);          

BitmapData bData = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.WriteOnly, PixelFormat.Format32bppRgb);

int datasize = width * height * 4;
byte[] rgbValues = new byte[datasize];

Marshal.Copy(dataAdress, rgbValues, 0, datasize);
Marshal.Copy(rgbValues, 0, bData.Scan0, datasize);
bmp.UnlockBits(bData);

Затем я вызываю эту функцию для преобразования растрового изображения в источник растрового изображения:

BitmapSource source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bmp.GetHbitmap(), IntPtr.Zero, System.Windows.Int32Rect.Empty, BitmapSizeOptions.FromWidthAndHeight(bmp.Width, bmp.Height));

Обратите внимание, что я пропускаю утилизацию / очистку для удобства чтения. Я должен использовать BitmapSource, чтобы я мог связать ImageSource для отображения изображений. Если бы это был XNA, я бы использовал Texture2D, и он бы летал. Я полагаю, что с тех пор, как в основе WPF используется DirectX, должен быть лучший способ, чем использование грубых битовых карт.

Есть идеи?

1 Ответ

0 голосов
/ 02 июня 2010

BitmapSource имеет статические методы для его создания из массива байтов (см. http://msdn.microsoft.com/en-us/library/ms616045%28v=VS.100%29.aspx). Если по какой-то причине этого недостаточно, Bitmap по крайней мере имеет функцию GetHBitmap для извлечения HBitmap вместо того, чтобы создавать его самостоятельно с помощью LockBits и т. Д. (Хотя базовая реализация, вероятно, похожа).

...