我有一个可能很愚蠢的问题,但我无法弄清楚如何自己解决。
我从SoftwareBitmap的像素数据中获取了一个字节*指针,然后我编辑了一些像素数据......现在我不知道如何使用该字节*指针。
如何将其转换为IBuffer,例如,为了使用它来创建新的SoftwareBitmap? 有没有更简单的方法来创建新的位图?
顺便说一句,这里的代码甚至认为它不应该有任何帮助:
DLL导入
[ComImport]
[Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
unsafe interface IMemoryBufferByteAccess
{
void GetBuffer(out byte* buffer, out uint capacity);
}
主要功能
private unsafe SoftwareBitmap PixelateImage(SoftwareBitmap bitmap, Boolean AlphaEnabled)
{
using (var buffer = bitmap.LockBuffer(BitmapBufferAccessMode.Read))
{
using (var reference = buffer.CreateReference())
{
((IMemoryBufferByteAccess)reference).GetBuffer(out byte* data, out uint capacity);
// Doing things with data[int index] bytes…
SoftwareBitmap bmp = new SoftwareBitmap(bitmap.BitmapPixelFormat, bitmap.PixelWidth, bitmap.PixelHeight, bitmap.BitmapAlphaMode);
// How to use byte* data else?
// bmp.CopyFromBuffer(IBuffer) <=== How to get an IBuffer from byte*?
return bmp;
}
}
}
谢谢大家。
答案 0 :(得分:1)
在.NET世界中,字节指针可以看作是一个不安全的字节数组,所以首先我们需要做这个编组:
var safearray = new byte[capacity];
Marshal.Copy((IntPtr)data, safearray, 0, capacity);
(另一种选择是不安全的强制转换,以避免副本,如果性能是一个问题,即,如果您正在处理许多和/或大型位图)。
然后我们可以简单地写一下:
IBuffer safebuffer = safearray.AsBuffer();
是System.Runtime.InteropServices.WindowsRuntime
命名空间的扩展名。