2013-10-04 2 views
1

net 카메라의 버퍼에서 비트 맵을 가져오고 있습니다. 이것들을 PictureBox에 할당하면 빨강과 파랑이 바뀝니다.BGR 비트 맵을 RGB로 변환

빨간색과 파란색을 적절한 위치에 가져 오려면 비트 맵이나 PictureBox에 무엇을 할 수 있습니까?

+1

카메라에 몇 가지 문제가 있습니까? –

+0

카메라에 문제가 없습니다. 그것은 BGR 색 공간입니다. 대부분 엔디안 니스와 관련이 있습니다. 하지만 성가 시게하는 일은 일을하기 위해서 보통 여분의 일을해야하기 때문입니다. – 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을 사용하면 비트 맵 데이터를 조작하는 가장 빠른 옵션입니다 (GetPixel 또는 SetPixel보다 훨씬 빠름).

루프 반복자 (i += 3)는 비트 맵의 ​​PixelFormat에 따라 다릅니다. 여기서는 PixelFormat.Format24bppRgb이라고 가정합니다. Format32bppArgb의 경우 i += 4이됩니다.