1

我有许多来自外部源(未管理的 dll)的图像,这些图像将显示在 WPF 画布上。外部源渲染图像并将指针 (IntPtr) 传递回非托管内存,以​​及大小、步幅等。

目前,我将这些图像加载到 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,使用这种方法会增加内存消耗到我开始怀疑该方法复制整个图像而可写位图可能不会。

4

1 回答 1

0

WPF 的 Image 控件显示 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 线程复制图像,然后才能显示它。

于 2013-08-21T06:04:15.623 回答