Я считаю, что проблема в том, что рендеринг текста с открытым текстом не работает, если фон прозрачный. Несколько возможных решений.
Вариант 1. Заполните фон вашего растрового изображения цветом.
Если вы сделаете это (как это делал Тим Робинсон выше в своем примере кода с использованием g.Clear (Color.Red)), clear type будет работать правильно. Но ваше растровое изображение не будет полностью прозрачным, что может быть неприемлемо. Если вы используете Graphics.MeasureText, вы можете заполнить только прямоугольник вокруг текста, если хотите.
Вариант 2. Установите TextRenderingHint = TextRenderingHintAntiAliasGridFit
Похоже, что это отключает очистку типа. Текст будет отображаться с более низким качеством, чем на прозрачном шрифте на фоне, но намного лучше, чем текст с беспроблемным шрифтом на фоне, который не создается.
Вариант 3. Заполните текстовый прямоугольник белым, нарисуйте текст, а затем найдите все нетекстовые пиксели и верните их обратно в прозрачные.
using (Bitmap bmp = new Bitmap(someWidth, someHeight))
{
using (Graphics g = Graphics.FromImage(bmp))
{
// figure out where our text will go
Point textPoint = new Point(someX, someY);
Size textSize = g.MeasureString(someText, someFont).ToSize();
Rectangle textRect = new Rectangle(textPoint, textSize);
// fill that rect with white
g.FillRectangle(Brushes.White, textRect);
// draw the text
g.DrawString(someText, someFont, Brushes.Black, textPoint);
// set any pure white pixels back to transparent
for (int x = textRect.Left; x <= textRect.Left + textRect.Width; x++)
{
for (int y = textRect.Top; y <= textRect.Top + textRect.Height; y++)
{
Color c = bmp.GetPixel(x, y);
if (c.A == 255 && c.R == 255 && c.G == 255 && c.B == 255)
{
bmp.SetPixel(x, y, Color.Transparent);
}
}
}
}
}
Я знаю, это ужасный взлом, но похоже, что он работает.