2010-03-15 94 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