Delphi 6:如何使用TextOut创建具有Alpha通道的位图?

Delphi 6:如何使用TextOut创建具有Alpha通道的位图?,delphi,transparency,opacity,alphablending,timage,Delphi,Transparency,Opacity,Alphablending,Timage,我会描述我的总体目标,以防我问的问题不是我想要的答案的最佳形式。我有一个单词球体或“单词球”,绕X轴旋转。当单词旋转到后面时(Z坐标从-1到1,从前到后),我打算改变每个单词的大小和不透明度,以便“前面”的单词100%不透明,大小完整,后面的单词更小,并且有点透明。我更喜欢用直接的Delphi代码来做这件事,避免像Direct3D之类的东西。我已经有了旋转代码可以很好地工作了。我只需要实现基于Z坐标的感知着色想法 当我创建单词ball时,我会为每个单词动态创建一个TImage组件。我使用TCan

我会描述我的总体目标,以防我问的问题不是我想要的答案的最佳形式。我有一个单词球体或“单词球”,绕X轴旋转。当单词旋转到后面时(Z坐标从-1到1,从前到后),我打算改变每个单词的大小和不透明度,以便“前面”的单词100%不透明,大小完整,后面的单词更小,并且有点透明。我更喜欢用直接的Delphi代码来做这件事,避免像Direct3D之类的东西。我已经有了旋转代码可以很好地工作了。我只需要实现基于Z坐标的感知着色想法

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

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

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

报告说:

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

所以我想,如果你只想让整个图像保持恒定的透明度,你的图像不需要任何特殊的格式


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

我发现了这个链接,它提供了一个在Delphi 6中如何进行Alpha混合的坚实示例,现在我已经可以使用它了:

除了最后一个参数是alpha混合结构并且非常容易理解之外,它非常接近于使用BitBlt()或StretchBlt()参数。结合上面“他自己”的评论,你就有了所有你需要做的阿尔法混合