我试图找到一种有效的方法将图像数据缓冲区传递到 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 类?简单的数组还是更复杂的缓冲区?