2012-08-11 16 views
0

첨부 된 웹캠에서 비트 맵을 찍은 다음 시계 방향으로 90, 180 또는 270도 회전하여 창에 표시하는 코드를 작성 중입니다.창에 표시 할 장치 독립적 비트 맵 (DIB)을 직각으로 회전시키는 가장 효율적인 방법은 무엇입니까?

비트 맵은 원래 장치 독립적 비트 맵으로 제공됩니다. 소스 (비트 맵)에서 대상 (화면으로 회전)으로 이동하는 데 가장 효율적인 일련의 호출 (메모리 복사 측면에서)은 무엇입니까?

저는 C++과 Win32 API를 사용하고 있습니다.

+0

http://msdn.microsoft.com/en-us/library/windows/desktop/ms535401%28v=vs.85%29.aspx –

+0

제안 해 주셔서 감사 드리며, 시도했지만 거의 두 번 요구되는 것으로 보입니다. CPU를 아래에 설명 된 방법으로 사용하십시오. 그것은 Bitmap 데이터가 먼저 Bitmap 생성자를 통해 복사 된 다음 RotateFlip을 통해 다시 복사되기 때문입니다. 이 프로그램은 다소 오래되고 느린 임베디드 Windows XP 시스템에서 실행되므로 가능한 한 효율적으로 만들어야합니다. –

답변

0

비트 맵이 메모리에 어떻게 표시되는지 이해해야합니다. 이는 행 현명한 것입니다. 당신은 뒤집어 지도록 선택할 수 있습니다. 예를 들어, 왼쪽 상단에서 시작하여 비트 맵 (cx) 너비에 도달 할 때까지 첫 번째 행 (x = 0..cx, y = 0)에있는 모든 픽셀을 가져옵니다. 그런 다음 스트라이드 (일부 패딩 바이트)가 있고 픽셀의 다음 행 (x = 0..cx, y = 1)이 시작됩니다.

변형을 염두에 두는 것이 중요합니다. 90도 및 270 도의 경우 각 픽셀을 개별적으로 복사해야합니다. 180도 동안 각 행에 대해 memcpy을 사용하여 비트 맵을 '뒤집을'수 있습니다. 또한 너비가 음수 인 BitBlt을 사용할 수 있습니다.

비트 액세스는 CreateDIBSection 또는 GetDIBits을 통해받은 포인터를 사용하여 직접 제공됩니다. 이 비트 맵을 메모리 DC로 사용한 경우 비트를 사용하기 전에 GdiFlush으로 전화하십시오.

+0

capVideoStreamCallback을 통해 제공된 이미지 데이터에서 다음 페인트 이벤트의 DrawDibDraw가 표시 한 버퍼로 복사가 끝났습니다 (조언에 따라 적절한 변환으로). 간단하고 효율적으로 작동하는 것 같습니다. - 감사합니다! –