使用 Marshal.Copy 将 IntPtr BRGA 复制到 RGBA byte[]
本文关键字:RGBA byte 复制 BRGA Marshal Copy IntPtr 使用 | 更新日期: 2023-09-27 18:33:48
我当前使用 Marshal.Copy 从 BGRA IntPtr 缓冲区复制一个字节[],如下所示:
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格式。
我的问题是这样的:有没有办法将字节从他们的 BGRA 切换到正确的 RGBA 位置,因为它们从 IntPtr 复制到管理的字节[],从而节省我的循环?
如果需要任何上下文,我将从Awesomium WebView Surfaces(BGRA)获取缓冲图像,并在 SFML.NET 纹理(RGBA)中使用它。
BitmapSurface
类有一个采用bool convertToRGBA
参数的CopyTo
方法:
public void CopyTo(
IntPtr destBuffer,
int destRowSpan,
int destDepth,
bool convertToRGBA,
bool flipY
)
请参阅 API 文档