2013-10-18 4 views
0

이미지를 지속적으로 업데이트하고 이미지로 렌더링하는 writeablebitmap을 사용하려고합니다. 그러나 이미지의 상단 만 표시되고 중간 및 하단 2/3가 검정입니다. 필자는 writeablebitmap이 bgr24이고 이미지가 rgb24이므로 PixelFormat과 관련이있을 것이라고 생각합니다. 이것이 내가 현재하고있는 일입니다.WPF 이미지 상단에 1/3 만 표시됩니다.

int bufferSize = videoRenderer.VideoWidth * videoRenderer.VideoHeight; 
byte[] frameBuffer = new byte[bufferSize]; 
Marshal.Copy(videoRenderer.Bitmap.BackBuffer, frameBuffer, 0, bufferSize); 

using (Bitmap frame = new Bitmap(videoRenderer.VideoWidth, videoRenderer.VideoHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb)) 
{ 
    System.Drawing.Rectangle rect = new System.Drawing.Rectangle(0, 0, videoRenderer.VideoWidth, videoRenderer.VideoHeight); 
    BitmapData bmpData = frame.LockBits(rect, ImageLockMode.ReadWrite, frame.PixelFormat); 
    Marshal.Copy(frameBuffer, 0, bmpData.Scan0, bufferSize); 
    frame.UnlockBits(bmpData); 
    IntPtr hBitmap = frame.GetHbitmap(); 
    source = Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); 
    DeleteObject(hBitmap); 
} 

무언가가 끔찍하게 잘못 보이거나 픽셀 형식 일 가능성이 큽니다. 그리고 pixelformat이라면, 어떻게하면 파란색과 적색을 바꾸기 위해 C#의 각 픽셀을 통과할까요?

답변

2

이 경우 픽셀 형식 일 수 없습니다 (이미지의 1/3이 렌더링되고 나머지는 검정이되지 않음). BGR24와 RGB24의 차이점은 색상 스왑 일뿐입니다.

아마도 비트 맵과 비디오 소스 간의 차이점과 관련이 있습니다.

그리고 BGR24에서 RGB24로 변환하는 것은 쓰기 가능한 비트 맵을 잠그고 각 픽셀을 반복하고 구성 요소를 스와핑하여 수동으로 수행 할 수 있지만 성능이 좋지는 않습니다.

훨씬 더 나은 방법은 FormatConvertedBitmap 클래스를 사용하는 것입니다.

+0

writeablebitmap의 backbufferstride를 확인하면 1920이 반환됩니다. 비트 맵의 ​​비트 맵 데이터는 1920과 같이 스트라이드를 반환합니다. – bl4kh4k

+0

스트라이드가 일치하면 문제가 먼저 발생하지 않는지 확인합니다. 쓰기 가능한 비트 맵은 어떻게 업데이트됩니까? 어쩌면 비디오를 제공하는 소스와 쓰기 가능한 비트 맵간에 차이가있을 수 있습니다. –

+0

videoRenderer는 1920 년 writeablebitmap을 보유하는 사용자 정의 객체입니다. – bl4kh4k

관련 문제