使用Marshal.Copy将IntPtr BRGA复制到RGBA byte []

时间:2014-12-09 20:14:04

标签: c# marshalling awesomium rgba sfml.net

我目前正在使用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 []四个,以将BGRA格式更改为RGBA格式。

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

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

1 个答案:

答案 0 :(得分:2)

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

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

请参阅API documentation