我正在使用分层窗口并在屏幕上绘制一个圆角矩形。但是,我想平滑锯齿状的边缘。我认为我需要alpha混合。我有办法用GDI做到这一点吗?
答案 0 :(得分:3)
CreateDIBSection。用32bpp填写BITMAPINFOHEADER。使用预乘的alpha填充alpha通道,你就可以了。
AlphaBlend是实际通过aplha通道显示32 bpp位图的API。
答案 1 :(得分:0)
您可以使用BitMap类的LockBits方法在C#中执行此操作(有关说明,请参阅this question)。你肯定不想使用GetPixel和SetPixel,因为它们非常慢(即使你只是操纵边缘而不是整个位图)。
答案 2 :(得分:0)
是否有机会使用GDI+代替GDI?它开箱即用,支持抗锯齿和透明度。
答案 3 :(得分:-1)
使用GDI调用进行此类绘制并不容易。你想要的不只是alpha混合:你想要抗锯齿。这通常涉及以更大的分辨率绘制您想要的内容,然后缩小。
我过去对类似问题所做的是使用艺术程序绘制我想要的任何形状(例如圆角),比我在黑白中所需要的大得多。当我想绘制它时,我会将黑白位图缩放到我想要的任何大小(使用scaling class from Code Project的变体)。这给了我一个灰度图像,我可以用它作为alpha通道,然后我可以通过调用Win32函数AlphaBlend,或者通过使用DIBSection并手动更改相应的像素来进行alpha混合。
这种方法的另一个变体是分配一个比你想要的最终结果大四倍的DIBSection,然后使用上面的缩放类来缩小它:从一个更大的图像缩放将给出适当的平滑效果。
如果所有这些听起来都是相当多的工作:嗯,确实如此。
编辑:要回答此问题的标题:您可以通过调用CreateDIBSection创建带有Alpha通道的位图。我认为,这不会自己做你想做的事。