2012-08-11 27 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 – 2012-08-12 15:51:40

+0

感謝您的建議,我試過了,但它似乎需要幾乎兩次CPU的方法如下所述。我猜這是因爲位圖數據首先通過位圖構造函數複製,然後再通過RotateFlip複製。該程序運行在一個相當老舊,速度慢的嵌入式Windows XP系統上,所以我需要儘可能提高效率。 – 2012-08-12 16:10:37

回答

0

您必須瞭解位圖在內存中的表現方式,它是行式的。你可以選擇它是否顛倒或不顛倒。因此,例如,您從左上角開始,然後在第一行(x = 0..cx,y = 0)處獲取所有像素,直到達到位圖(cx)的寬度。然後你可能會有一個步幅(一些填充字節),然後下一行像素(x = 0..cx,y = 1)開始。

牢記這一點,轉換是微不足道的:對於90度和270度,您需要單獨複製每個像素。對於180度,您可以使用memcpy爲每一行「翻轉」位圖。您也可以使用BitBlt的負高度。

通過使用通過CreateDIBSection或使用GetDIBits收到的指針直接提供對位的訪問。如果您已將這些位圖吸引爲內存DC,請記住在使用這些位之前先調用GdiFlush

+0

我從通過capVideoStreamCallback提供的圖像數據複製(根據建議進行了適當的轉換),然後在下一次繪製事件中由DrawDibDraw顯示緩衝區。似乎直接和高效地工作 - 謝謝! – 2012-08-12 16:06:57

相關問題