是否可以使用 alphablend 功能使图像的某些部分透明?
我可以创建一个包含 RGB(0,0,255) 特定区域的图像吗,当我绘制该图像时,只有该区域应该是透明的。是否可以使用 AlphaBlend 函数。是的,那么如何?
我正在阅读有关 alphablend 的信息,但我仍然不清楚。我想我们需要在创建图像时指定 alphachannel 。如果特定像素没有 alphachannel,那么该像素不能透明?
最佳答案
是的, AlphaBlend
function 旨在绘制已经保存了 alpha channel 信息的图像。这些将是每像素 32 位 (bpp) 的图像,这意味着它们包含红色、绿色、蓝色和 Alpha channel 信息。您可以将 AlphaBlend
函数视为类似于 BitBlt
,除了它保留图像可能包含的任何透明或半透明像素。
这个函数的关键是它的最后一个参数,它是一个 BLENDFUNCTION
structure 。文档有这样的说法:
所以这意味着假设您的图像已经包含预乘的 alpha channel 。 AlphaBlend
函数在绘制图像时尊重这些值,但您可以通过为 SourceConstantAlpha
结构的 BLENDFUNCTION
成员指定 0 到 255 之间的值来调整其不透明度。如果将此值设置为 255,则仅使用位图的每像素 alpha 值。如果将其设置为 0,则假定您的图像是透明的。将其设置为介于两者之间的值将使您的图像以某种程度的半透明绘制。
我可以创建一个包含 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 和更新版本上得到 native 支持。如果您的客户端仍在运行 Windows 2000 或更早版本,则需要重新分发 GDI+ DLL ( Gdiplus.dll
) 以便它们运行您的程序。如今,这越来越不是进入的障碍,但它仍然值得考虑。
关于c++ - 字母混合函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11645532/