在画布中显示非托管内存中的图像
本文关键字:内存 图像 布中 显示 | 更新日期: 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线程复制图像,然后才能显示它。