Im в настоящее время копирует байт [] из буфера BGP 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;
}
Как вы можете видеть, я затем перебираю байты [] по четыре за раз, чтобы изменить формат BGRA в формате RGBA.
Мой вопрос заключается в следующем: есть ли способ переключить байты в правильную позицию RGBA из их BGRA, поскольку они скопированы из IntPtr в управляемый байт [], сохранив цикл?
Если в этом есть какой-либо контекст, я получаю буферизованное изображение из Awesomium WebView Surfaces (BGRA), и я использую его в текстуре SFML.NET(RGBA).
Класс BitmapSurface
имеет метод CopyTo
который принимает параметр bool convertToRGBA
:
public void CopyTo(
IntPtr destBuffer,
int destRowSpan,
int destDepth,
bool convertToRGBA,
bool flipY
)