1

Im currently copying a byte[] from a BGRA IntPtr Buffer using Marshal.Copy as follows:

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

As you can see I'm then looping through the byte[] four at a time to change the BGRA format to a RGBA format.

My question is this: Is there any way to switch the bytes into the correct RGBA postion from their BGRA as they're copied from the IntPtr into the manaaged byte[], saving me the looping?

If there's any context needed on this, I'm getting the buffered image from Awesomium WebView Surfaces (BGRA), and I'm using it in a SFML.NET Texture (RGBA).

anthr
  • 719
  • 5
  • 13

1 Answers1

2

The BitmapSurface class has a CopyTo method that takes a bool convertToRGBA parameter:

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

See API documentation

huysentruitw
  • 25,048
  • 8
  • 76
  • 120