2013-10-04 107 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