2010-03-15 79 views
2

我想在图形对象上绘制一个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) 

绘制直线与正确应用的透明度,但文字是黑色的,没有透明度。

编辑:
如果我定了坚实的颜色作为图形背景对象,则文本透明度的工作,但我需要它在结果真正透明的PNG文件,而不仅仅是对一个坚实的背景透明图像中的颜色。

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

我想这可能是因为SolidBrush不支持透明度,但我发现的预定义刷名为透明(Brushes.Transparent),这是:如果我设置一个局部透明的颜色作为背景这样也会发生 此问题一个SolidBrush当我在调试中看到它。在绘制文字时,我尝试使用Brushes.Transparent作为画笔,并且它完全没有显示出来。这意味着我的工作完全透明,但不是部分透明。

回答

3

设置TextRenderingHint要么SingBitPerPixelSingleBitPerPixelGridFit

lGraphic.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixel 
+0

非常感谢让我意识到这个设置!我用'TextRenderingHint.AntiAlias'代替。然后我用半透明抗锯齿得到完美的结果! – awe 2010-03-15 14:09:33

0

我按照这个教程总是多次成功:

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

希望它可以帮助你,我不知道你有“32位transparancy”说的是真的,但我相信上面的链接告诉您如何在创建画笔时使用alpha过滤器调整透明度级别:

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

+0

它是只有一个问题,当所述图形的背景对象是透明的。如果背景具有不透明的颜色,则文字透明度起作用。我会更新我的帖子来澄清这一点。 – awe 2010-03-15 13:06:27

相关问题