Alphablend功能

时间:2012-07-25 08:23:00

标签: c++ winapi gdi alphablending

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

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

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

3 个答案:

答案 0 :(得分:5)

  

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

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

此函数的关键是它的最后一个参数,即BLENDFUNCTION structure。文档有这样说:

  

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

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

  

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

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

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

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

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

如果您希望真正幻想,可以合并TransparentBltAlphaBlend的效果。基本上,您首先调用TransparentBlt将图像绘制到临时设备上下文(DC)中,并将所有关键颜色视为透明,然后使用AlphaBlend函数混合其中的内容使用您想要的任何透明效果,临时DC到目标DC。

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

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

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

答案 1 :(得分:1)

当您使用单独的alpha频道作为透明度数据时,会使用Alpha混合作为一项技术。

你在寻找什么可能是color keying,这意味着你使用某种特定的颜色作为transparent

答案 2 :(得分:1)

WinGdi函数本身无法实现Alphablending afaict。这可以使用像GDI +等新的API来完成。

可以在此处找到有关不同Windows grahic API的重要信息:

http://msdn.microsoft.com/en-us/library/windows/desktop/ee663279%28v=vs.85%29.aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ee417756%28v=vs.85%29.aspx

如果您只想透明绘图(指定颜色会导致透明度),您可以使用TransparentBlt