我目前正在使用byte[]从BGRA 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;
}如您所见,然后我将遍历byte[] 4,以便将BGRA格式更改为RGBA格式。
我的问题是:在将字节从IntPtr复制到带管理的byte[]中时,是否有方法将字节从BGRA切换到正确的RGBA位置,从而节省了循环?
如果需要任何上下文,我将从Awesomium WebView曲面(BGRA)获得缓冲图像,并将其用于SFML.NET纹理(RGBA)。
发布于 2014-12-09 20:29:56
BitmapSurface类有一个接受bool convertToRGBA参数的CopyTo方法:
public void CopyTo(
IntPtr destBuffer,
int destRowSpan,
int destDepth,
bool convertToRGBA,
bool flipY
)请参阅API文档
https://stackoverflow.com/questions/27387971
复制相似问题