2009-07-24 38 views

回答

3

CreateDIBSection。用32bpp填寫BITMAPINFOHEADER。用預倍乘alpha填充alpha通道,然後再行走。

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

0

您可以使用BitMap類的LockBits方法在C#中進行此操作(有關說明,請參閱this question)。你肯定不希望使用GetPixel和SetPixel,因爲它們非常慢(即使你只是在操縱邊緣而不是整個位圖)。

+0

可悲的是我沒有使用託管語言。我需要使用vanilla Windows API。 – wkf 2009-07-24 16:29:16

+0

這是可行的,只是不是由我。 =) – MusiGenesis 2009-07-24 17:11:01

-1

沒有簡單的方法可以用GDI調用來完成這種繪圖。你想要的不僅僅是alpha混合:你想要抗鋸齒。這通常涉及以更大的分辨率繪製您想要的圖像,然後縮小比例。

我過去爲類似問題所做的工作是使用藝術程序繪製任何我想要的形狀(例如圓角),比我需要的大得多,以黑色和白色。當我想繪製它時,我會將黑白位圖縮放到任意大小(使用scaling class from Code Project的變體)。這給了我一個灰度圖像,我可以將其用作alpha通道,然後通過調用Win32函數AlphaBlend或使用DIBSection並手動更改適當的像素,然後將其用於Alpha混合。

這種方法的另一種變化是分配一個DIBSection,比你想要的最終結果大四倍,然後使用上面的縮放類來縮放:縮放比較大的圖像會給適當的平滑效果。

如果這聽起來像很多工作:好吧。

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

+0

我今天下午在淘MSDN的時候偶然發現了CreateDIBSection,它似乎是我缺少的一塊。我使用Wu的線/圓算法繪製反鋸齒線和圓;只要我有權訪問實際的像素數據,我可以將其設置爲任何我想要的。你說得對;它變成了很多工作! ; p – wkf 2009-07-24 22:06:00

0

任何使用GDI+而不是GDI的機會?它支持開箱即用的抗鋸齒和透明度。

相關問題