WPF 2D图像绑定性能

时间:2010-06-01 22:27:07

标签: wpf graphics 2d

我有一个高速摄像头,我在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));

请注意,我正在跳过一些Disposing / cleanup以提高可读性。我必须使用BitmapSource,所以我可以绑定一个ImageSource来显示图像。如果这是XNA,我会使用Texture2Ds,这会飞。我认为,因为WPF的基础使用DirectX,所以必须有比使用总位图更好的方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

BitmapSource具有静态方法,可以从字节数组创建它(请参阅http://msdn.microsoft.com/en-us/library/ms616045%28v=VS.100%29.aspx)。如果由于某种原因这不够好,Bitmap至少有一个GetHBitmap函数来检索HBitmap而不是你自己通过LockBits等创建它(虽然底层实现可能类似)。