我想我们需要在创建图像时指定 alphachannel。如果某个特定像素没有 alphachannel,那么该像素就不能透明?
是的,AlphaBlend function 旨在绘制已经保存了 Alpha 通道信息的图像。这些将是每像素 32 位 (bpp) 图像,这意味着它们包含红色、绿色、蓝色和 alpha 通道信息。您可以认为AlphaBlend 函数类似于BitBlt,只是它保留了图像可能包含的任何透明或半透明像素。
这个函数的关键是它的最后一个参数,它是BLENDFUNCTION structure。文档有这样的说法:
ftn [in] 源位图和目标位图的 alpha 混合函数、应用于整个源位图的全局 alpha 值以及源位图的格式信息。源和目标混合功能目前仅限于AC_SRC_OVER。
这意味着您的图像被假定已经包含一个预乘的 Alpha 通道。 AlphaBlend 函数在绘制图像时会考虑这些值,但您可以通过为BLENDFUNCTION 结构的SourceConstantAlpha 成员指定一个介于 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)。
如果你想真正看中,你可以结合TransparentBlt和AlphaBlend的效果。基本上,您首先调用 TransparentBlt 将图像绘制到临时设备上下文 (DC) 中,并将所有关键颜色视为透明,然后使用 AlphaBlend 函数将该临时 DC 的内容混合到用你想要的任何透明效果瞄准 DC。
但即使这是可能的,而且一旦你编写代码让它工作就很酷,RED SOFT ADAIR 仍然有道理,他说 GDI 不是为透明而设计的。除了这里描述的简单透明效果之外,您不能走得更远,而且确实不容易做到。
如果您需要使用透明度进行大量绘图,您可能希望改用GDI+ APIs。它们对透明度有更好的支持,而且它们实际上被设计为 C++ API(尽管它们有 C 回退),因此它们被结构化为类,这使得它们更易于使用。
对 GDI+ 的唯一警告是它仅在 Windows XP 和更新版本上受原生支持。如果您的客户端仍在运行 Windows 2000 或更早版本,您将需要重新分发 GDI+ DLL (Gdiplus.dll) 以便它们运行您的程序。现在进入门槛越来越低,但仍然值得考虑。