Скопируйте IntPtr BRGA в байт RGBA [] с помощью Marshal.Copy

1

Im в настоящее время копирует байт [] из буфера BGP IntPtr с использованием Marshal.Copy следующим образом:

    private static byte[] getWebViewScreenshotAsBytes(ref WebView myWebView)
    {
        int colorLength = myWebView.Width * myWebView.Height;
        BitmapSurface bmpSurface = (BitmapSurface)myWebView.Surface;

        byte[] bgra = new byte[colorLength * 4];
        Marshal.Copy(bmpSurface.Buffer, bgra, 0, colorLength * 4);

        byte[] rgba = new byte[colorLength * 4];
        for(int i = 0; i < bgra.Length; i += 4)
        {
            rgba[i] = bgra[i + 2];
            rgba[i + 1] = bgra[i + 1];
            rgba[i + 2] = bgra[i];
            rgba[i + 3] = bgra[i + 3];
        }

        return rgba;
    }

Как вы можете видеть, я затем перебираю байты [] по четыре за раз, чтобы изменить формат BGRA в формате RGBA.

Мой вопрос заключается в следующем: есть ли способ переключить байты в правильную позицию RGBA из их BGRA, поскольку они скопированы из IntPtr в управляемый байт [], сохранив цикл?

Если в этом есть какой-либо контекст, я получаю буферизованное изображение из Awesomium WebView Surfaces (BGRA), и я использую его в текстуре SFML.NET(RGBA).

Теги:
marshalling
rgba
sfml.net
awesomium

1 ответ

2
Лучший ответ

Класс BitmapSurface имеет метод CopyTo который принимает параметр bool convertToRGBA:

public void CopyTo(
    IntPtr destBuffer,
    int destRowSpan,
    int destDepth,
    bool convertToRGBA,
    bool flipY
)

См. Документацию по API

  • 1
    Пропустил тот, спасибо за улов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню