GDI中文本的透明度

时间:2009-08-27 10:25:42

标签: winapi gdi

我使用GDI +创建了一个位图。我正在使用GDI Drawtext将文本绘制到该位图。使用Drawtext我无法应用透明度。                   任何帮助或代码将不胜感激。

5 个答案:

答案 0 :(得分:13)

如果你想在没有背景填充的情况下绘制文字,SetBkMode(hdc,TRANSPARENT)会告诉GDI在绘制文字时留下背景。


用alpha实际渲染文本的前景颜色会变得更复杂。 GDI实际上并不支持其API中广泛使用的alpha通道。在AlphaBlend之外,实际上所做的只是保留频道。它实际上无效将COLOREF的高位设置为alpha值,因为高字节实际上用于标志以指示COLOREF是否(而不是RGB值)调色板条目。

所以,不幸的是,你唯一真正的前进方向是:

  1. 创建一个32位的DIBSection。 (CreateDIBSection)。这为您提供了一个HBITMAP,保证能够保存alpha信息。如果你通过其他位图创建函数之一创建一个位图,它将在设备colordepth可能不是32bpp。
  2. DrawText到DIBSection。
  3. 当您创建DIBSection时,您获得了指向实际内存的指针。此时,您需要浏览内存并设置alpha值。我认为DrawText根本不会对alpha通道做任何事情。我想简单检查位图的每个DWORD的RGB组件 - 如果它们是forground颜色,用alpha字节中的50%(或其他)alpha重写DWORD,如果它们是背景颜色,则用100%重写alpha字节中的alpha。 *
  4. AlphaBlend将位图放到最终目的地。 AlphaBlend要求源中的Alpha通道预先倍增。
  5. *  在进行DrawText之前,简单地用50%alpha设置DIBSection可能就足够了,并确保BKColor是黑色的。我不知道DrawText可能会对alpha通道做什么。需要进行一些实验。

答案 1 :(得分:8)

简单易用的解决方案:)

有这个问题,我试图改变alpha值并预乘,但还有另一个问题 - 抗锯齿和cleartype字体没有正确显示(丑陋的边缘)。所以我做了...

  1. 撰写场景(位图,图形等)
  2. BitBlt需要来自此场景的矩形(与文本矩形相同,从您希望文本所在的位置)到内存DC,并在0,0目标坐标处选择兼容位图
  3. 将文字绘制到内存DC中的那个矩形。
  4. 现在AlphaBlend BLENDFUNCTION中没有AC_SRC_ALPHA的矩形,并且从此内存DC中获取所需的SourceConstantAlpha回到场景DC。
  5. 我想你明白了:)

答案 2 :(得分:0)

嗯 - 尝试在这里做同样的事 - 想知道 - 我看到当你创建一个dib部分时,你会指定“面具”,即R,G,B(和alpha)面具。

IF如果它确实不会改变alpha通道,那么你可以为两个位图标题指定不同的掩码。 ONe在适当的位置指定thr RGB,另一个使它们都将其位分配给alpha通道。 (在这种情况下将文本颜色设置为白色)然后渲染两次,一次加载颜色值,另一次加载alpha值。

????无论如何只是沉思:)

答案 3 :(得分:0)

虽然这个问题是关于使文本半透明,但我遇到了相反的问题。

DrawText 使我的分层窗口(UpdateLayeredWindow)中的文本变得半透明......我不想让它成为。

看看这个其他的question ...因为在另一个问题中我发布了一些你可以轻易修改的代码......而且几乎正是Chris Becke在答案中所建议的。

答案 4 :(得分:0)

针对特定情况的有限答案:

如果您有一个带有Alpha通道的图形,并且您想在局部不透明的背景上绘制不透明文本,请首先使用CreateDIBPatternBrushPt创建的32位画笔准备32位图。然后扫描反转alpha通道的位图位,像往常一样绘制文本(包括SetBkModeTRANSPARENT),然后再次反转位图中的alpha。如果反转画笔的alpha,则可以跳过第一次反转。