我使用GDI +创建了一个位图。我正在使用GDI Drawtext将文本绘制到该位图。使用Drawtext我无法应用透明度。 任何帮助或代码将不胜感激。
答案 0 :(得分:13)
如果你想在没有背景填充的情况下绘制文字,SetBkMode(hdc,TRANSPARENT)
会告诉GDI在绘制文字时留下背景。
用alpha实际渲染文本的前景颜色会变得更复杂。 GDI实际上并不支持其API中广泛使用的alpha通道。在AlphaBlend之外,实际上所做的只是保留频道。它实际上无效将COLOREF的高位设置为alpha值,因为高字节实际上用于标志以指示COLOREF是否(而不是RGB值)调色板条目。
所以,不幸的是,你唯一真正的前进方向是:
* 在进行DrawText之前,简单地用50%alpha设置DIBSection可能就足够了,并确保BKColor是黑色的。我不知道DrawText可能会对alpha通道做什么。需要进行一些实验。
答案 1 :(得分:8)
简单易用的解决方案:)
有这个问题,我试图改变alpha值并预乘,但还有另一个问题 - 抗锯齿和cleartype字体没有正确显示(丑陋的边缘)。所以我做了...
我想你明白了:)
答案 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通道的位图位,像往常一样绘制文本(包括SetBkMode
到TRANSPARENT
),然后再次反转位图中的alpha。如果反转画笔的alpha,则可以跳过第一次反转。