2010-03-15 6 views
2

Je souhaite dessiner un texte avec transparence 32 bits sur un objet graphique. Quand j'essaie, je n'obtiens que la couleur noire dans le résultat.Comment dessiner du texte semi-transparent sur un objet graphique?

Si j'essaie de tracer une ligne avec la même couleur semi-transparente, cela fonctionne parfaitement.

Je possède ce 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) 

La ligne est tracée avec la transparence appliquée correctement, mais le texte est noir sans transparence.

Edit:
Si je mets une couleur unie en arrière-plan sur l'objet Graphics, puis fonctionne la transparence du texte, mais je besoin pour être vraiment transparent dans le résultat Png, non seulement transparent sur un fond solide couleur dans l'image. Ce problème se produit également si je définir une couleur transparente partielle en arrière-plan comme celui-ci:

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

Je pensais peut-être que SolidBrush ne supporte pas la transparence, mais j'ai trouvé un pinceau prédéfini nommé transparent (Brushes.Transparent) qui a été un SolidBrush quand je l'ai regardé dans le débogage. J'ai essayé d'utiliser Brushes.Transparent comme le pinceau lors du dessin du texte, et il a été montré avec succès pas du tout. Cela signifie que j'obtiens une transparence totale pour travailler, mais pas une transparence partielle.

Répondre

3

Réglez le TextRenderingHint soit SingBitPerPixel ou SingleBitPerPixelGridFit:

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

Merci beaucoup de me faire prendre conscience de ce réglage! J'ai utilisé 'TextRenderingHint.AntiAlias' à la place. Ensuite, j'obtiens un résultat parfait avec un antialiasing semi-transparent! – awe

0

J'ai suivi ce tutoriel plusieurs fois toujours avec succès:

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

espérons qu'il vous aidera, je ne suis pas sûr de ce que vous voulez vraiment dire avec « 32 bits TRANSPARENCE » mais je crois que le lien ci-dessus vous indique comment il est possible de régler le niveau de transparance avec le filtre alpha lorsque vous créez la brosse:

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

+0

Il est seulement un problème lorsque l'arrière-plan de l'objet graphique est transparent. Si l'arrière-plan a une couleur non transparente, la transparence du texte fonctionne. Je vais mettre à jour mon message pour clarifier cela. – awe

Questions connexes