views:

314

answers:

2

I want to draw a text with 32 bit transparency on a graphics object. When I try, I only get black color in the result.

If I try to draw a line with the same semitransparent color, it works perfectly.

I have this code:

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)

The line is drawn with the transparency applied correctly, but the text is black with no transparency.

Edit:
If I set a solid color as background on the Graphics object, then the text transparency works, but I need it to be truly transparent in the result png file, not just transparent against a solid background color in the image. This problem occurs also if I set a partial transparent color as background like this:

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

I was thinking it may be that SolidBrush does not support transparency, but I found a predefined brush named Transparent (Brushes.Transparent) that was a SolidBrush when I looked at it in debug. I tried to use Brushes.Transparent as the brush when drawing the text, and it was successfully not showing at all. That means I get full transparency to work, but not partial transparency.

A: 

I have followed this tutorial many times always with success:

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

Hope it helps you, I'm not sure what you mean really with "32 bit transparancy" but I believe the above link tells you how it is possible to adjust the transparancy level with the alpha filter when you create the brush:

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

bgs264
It is only a problem when the background of the graphics object is transparent. If the background has a non-transparent color, the text transparency works. I will update my post to clarify this.
awe
+2  A: 

Set the TextRenderingHint to either SingBitPerPixel or SingleBitPerPixelGridFit:

lGraphic.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixel
Chris Haas
Thanks a lot for making me aware of this setting! I used `TextRenderingHint.AntiAlias` instead. Then I get perfect result with semi-transparent antialiasing!
awe