绘制一张透明背景的单色位图
在上一篇文章中,我留下了一個謎題:如何使用透明背景繪制一張單色位圖。今天我們來揭曉謎底。
丑話說前頭,我不是一名 GDI 方面的專家,所以,除了下面講述的兩種方法之外,可能還有我所不知道的更好的解決方案。為了演示透明背景的效果,我先將窗口的背景色設置成工作區顏色。
方法1:采用 MaskBlt API
上面的方法所需要編寫的代碼量最少,但我個人覺得有些矯枉過正了。它使用一個所謂的四元光柵操作,就好像是三元一樣,只是因為我不想額外再創建一個圖案畫刷。(光柵操作 0x00AA0029 實際上是一個空操作(NOP)運算符,它不對目標區域做任何操作,我并沒有特別記住它,而是通過查閱文檔知道的)
MAKEOP4 這個宏的意思是:對于蒙版中所有的白色像素,不執行任何操作(NOP),而對于每一個黑色像素,執行 SRCCOPY 操作。
請注意,背景色一直都沒有被使用,畢竟我們是準備繪制一個透明背景的位圖。因此,我們可以直接刪除掉設置和恢復 DC 背景色的相關代碼。
方法2:傳統的二步式
這是傳統的兩步走方案。第一種方法通過將前景設置為黑色,將背景設置為白色,然后使用 SRCAND 來擦除即將被覆蓋的像素。這具有將所有前景像素擦除為零的效果,同時保持背景完好無損。第二個blit做同樣的事情,但使用SRCPAINT。這意味著背景像素需要被視為黑色,以便當它們與目標“或”時,目標像素保持不變。前景色像素獲得所需的前景色。
此方法可以通過否定第一個 blit 來縮短,反轉前景和背景感,這樣黑色就不必在背景顏色和文本顏色之間移動。
這種縮短是否真的是一種整體改進很難說。某些顯示驅動程序可能具有高度優化的 SRCAND 處理程序,而它們不太可能具有優化的0x00220326處理程序。
(練習:為什么你不能反轉第二個步驟,將其轉換為MERGEPAINT?)
總結
細枝末節,我的最愛!
最后
Raymond Chen的《The Old New Thing》是我非常喜歡的博客之一,里面有很多關于Windows的小知識,對于廣大Windows平臺開發者來說,確實十分有幫助。
本文來自:《Drawing a monochrome bitmap with transparency》
總結
以上是生活随笔為你收集整理的绘制一张透明背景的单色位图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: The Multiversity 的 “
- 下一篇: 【缓存中间件】redis 支持的数据类型