1

我将描述我的总体目标,以防我提出的问题不是获得我正在寻找的答案的最佳形式。我有一个围绕 X 轴旋转的词球或“词球”。随着单词向后旋转(Z 坐标从 -1 到 1,从前到后),我打算更改每个单词的大小和不透明度,以便“前面”中的单词是 100% 不透明和全尺寸的,而单词背面较小且有些透明。我宁愿使用直接的 Delphi 代码来执行此操作,并避免使用 Direct3D 等。我已经让旋转代码工作正常。我只需要实现我的基于 Z 坐标的感知着色想法。

当我创建单词球时,我会为每个单词动态创建一个 TImage 组件。我使用 TCanvas.TextOut() 方法以居中的方式将单词“打印”到 TImage 位图。我打算使用 BitBlt 将该位图复制到包含单词球的主 Canvas 中的正确位置,因为 BitBlt 速度很快并且可以即时调整位图的大小,满足我的感知着色操作的要求之一。

但我不知道促进 Alpha 混合的最佳方法。我知道 Windows 有 AlphaBlend() 调用,而且使用起来相当简单。但我需要知道如何创建一个位图,它是具有 alpha 通道的每字 TImage 组件的副本。请注意,在我的情况下,整个位图将具有统一的 alpha 通道值,因为我希望根据 Z 坐标将不透明度统一应用于整个单词。

使用 TCanvas.TextOut() 制作的位图动态创建的 TImage 组件是否具有 Alpha 通道?如果没有,我如何创建一个,或者实时创建一个 TImage 位图的副本,该位图确实有一个要传递给 AlphaBlend() 调用的 Alpha 通道?如果有更好的方法来完成这一切,请告诉我。

4

2 回答 2

2

文档说:

BLENDFUNCTION 的 SourceConstantaAlpha 成员指定要在整个源位图上使用的 alpha 透明度值。SourceConstantaAlpha 值与任何每个像素的 alpha 值组合。如果 SourceConstantaAlpha 为 0,则假定图像是透明的。当您只想使用每像素 Alpha 值时,将 SourceConstantaAlpha 值设置为 255(这表示图像是不透明的)。

因此,如果您只想要整个图像恒定的透明度,我想您的图像不必采用任何特殊格式。

另一方面,我认为这不是你想要的。想象一下一个矩形区域的文本与另一个区域重叠:尽管矩形的某些部分可能没有文本,但它们仍会以半透明的白色或任何你有的作为背景、颜色的方式绘制。

于 2010-10-07T15:41:58.077 回答
1

我发现这个链接给出了如何在 Delphi 6 中进行 Alpha 混合的可靠示例,现在我可以使用它了:

http://www.delphi-central.com/tutorials/AlphaBlend.aspx

它非常接近于使用 BitBlt() 或 StretchBlt() 参数方式,除了最后一个参数是 alpha 混合结构并且非常容易理解。将其与上面“他自己”的评论结合起来,您就拥有了进行 Alpha 混合所需的一切。

于 2010-10-07T18:11:56.990 回答