在画布中显示非托管内存中的图像

时间:2013-08-20 11:25:47

标签: c# wpf image

我从外部源(umnanaged dll)获得了许多要在WPF画布上显示的图像。外部源渲染图像并将指针(IntPtr)传回给umnanaged内存,以及大小,步幅等。

目前,我正在将这些图像加载到WriteableBitmap中,然后在Canvas的OnRender方法中显示。 WriteableBitmap非常适合这项任务。

WriteableBitmap temp = new WriteableBitmap(ImageWidth, ImageHeight, 96, 96, PixelFormat, null);
temp.WritePixels(new Int32Rect(0, 0, ImageWidth, ImageHeight), pointerToImageData, ImageHeight * stride, (int)stride);

问题:

  • WritableBitmap是否首先将图像数据复制到另一个地方(在托管内存中)?
  • 如果是这样,有没有办法在屏幕上直接渲染图像数据(例如使用DirectX?)
  • 我还可以使用其他任何提示和技巧吗?

谢谢,最好的嘘声

丹尼尔

编辑:在Clemens的建议之后尝试:使用BitmapSource.Create,使用这种方法将内存消耗提高到我开始怀疑该方法复制整个图像而可写的位图可能没有。

1 个答案:

答案 0 :(得分:0)

WPF的图像控件显示ImageSource,您需要将图像转换为它,而不仅仅是Drawing.Image。使用System.Windows.Interop.Imaging转换图片。

我不确定您的图像是如何保存在非托管内存中的,但您可以使用以下两种方法之一。如果它保存为位图,您可以使用CreateBitmapSourceFromHBitmap

或者您可能需要使用CreateBitmapSourceFromMemorySection,方法如下:http://social.msdn.microsoft.com/Forums/vstudio/en-US/a8d86cd0-10cc-4349-aa9c-e62d7d066508/createbitmapsourcefrommemorysection

至于内存分配,你总是要复制图像,除了你必须将图像转换为托管内存之外,UI线程无法处理它没有创建的任何东西。您必须先使用UI线程复制图像,然后才能显示它。