6

我试图找到一种有效的方法将图像数据缓冲区传递到 Windows Phone 8 上的 Windows 运行时组件,从而最大限度地减少需要复制缓冲区数据的次数。之前有人问过一个类似但更笼统的问题:

请参阅将图像从 Windows(电话)运行时组件 (c++/cx) 传递到本机 c++ 算法

背景

可以在此处找到有关该主题的 MSDN 文章。它建议使用WriteableBitmap可以将底层像素缓冲区公开为IBuffer对象的 ,这允许本机组件就地操作数据而无需先复制缓冲区。

请参阅如何使用 C++ 访问 WriteableBitmap.PixelBuffer 像素?

但是,它所在的Windows.UI.Xaml.Media.Imaging命名空间WriteableBitmap不适用于 Windows Phone 8,仅适用于 Windows 8。相反,可以使用System.Windows.Media.Imaging.WriteableBitmap,但它只能以 int[] 的形式访问图像像素数据。将其转换为 an 的一种方法IBuffer是:

using System.Windows.Media.Imaging;
using System.Runtime.InteropServices.WindowsRuntime;

private static IBuffer AsBuffer(WriteableBitmap bitmap)
{
  int[] p = bitmap.Pixels;
  int len = p.Length * 4;
  byte[] arr = new byte[len];
  Buffer.BlockCopy(p, 0, arr, 0, len);
  return arr.AsBuffer(); // Part of System.Runtime.InteropServices.WindowsRuntime
}

但它涉及不必要的缓冲区复制。

另一方面,根据这篇MSDN 文章,传递数据的字节数组有其缺点。基本上,在 Windows 运行时,参数要么用于输入,要么用于输出,而不是两者,这意味着最终需要进行一些复制。

寻求答案

  • 如何有效地通过 Windows 运行时层传递图像数据?
  • 传递图像和传递视频流时适合哪些 RT 类?简单的数组还是更复杂的缓冲区?
4

2 回答 2

0

本机代码的相机 api 是要走的路:http: //msdn.microsoft.com/en-us/library/windowsphone/develop/jj571202

您将直接在您的 c++ WinRT 组件代码中获取数据。在此处查看示例:http: //library.developer.nokia.com/Community/Wiki/Getting_started_with_the_Camera_APIs_for_native_code

于 2013-08-01T21:29:48.487 回答
0

您可以使用IRandomAccessStream(或它的具体类InMemoryRandomAccessStream)在 WinRT 组件之间交换原始数据。根据您想要实现的目标,避免复制可能是一个不错的选择。

于 2015-02-25T10:08:30.643 回答