我有一个 Delphi 6 应用程序,其中我有一个 TBitmaps 数组,每个包含一个图像(子图像),该图像是通过使用 clWhite 调用 FillRect() 以用白色填充 TBitmap 的 Canvas 来创建的,然后调用 toTextOut()将一些文本打印到位图的画布上。
我有一个计时器,它更新属于 TImage 组件的主 Canvas,每个 Interval 都使用数组的内容来反映每个子图像 X、Y 坐标因为它们在运动中所做的更改。首先,我使用带有 clWhite 的 FillRect() 来用白色填充主 Canvas。要“打印”子图像,我只需迭代数组并调用 Alphablend() 将每个子图像“打印”到主画布上。每个子图像都有一个 Z 坐标,用于控制不透明度的级别。Z 坐标较高的子图像具有较低的 Alphablend() 值,以使它们看起来比“近距离”的子图像更透明。
alpha 混合对每个单独的子图像都非常有效,具有较高坐标的子图像确实看起来比具有较低 Z 坐标的子图像更透明。但是,我遇到了在 Z 空间中重叠的子图像的问题。重叠子图像之间的 Alpha 混合似乎不起作用。相反,重叠子图像“后面”的子图像被属于覆盖它的图像的白色背景遮挡。我想要的是两个子图像正确重叠,所以看起来两个文本字符串写在彼此之上。相反,我看到前面的文本字符串和包含它的 TBitmap 画布的白色背景无处不在,消除了它“后面”的文本字符串。
谁能告诉我为什么 alpha 混合在每个单独的子图像和主 Canvas 之间起作用,而不是在子图像之间起作用?我只在时间上下文中说子图像之间而不是作为对象,因为它们在打印时都应该成为主画布的一部分,我希望 alpha-blend 能够正确地混合它们,这不会发生。
就好像子图像之间的“白色”没有被视为与子图像和属于主画布的“白色”之间的“白色”一样。
跟进:针对 Andreas 的评论,我将所有子图像 TBitmap 的 PixelFormat 设置为 pf32bit。现在 alpha 混合发生在子图像“之间”。不幸的是,子图像的白色区域没有被视为透明颜色。相反,顶部子图像的白色背景与属于底层子图像的文本进行 alpha 混合,在顶部子图像周围创建一个浅灰色框架,就好像它被涂抹一样。为了获得我想要的效果,我需要完全忽略子图像的白色背景。