如何基於純GDI實現alpha通道的矢量和文字繪製

今天有人在QQ羣裏問GDI能不能支持帶alpha通道的線條繪製?
你們的答案固然是否認的,不少人推薦用GDI+。

一個基本的圖形引擎要包括幾個方面的支持:位圖繪製,文字繪製,矢量繪製(如矩形,線條)。
惋惜GDI這個20多年前發明的老古董,對這幾項的繪製, 除了位圖繪製能夠經過AlphaBlend支持alpha通道,其餘繪製都不支持alpha通道。
那有沒有方法讓能經過純GDI讓文字和矢量的繪製也支持alpha通道呢?

討論這個問題以前,咱們先看一下用GDI函數在支持alpha通道的DC上繪製會發生什麼?  這裏  有人討論過這個問題。
固然咱們也能夠本身測試,測試結果是GDI函數會把繪製覆蓋目標像素的alpha通道改都改爲0, 也 就是說若是畫一條線條, 線條經過的位置的alpha通道都回被改爲0。

實際上咱們能夠利用系統的這個特性,結合AlphaBlend函數實現alpha通道的文字和矢量圖形繪製。

具體作法大概以下:
1. 建立內存DC和一幅32bit的DIB Section, 將位圖選入DC
2. 將位圖的全部字節全都改爲0xFF
3. 在內存DC上用文字和矢量 GDI函數 (如DrawText, Rectangle)繪製東西
4. 遍歷全部像素,發現alpha通道爲0 (表示該區域被繪製過),則將 alpha通道改爲咱們須要的alpha值;不然,則將像素的alpha通道改爲0 (表示沒有內容繪製上去)
5. 最後經過AlphaBlend將生成好的DIB Section合成繪製到目標區域

經過上面這種方法, 咱們能夠實現帶alpha通道的矢量和文字繪製,我猜想GDI+應該也是經過相似這種修改像素的方法實現的。

固然,這種方法由於效率問題, 建議一些簡單的繪製能夠考慮 (若是不想引入GDI+), 若是大規模應用就要仔細斟酌了。

微軟當初引入GDI+,部分緣由就是由於GDI不支持alpha通道,惋惜GDI+的效率是如此臭名昭著, 你們大部分時候都是儘可能避免引入,不少時候咱們引入GDI+只是爲了使用它的圖像編解碼功能。

還好技術老是不斷進步,若是你的程序不用考慮XP(如今看來還要過幾年), Vista以後系統爲咱們提供了高效的圖形支持:
圖像編解碼能夠用WIC,文字操做能夠用DirectWrite,圖形渲染能夠用Direct2D  (既支持alpha通道,又支持GPU加速), 實際上IE9以後的瀏覽器都已採用Direct2D開發
相關文章
相關標籤/搜索