【问题标题】:How to draw semi-transparent text on a graphics object?如何在图形对象上绘制半透明文本?
【发布时间】:2011-01-27 16:17:06
【问题描述】:

我想在图形对象上绘制具有 32 位透明度的文本。当我尝试时,结果中只有黑色。

如果我尝试用相同的半透明颜色画一条线,效果很好。

我有这个代码:

lBitmap As New Bitmap(32, 32, PixelFormat.Format32bppArgb)
lGraphic As Graphics = Graphics.FromImage(lBitmap)

lGraphic.SmoothingMode = SmoothingMode.HighQuality
lGraphic.InterpolationMode = InterpolationMode.HighQualityBicubic

lGraphic.Clear(Color.Transparent)

Dim lTestTransparencyColor As Color = Color.FromArgb(100, 140, 0, 230)
lGraphic.DrawLine(New Pen(lTestTransparencyColor), 0, 0, 32, 32)

lBrush As New SolidBrush(lTestTransparencyColor)
lGraphic.DrawString("A", New Font("Arial", 12), lBrush, 0, 0)

Dim lImage As Image = lBitmap
lImage.Save("D:\Test.png", Imaging.ImageFormat.Png)

在正确应用透明度的情况下绘制线条,但文本是黑色且没有透明度。

编辑:
如果我在 Graphics 对象上将纯色设置为背景,则文本透明度有效,但我需要它在结果 png 文件中真正透明,而不仅仅是对图像中的纯色背景色透明。 如果我将部分透明颜色设置为这样的背景,也会出现此问题:

lGraphic.Clear(Color.FromArgb(100, 0, 255, 0))

我在想可能是 SolidBrush 不支持透明度,但我在调试时发现了一个名为透明 (Brushes.Transparent) 的预定义画笔,它是 SolidBrush。我在绘制文字时尝试使用Brushes.Transparent作为画笔,结果完全不显示。这意味着我可以完全透明地工作,而不是部分透明。

【问题讨论】:

    标签: .net vb.net graphics text transparency


    【解决方案1】:

    TextRenderingHint 设置为SingBitPerPixelSingleBitPerPixelGridFit

    lGraphic.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixel
    

    【讨论】:

    • 非常感谢您让我了解此设置!我改用TextRenderingHint.AntiAlias。然后我通过半透明抗锯齿得到完美的结果!
    【解决方案2】:

    我按照这个教程学习了很多次,总是成功的:

    http://www.codeproject.com/KB/GDI-plus/watermark.aspx

    希望它对您有所帮助,我不确定您对“32 位透明度”的真正含义,但我相信上面的链接告诉您如何在创建画笔时使用 alpha 过滤器调整透明度级别:

    SolidBrush semiTransBrush2 = 新的 SolidBrush(Color.FromArgb(153, 0, 0,0));

    【讨论】:

    • 只有图形对象的背景是透明的时候才有问题。如果背景具有不透明的颜色,则文本透明度有效。我将更新我的帖子以澄清这一点。
    猜你喜欢
    • 1970-01-01
    • 2016-05-25
    • 2017-09-22
    • 2012-06-20
    • 2012-01-16
    • 1970-01-01
    • 2021-04-10
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多