我从网络摄像头的缓冲区获取位图。当我将这些分配给PictureBox时,红色和蓝色相反。
我可以对位图或PictureBox做些什么来在适当的位置获取红色和蓝色?
答案 0 :(得分:3)
以下代码执行所需的转换:
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
将数据复制到其中,然后在操作后返回到位图。使用LockBits
是处理位图数据的最快选项(比GetPixel
或SetPixel
快得多)。
循环迭代器(i += 3
)取决于位图的PixelFormat
。在这里,我假设它是PixelFormat.Format24bppRgb
。对于Format32bppArgb
,它将是i += 4
。