現在、次のように 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) で使用しています。