3

我正在使用分层窗口并在屏幕上绘制一个圆角矩形。但是,我想平滑锯齿状的边缘。我认为我需要为此进行 alpha 混合。有没有办法用 GDI 做到这一点?

4

4 回答 4

3

创建DIBSection。用 32bpp 填写 BITMAPINFOHEADER。用预乘的 Alpha 填充 Alpha 通道,一切顺利。

AlphaBlend 是使用 aplha 通道实际 blit 32 bpp 位图的 API。

于 2009-07-25T14:59:34.103 回答
0

您可以在 C# 中使用 BitMap 类的 LockBits 方法执行此操作(有关说明,请参阅此问题)。您绝对不想为此使用 GetPixel 和 SetPixel,因为它们非常慢(即使您只是在处理边缘而不是整个位图)。

于 2009-07-24T16:22:13.840 回答
0

有没有机会使用GDI+而不是 GDI?它支持开箱即用的抗锯齿和透明度。

于 2009-07-24T21:42:16.783 回答
-1

仅使用 GDI 调用来进行此类绘制并不是一种简单的方法。您想要的不仅仅是 Alpha 混合:您还想要抗锯齿。这通常涉及以更大的分辨率绘制您想要的内容,然后按比例缩小。

我过去针对类似问题所做的是使用艺术程序绘制我想要的任何形状(例如圆角),它比我需要的黑白大得多。当我想绘制它时,我会将黑白位图缩放到我想要的任何大小(使用来自 Code Project 的缩放类的变体)。这给了我一个灰度图像,我可以将其用作 alpha 通道,然后我将通过调用 Win32 函数 AlphaBlend 或通过使用 DIBSection 并手动更改适当的像素,将其用于 alpha 混合。

这种方法的另一种变体是分配一个比您想要的最终结果大四倍的 DIBSection,绘制到其中,然后使用上面的缩放类将其缩小:从较大图像进行缩放将产生适当的平滑效果.

如果这一切听起来像是很多工作:嗯,确实如此。

编辑:要回答这个问题的标题:您可以通过调用 CreateDIBSection 创建一个带有 alpha 通道的位图。我认为,这不会自己做你想做的事。

于 2009-07-24T21:32:19.330 回答