1

我目前使用 Marshal.Copy 从 BGRA IntPtr 缓冲区复制一个字节 [],如下所示:

    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 格式。

我的问题是: 有什么方法可以将字节从它们的 BGRA 切换到正确的 RGBA 位置,因为它们从 IntPtr 复制到受管理的字节 [] 中,从而节省了循环?

如果需要任何上下文,我将从 Awesomium WebView Surfaces (BGRA) 获取缓冲图像,并在 SFML.NET 纹理 (RGBA) 中使用它。

4

1 回答 1

2

该类BitmapSurface有一个带有参数的CopyTo方法:bool convertToRGBA

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

请参阅API 文档

于 2014-12-09T20:29:56.517 回答