处理byte *指针并将其转换为其他内容

时间:2018-06-03 18:35:57

标签: c# arrays image pointers uwp

我有一个可能很愚蠢的问题,但我无法弄清楚如何自己解决。

我从SoftwareBitmap的像素数据中获取了一个字节*指针,然后我编辑了一些像素数据......现在我不知道如何使用该字节*指针。

如何将其转换为IBuffer,例如,为了使用它来创建新的SoftwareBitmap? 有没有更简单的方法来创建新的位图?

顺便说一句,这里的代码甚至认为它不应该有任何帮助:

  1. DLL导入

    [ComImport]
    [Guid("5b0d3235-4dba-4d44-865e-8f1d0e4fd04d")]
    [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
    unsafe interface IMemoryBufferByteAccess
    {
        void GetBuffer(out byte* buffer, out uint capacity);
    }
    
  2. 主要功能

    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;
            }
        }
    }
    
  3. 谢谢大家。

1 个答案:

答案 0 :(得分:1)

在.NET世界中,字节指针可以看作是一个不安全的字节数组,所以首先我们需要做这个编组:

var safearray = new byte[capacity];
Marshal.Copy((IntPtr)data, safearray, 0, capacity);

(另一种选择是不安全的强制转换,以避免副本,如果性能是一个问题,即,如果您正在处理许多和/或大型位图)。

然后我们可以简单地写一下:

IBuffer safebuffer = safearray.AsBuffer();

System.Runtime.InteropServices.WindowsRuntime命名空间的扩展名。