Обрабатывать байт * указатель и преобразовывать его во что-то - PullRequest
0 голосов
/ 03 июня 2018

У меня, вероятно, глупый вопрос, но я не могу понять, как решить его самостоятельно.

Я получил указатель байта * из пиксельных данных 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;
            }
        }
    }
    

Спасибо всем.

1 Ответ

0 голосов
/ 03 июня 2018

Указатель байтов можно рассматривать как небезопасный массив байтов в мире .NET, поэтому сначала нам нужно выполнить этот маршал:

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

(другой альтернативой является небезопасное приведение во избежаниекопия, если производительность является проблемой, т. е. если вы имеете дело со многими и / или большими растровыми изображениями).

Тогда мы можем просто написать:

IBuffer safebuffer = safearray.AsBuffer();

, что является расширениемиз пространства имен System.Runtime.InteropServices.WindowsRuntime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...