Alphablend功能

ana*_*and 2 c++ winapi gdi alphablending

是否可以使用alphablend函数使图像的某些部分透明?

我可以创建一个包含RGB(0,0,255)特定区域的图像,当我绘制该图像时,该区域应该是透明的.这可能是AlphaBlend函数.是的,那么如何?

我正在阅读有关alphablend的内容,但我仍然不清楚.我想我们需要在创建图像时指定alphachannel.如果某个像素不存在alphachannel,那么该像素不能透明?

Cod*_*ray 5

我想我们需要在创建图像时指定alphachannel.如果某个像素不存在alphachannel,那么该像素不能透明?

是的,该AlphaBlend功能旨在绘制已经保存了Alpha通道信息的图像.这些将是32位/像素(bpp)图像,这意味着它们包含红色,绿色,蓝色和alpha通道信息.您可以将该AlphaBlend功能视为类似BitBlt,除了它保留图像可能包含的任何透明或半透明像素.

这个函数的关键是它的最后一个参数,它是一个BLENDFUNCTION结构.文档有这样的说法:

ftn[in]  源和目标位图的alpha混合函数,要应用于整个源位图的全局Alpha值,以及源位图的格式信息.源和目标混合函数目前仅限于AC_SRC_OVER.

那么这意味着假设您的图像已包含预乘的Alpha通道.该AlphaBlend函数在绘制图像时会考虑这些值,但您可以通过为结构SourceConstantAlpha成员指定0到255之间的值来调整其不透明度BLENDFUNCTION.如果将此值设置为255,则仅使用位图的每像素alpha值.如果将其设置为0,则假定您的图像是透明的.将其设置为介于两者之间的某些内容将导致您的图像以一定程度的半透明度绘制.

是否可以使用alphablend函数使图像的某些部分透明?

我可以创建一个包含RGB(0,0,255)特定区域的图像,当我绘制该图像时,该区域应该是透明的.

听起来像你正在尝试做的事情(正如kolenda所说)是一种叫做颜色键控的东西.基本上,你在你希望透明的图像中使用特定颜色(如RGB(0,0,255)),然后告诉Windows使用RGB(0,0,255)作为透明键颜色绘制图像,这意味着原始图像中RGB(0,0,255)的每个像素在绘制的图像中都是透明的.

是的,这是可能的,而且它在Windows中实际上比较常见,例如工具栏按钮图标等.一般来说,它们会使用颜色紫红色(RGB(255,0,255)),因为它是如此难看的颜色,没有人会使用它通常是一个图像.

负责这个的TransparentBlt功能函数(再次,类似于BitBlt,甚至用相同的模式命名).这一点的重要之处在于它允许您指定一个颜色键 - 即您希望它在绘制图像时将其视为透明的特定颜色.那是最后一个参数crTransparent.在您的情况下,您需要指定RGB(0,0,255).

如果你想获得真正看中的,你可以结合的效果TransparentBltAlphaBlend.基本上,您TransparentBlt首先要将图像绘制到临时设备上下文(DC)中,并将所有关键颜色视为透明,然后使用该AlphaBlend功能将该临时DC的内容与目标DC混合,无论透明效果如何你渴望.

但即使这是可能的,并且一旦你编写代码以使其工作,它有点酷,RED SOFT ADAIR仍然有一点,他说GDI不是为透明度而设计的.你不能比这里描述的简单透明效果更进一步,这当然不容易做到.

如果您需要使用透明度进行大量绘制,则可能需要切换到GDI + API.这些对透明度有更好的支持,它们实际上被设计为C++ API(尽管它们具有C回退),因此它们被构造成类,这使得它们更容易使用.

GDI +的唯一警告是它仅在Windows XP及更新版本上得到本机支持.如果您的客户端仍在运行Windows 2000或更早版本,则需要重新分发GDI + DLL(Gdiplus.dll)以便它们运行您的程序.现在这已成为越来越少的进入门槛,但它仍然值得考虑.