是否可以使用 alphablend 功能使图像的某些部分透明?
我可以创建一个包含 RGB(0,0,255) 的特定区域的图像,当我绘制该图像时,只有该区域应该是透明的。是否可以使用 AlphaBlend 函数。是的,那么如何?
我正在阅读有关 alphablend 的信息,但我仍然不清楚。我想我们需要在创建图像时指定 alphachannel。如果 alphachannel 不存在特定像素,那么该像素不能透明?
是否可以使用 alphablend 功能使图像的某些部分透明?
我可以创建一个包含 RGB(0,0,255) 的特定区域的图像,当我绘制该图像时,只有该区域应该是透明的。是否可以使用 AlphaBlend 函数。是的,那么如何?
我正在阅读有关 alphablend 的信息,但我仍然不清楚。我想我们需要在创建图像时指定 alphachannel。如果 alphachannel 不存在特定像素,那么该像素不能透明?
我想我们需要在创建图像时指定 alphachannel。如果 alphachannel 不存在特定像素,那么该像素不能透明?
是的,该AlphaBlend
功能旨在绘制已经保存了 Alpha 通道信息的图像。这些将是每像素 32 位 (bpp) 图像,这意味着它们包含红色、绿色、蓝色和 alpha 通道信息。您可以认为该AlphaBlend
函数类似于BitBlt
,除了它保留图像可能包含的任何透明或半透明像素。
这个函数的关键是它的最后一个参数,它是一个BLENDFUNCTION
结构体。文档有这样的说法:
ftn
[在] 源位图和目标位图的 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)
.
如果你想变得非常花哨,你可以结合 和 的TransparentBlt
效果AlphaBlend
。基本上,您TransparentBlt
首先调用将图像绘制到临时设备上下文 (DC) 中,并将所有关键颜色视为透明,然后使用该AlphaBlend
函数将该临时 DC 的内容混合到具有任何透明度效果的目标 DC你渴望。
但即使这是可能的,而且一旦你编写了代码让它工作就很酷,RED SOFT ADAIR仍然有道理,他说 GDI 不是为透明而设计的。除了这里描述的简单透明效果之外,你不能走得更远,而且这当然不容易做到。
如果您需要使用透明度进行大量绘图,您可能希望改用GDI+ API。这些对透明度有更好的支持,并且它们实际上被设计为 C++ API(尽管它们具有 C 回退),因此它们被结构化为类,这使得它们更容易使用。
对 GDI+ 的唯一警告是,它仅在 Windows XP 和更新版本上受本机支持。如果您的客户端仍在运行 Windows 2000 或更早版本,则需要重新分发 GDI+ DLL ( Gdiplus.dll
) 以便它们运行您的程序。如今,进入门槛越来越低,但仍然值得考虑。
当您有单独alpha
的通道作为透明度数据时,使用 Alpha 混合作为一种技术。
你在寻找什么可能color keying
意味着你使用某种特定的颜色作为一个颜色transparent
。
WinGdi 函数本身无法进行字母混合。这可以通过 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。