Производительность привязки 2D-изображений WPF

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

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

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

//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);

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

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

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

Любые идеи?


person bufferz    schedule 01.06.2010    source источник


Ответы (1)


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

person JustABill    schedule 01.06.2010