1

現在、次のように Marshal.Copy を使用して BGRA IntPtr バッファから byte[] をコピーしています。

    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;
    }

ご覧のとおり、byte[] を一度に 4 つずつループして、BGRA 形式を RGBA 形式に変更しています。

私の質問は次のとおりです: バイトが IntPtr から管理された byte[] にコピーされるときに、バイトを BGRA から正しい RGBA 位置に切り替えて、ループを節約する方法はありますか?

これに必要なコンテキストがある場合は、Awesomium WebView Surfaces (BGRA) からバッファリングされた画像を取得し、それを SFML.NET テクスチャ (RGBA) で使用しています。

4

1 に答える 1