設置 | 登錄 | 註冊

目前共有13篇帖子。

【解決方案】SetPixel函數繪製速度太慢

11樓 巨大八爪鱼 2016-6-25 16:21
方案1其實就是普通的使用雙緩衝技術的代碼,只不過創建CompatibleBitmap(也稱DDB)後不是用GDI函數來繪圖,而是把繪製好的DIB位圖數據轉換成DDB後放進去。
12樓 巨大八爪鱼 2016-6-25 16:22
至於方案2,要特別注意CreateDIBitmap函數,這個函數名字沒取好,應該叫CreateBitmapFromDIB或CreateDIBGeneratedBitmap差不多。因為這個函數最終創建的是DDB,根本就不是DIB。
13樓 巨大八爪鱼 2016-6-25 16:34
SetDIBits是把DIB轉換為DDB,
與之相反的是GetDIBits函數,該函數將DDB轉換為DIB,具體用法請參考:
https://zh.arslanbar.net/post.php?t=24202
屏幕截圖的時候就要將屏幕上的DDB轉換為DIB,然後寫入文件。因為位圖文件始終保存的是與設備無關的位圖。

一般情況下HBITMAP句柄指向的位圖都是DDB位圖。
至於CreateDIBSection函數,則是系統自動完成了DDB和DIB的相互轉換,因為創建DIBSection的時候就指定了hdc,系統當然就知道DDB是什麼格式的。更新了DIB數組中的數據後,再調用GDI函數,系統會自動將DIB轉換為DDB(HBITMAP那邊)供GDI使用。當用GDI函數繪完圖後,調用GDIFlush函數刷完成GDI的所有操作後,要想看DIB數組中的數據,系統又自動把DDB轉換回DIB,達到兩邊同步的目的。這就是DIB"Section」的作用,它終究只是一個Section。

理論上來說DIB是不需要對應hdc的,因為是「設備無關」的位圖。(方案4可體現)
凡是跟hdc扯上關係了的那肯定就是DDB位圖,因為是「設備相關」的位圖。

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。