将BGR位图转换为RGB

时间:2013-10-04 17:55:59

标签: c# .net-4.0

我从网络摄像头的缓冲区获取位图。当我将这些分配给PictureBox时,红色和蓝色相反。

我可以对位图或PictureBox做些什么来在适当的位置获取红色和蓝色?

1 个答案:

答案 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是处理位图数据的最快选项(比GetPixelSetPixel快得多)。

循环迭代器(i += 3)取决于位图的PixelFormat。在这里,我假设它是PixelFormat.Format24bppRgb。对于Format32bppArgb,它将是i += 4

相关问题