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

本文关键字:内存 图像 布中 显示 | 更新日期: 2023-09-27 18:28:16

我从外部源(ummanaged 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?)
  • 我还有其他可以使用的技巧吗

感谢

Daniel

编辑:根据Clemens的建议尝试:使用BitmapSource.Create,使用这种方法会增加内存消耗,以至于我开始怀疑该方法会复制整个图像,而Writeable位图可能不会。

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

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