簡體   English   中英

如何使用GDI動態創建帶alpha通道的位圖?

[英]How do I create a bitmap with an alpha channel on the fly using GDI?

我正在使用分層窗口並在屏幕上繪制一個圓角矩形。 但是,我想平滑鋸齒狀的邊緣。 我認為我需要alpha混合。 我有辦法用GDI做到這一點嗎?

CreateDIBSection。 用32bpp填寫BITMAPINFOHEADER。 使用預乘的alpha填充alpha通道,你就可以了。

AlphaBlend是一個用aplha通道實際上blit 32 bpp位圖的API。

您可以使用BitMap類的LockBits方法在C#中執行此操作(請參閱此問題以獲得解釋)。 你絕對不想使用GetPixel和SetPixel,因為它們非常慢(即使你只是操縱邊緣而不是整個位圖)。

有沒有機會使用GDI +代替GDI? 它開箱即用,支持抗鋸齒和透明度。

只用GDI調用就沒有簡單的方法來進行這種繪圖。 你想要的不只是alpha混合:你想要抗鋸齒。 這通常涉及以更大的分辨率繪制您想要的內容,然后縮小。

我過去對類似問題所做的是使用藝術程序來繪制我想要的任何形狀(例如圓角)比我在黑白中所需要的大得多。 當我想繪制它時,我會將黑白位圖縮放到我想要的任何大小(使用Code Project中的縮放類的變體)。 這給了我一個灰度圖像,我可以用它作為alpha通道,然后通過調用Win32函數AlphaBlend,或者通過使用DIBSection並手動更改相應的像素,我將其用於alpha混合。

這種方法的另一個變體是分配一個大約比你想要的最終結果大四倍的DIBSection,然后使用上面的縮放類來縮小它:從更大的圖像縮放將給出適當的平滑效果。

如果所有這些聽起來像是很多工作:嗯,確實如此。

編輯:要回答這個問題的標題:你可以通過調用CreateDIBSection創建一個帶alpha通道的位圖。 我想,這不會自己做你想做的事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM