Как нарисовать полупрозрачный текст на графическом объекте? - PullRequest
2 голосов
/ 15 марта 2010

Я хочу нарисовать текст с 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)

Линия рисуется с прозрачностью, примененной правильно, но текст черный без прозрачности.

Edit:
Если я устанавливаю сплошной цвет в качестве фона для объекта Graphics, тогда прозрачность текста работает, но мне нужно, чтобы он был действительно прозрачным в результирующем png-файле, а не только прозрачным на фоне сплошного цвета фона в изображении. Эта проблема возникает также, если я установил частично прозрачный цвет в качестве фона, как это:

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

Я думал, что, возможно, SolidBrush не поддерживает прозрачность, но я нашел предопределенную кисть с именем Transparent (Brushes.Transparent), которая была SolidBrush, когда я смотрел на нее в отладке. Я пытался использовать Brushes.Transparent в качестве кисти при рисовании текста, и он вообще не показывался. Это означает, что я получаю полную прозрачность для работы, но не частичную прозрачность.

Ответы [ 2 ]

3 голосов
/ 15 марта 2010

Установите TextRenderingHint на SingBitPerPixel или SingleBitPerPixelGridFit:

lGraphic.TextRenderingHint = Drawing.Text.TextRenderingHint.SingleBitPerPixel
0 голосов
/ 15 марта 2010

Я много раз успешно следовал этому уроку:

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

Надеюсь, это поможет вам, я не уверен, что вы на самом деле имеете в виду под "32-битной прозрачностью", но я полагаю, что приведенная выше ссылка говорит вам, как можно настроить уровень прозрачности с помощью альфа-фильтра при создании кисти:

SolidBrush semiTransBrush2 = новый SolidBrush (Color.FromArgb (153, 0, 0,0));

...