2013-10-04 109 views
1

我从网络摄像机获取缓冲区的位图。当我将这些分配给PictureBox时,红色和蓝色会颠倒过来。将BGR位图转换为RGB

我可以对位图或图片框做些什么以在适当的位置获得红色和蓝色?

+1

相机的一些问题? –

+0

相机没有问题。这是BGR色彩空间。主要是与endianness有关。令人讨厌的是,因为你通常需要做额外的工作才能使事情顺利进行。 – Kat

回答

2

下面的代码将需要转换:

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