将图像结构从本机代码导出到托管
Posted
技术标签:
【中文标题】将图像结构从本机代码导出到托管【英文标题】:Exporting an image struct from native code to managed 【发布时间】:2014-07-06 15:50:27 【问题描述】:我有一个本机代码库,它每 50 毫秒创建一个图像。我想使用 WPF 将此图像呈现到 WPF GUI 视图中。
图像是由 boost::numeric::ublas::matrix 类型的数据结构构造的 hbitmap。即我从一个浮点值矩阵开始,然后创建一个 HBITMAP,然后使用 MFC 的设备上下文绘制这个 HBITMAP。但是现在,我想用 WPF GUI 替换我的 MFC GUI,因为它看起来更好。我计划使用 C++/CLI 来实现互操作。
我的问题如下:我应该如何设置跨互操作边界的图像传输?
我应该在它仍然是浮动结构时将其转移,还是应该在创建位图后转移?我听说编组会极大地消耗效率,因此必须非常小心地处理。是否存在可用于托管世界和原生世界的通用类型?
我是互操作的新手,您分享的任何其他相关资源将不胜感激。
或者,有没有办法完全避免转移? - 通过从本机代码绘制到 WPF GUI 视图中
我的应用程序对性能非常敏感,我们将不胜感激您提出的任何可实现良好性能的替代方案。
【问题讨论】:
您可以通过 CreateBitmapSourceFromHBitmap 从 HBITMAP 创建 WPF BitmapSource。但是不要忘记之后删除位图句柄,例如解释。 here. @Clemens,这种方法是否可以防止由于编组造成的效率损失? 我不知道您所说的“由于编组导致效率损失”的确切含义,是吗?你有一个 HBITMAP 并从中创建一个 BitmapSource,就是这样。 无论如何你都必须尝试一下,以确定它是否能够每秒创建 20 张图像。我想这在很大程度上取决于它们的大小。 如果浮点值表示原始像素数据(或者可以很容易地转换为这样做),您不妨直接通过其静态Create 方法之一创建一个 BitmapSource。甚至直接来自非托管内存。 【参考方案1】:我经历了相同的选择,发现 - 至少对于 .NET 4.5 - InteropBitmap 是最好的选择,只要您的图像保持相同的大小(例如,对于像视频流这样的东西) .
简而言之,您创建一个内存映射文件(使用 C++/CLI 或 C# 与 p/invoke),并将其用作像素数据的来源。 InteropBitmap
是在同一个内存映射文件上创建的,您可以在 WPF 中将其用作 ImageSource
。
在我的应用程序中,后台线程更新 MMF 并使 InteropBitmap
无效,并且 WPF 前端只是正常绑定到图像源。
【讨论】:
以上是关于将图像结构从本机代码导出到托管的主要内容,如果未能解决你的问题,请参考以下文章
(C++/CLI) 如何在 C++ CLI 中获取从本机代码到托管代码的回调?