我从网络摄像头的缓冲区中获取位图。当我将这些分配给 PictureBox 时,红色和蓝色是相反的。
我可以对位图或 PictureBox 做些什么来让红色和蓝色出现在适当的位置?
以下代码进行所需的转换:
public static void RGBtoBGR(Bitmap bmp)
{
BitmapData data = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
ImageLockMode.ReadWrite, bmp.PixelFormat);
int length = Math.Abs(data.Stride) * bmp.Height;
unsafe
{
byte* rgbValues = (byte*)data.Scan0.ToPointer();
for (int i = 0; i < length; i += 3)
{
byte dummy = rgbValues[i];
rgbValues[i] = rgbValues[i + 2];
rgbValues[i + 2] = dummy;
}
}
bmp.UnlockBits(data);
}
LockBits
将位图锁定在内存中,以便您可以直接访问和更改内容。如果您不想拥有不安全的上下文,您可以创建一个字节数组并用于Marshal.Copy
将数据复制到其中并在操作后返回位图。Using是处理位图数据的最快选项(比或LockBits
快得多)。GetPixel
SetPixel
循环迭代器 ( i += 3
) 取决于PixelFormat
位图的 。在这里我假设它是PixelFormat.Format24bppRgb
。因为Format32bppArgb
它会i += 4
。