【发布时间】:2010-11-23 08:00:54
【问题描述】:
我已经使用 GDI+创建了一个位图。我正在使用 GDI Drawtext 在该位图上绘制文本。使用 Drawtext 我无法应用透明度。 任何帮助或代码将不胜感激。
【问题讨论】:
-
首选语言? C、C++、VB.net、C#??
-
首选纯 Windows API / C++
我已经使用 GDI+创建了一个位图。我正在使用 GDI Drawtext 在该位图上绘制文本。使用 Drawtext 我无法应用透明度。 任何帮助或代码将不胜感激。
【问题讨论】:
如果您想绘制没有背景填充的文本,SetBkMode(hdc,TRANSPARENT) 将告诉 GDI 在绘制文本时离开背景。
要实际使用 alpha 渲染文本的前景色...将会更加复杂。 GDI 实际上并没有在其 API 中广泛支持 alpha 通道。在AlphaBlend 之外,实际上它所做的只是保留频道。将 COLOREF 的高位设置为 alpha 值实际上是无效的,因为高字节实际上用于指示 COLOREF 是否(而不是 RGB 值)调色板条目。
因此,不幸的是,您唯一真正的前进方向是:
* 在执行 DrawText 之前简单地将 DIBSection 设置为 50% alpha 并确保 BKColor 为黑色可能就足够了。我不知道 DrawText 可能会对 alpha 通道做什么。需要进行一些实验。
【讨论】:
简单易行的解决方案:)
遇到这个问题,我尝试更改 alpha 值并进行预乘,但还有另一个问题 - 抗锯齿和 cleartype 字体未正确显示(丑陋的边缘)。所以我做了什么......
我想你明白了:)
【讨论】:
嗯 - 在这里尝试做同样的事情 - 想知道 - 我看到当你创建一个 dib 部分时,你指定了作为 R、G、B(和 alpha)掩码的“掩码”。
如果它确实不改变 alpha 通道,那是一个很大的问题,那么您可以为两个位图标题指定不同的掩码。一个在适当的位置指定 thr RGB,另一个使它们都将它们的位分配给 alpha 通道。 (在这种情况下将文本颜色设置为白色)然后分两次渲染,一次加载颜色值,另一次加载 alpha 值。
????无论如何只是在沉思:)
【讨论】:
虽然这个问题是关于使文本半透明的,但我遇到了相反的问题。
DrawText 是使我的分层窗口 (UpdateLayeredWindow) 中的文本半透明......我不希望它是。
看看另一个question ...因为在另一个问题中我发布了一些您可以轻松修改的代码...这几乎正是 Chris Becke 在他的回答中所建议的。
【讨论】:
针对特定情况的有限答案:
如果您有一个带有 Alpha 通道的图形,并且您想在局部不透明的背景上绘制不透明的文本,请首先准备您的 32 位位图和使用CreateDIBPatternBrushPt 创建的 32 位画笔。然后扫描反转 alpha 通道的位图位,像往常一样绘制文本(包括 SetBkMode 到 TRANSPARENT),然后再次反转位图中的 alpha。如果您反转画笔的 alpha,则可以跳过第一次反转。
【讨论】: