我使用分層窗口並在屏幕上繪製了一個圓角矩形。但是,我想平滑鋸齒狀的邊緣。我認爲我需要alpha混合。有沒有辦法可以用GDI做到這一點?如何使用GDI即時創建帶有Alpha通道的位圖?
回答
CreateDIBSection。用32bpp填寫BITMAPINFOHEADER。用預倍乘alpha填充alpha通道,然後再行走。
AlphaBlend是實際使用aplha通道blit 32 bpp位圖的API。
您可以使用BitMap類的LockBits方法在C#中進行此操作(有關說明,請參閱this question)。你肯定不希望使用GetPixel和SetPixel,因爲它們非常慢(即使你只是在操縱邊緣而不是整個位圖)。
沒有簡單的方法可以用GDI調用來完成這種繪圖。你想要的不僅僅是alpha混合:你想要抗鋸齒。這通常涉及以更大的分辨率繪製您想要的圖像,然後縮小比例。
我過去爲類似問題所做的工作是使用藝術程序繪製任何我想要的形狀(例如圓角),比我需要的大得多,以黑色和白色。當我想繪製它時,我會將黑白位圖縮放到任意大小(使用scaling class from Code Project的變體)。這給了我一個灰度圖像,我可以將其用作alpha通道,然後通過調用Win32函數AlphaBlend或使用DIBSection並手動更改適當的像素,然後將其用於Alpha混合。
這種方法的另一種變化是分配一個DIBSection,比你想要的最終結果大四倍,然後使用上面的縮放類來縮放:縮放比較大的圖像會給適當的平滑效果。
如果這聽起來像很多工作:好吧。
編輯:要回答這個問題的標題:你可以通過調用CreateDIBSection創建一個帶有alpha通道的位圖。我想,這不會自己做你想要的。
我今天下午在淘MSDN的時候偶然發現了CreateDIBSection,它似乎是我缺少的一塊。我使用Wu的線/圓算法繪製反鋸齒線和圓;只要我有權訪問實際的像素數據,我可以將其設置爲任何我想要的。你說得對;它變成了很多工作! ; p – wkf 2009-07-24 22:06:00
任何使用GDI+而不是GDI的機會?它支持開箱即用的抗鋸齒和透明度。
- 1. Delphi 6:如何創建一個帶有Alpha通道的TextOut的位圖?
- 2. 如何使用IImgCtx獲取帶有Alpha通道的圖像?
- 3. 如何從HBITMAP創建Gdiplus ::位圖,保留Alpha通道信息?
- 4. 創建帶有alpha通道/透明度的視頻文件
- 5. 如何使用wxPython創建一個帶alpha通道透明度的窗口?
- 6. 使用GDI創建透明位圖?
- 7. 帶有alpha通道的位圖着色器。 (Alpha正在繪製黑色..?)
- 8. GDI - 如何創建和填充位圖?
- 9. SetPixelFormat沒有爲OpenGL創建Alpha通道
- 10. 使用C#創建3通道位圖?
- 11. 帶「alpha」通道的「直」版圖像
- 12. 如何檢測位圖是否具有.NET中的Alpha通道
- 13. 帶有Alpha通道的WPF 3D紋理
- 14. 繪製位圖的alpha通道
- 15. 從BMP文件創建帶alpha通道的HBITMAP
- 16. Canvas toDataURL不帶alpha通道
- 17. 帶alpha通道的漸變帶
- 18. 如何獲得帶alpha通道的文件夾縮略圖
- 19. 使用FPDF(PHP)插入帶有Alpha通道的PNG
- 20. 使用GDI +位圖
- 21. 使用gdi +在alpha乘以alpha位前乘以一個hdc?
- 22. 如何在TImage上正確顯示帶有alpha通道的TBitmap?
- 23. OpenCV - 如何檢測帶有alpha通道的標記
- 24. 24位Alpha通道中BASE64_ENCODE
- 25. 使用帶有InteropBitmap的gdi +
- 26. 覆蓋兩個帶有alpha通道的ggplot2 stat_density2d圖
- 27. 帶有alpha通道支持的Android opengl屏幕截圖
- 28. JFrame繪製帶有alpha通道的動畫gif圖像
- 29. 使用Alpha通道獲取CGPath圖像
- 30. GDI +使用LockBits從內存創建的通用錯誤保存位圖
可悲的是我沒有使用託管語言。我需要使用vanilla Windows API。 – wkf 2009-07-24 16:29:16
這是可行的,只是不是由我。 =) – MusiGenesis 2009-07-24 17:11:01