2009-08-17 3 views
8

Я хотел бы нарисовать сглаженный текст на прозрачном растровом изображении и получить сглаживание в виде альфа-смешанных пикселей. Таким образом, я могу нарисовать растровое изображение на любой цветной поверхности (или изображение, если на то пошло), и сглаживание все еще выглядит хорошо.Сглаженный текст на прозрачном растровом изображении

Вот упрощенный пример, показывающий проблему:

protected override void OnPaint(PaintEventArgs e) 
{ 
    base.OnPaint(e); 
    Bitmap bitmap = new Bitmap(this.Width, this.Height); 
    Graphics g = Graphics.FromImage(bitmap); 
    g.Clear(Color.Empty); 
    g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 
    e.Graphics.DrawImage(bitmap, new Point(0, 0)); 
} 

И вот результат:

alt text http://img194.imageshack.us/img194/9065/captureotd.png

Конечная цель заключается в использовании UpdateLayeredWindow нарисовать мой прозрачный альфа смешан окно. Я создаю приложение, подобное Conky, и я бы хотел использовать рендеринг ClearType для текста (это, конечно, легко без сглаживания).

В настоящее время я хватаю экран за формой, рисую это, а затем рисую текст. Он выглядит хорошо, но его нужно обновлять и медленно рисовать. Любые другие идеи для выполнения рисования текста на рабочем столе также приветствуются.

ответ

15

Ваш текст отображается так, как будто у вас включен режим сглаживания подпикселя ClearType (который по умолчанию используется для Vista и выше). ClearType, по определению, не может хорошо играть с альфа-каналом, поскольку он смешивает цвета и, следовательно, не является фоном-агностиком. Поэтому он игнорирует альфа-канал и смешивается с черным (в противном случае это ваш прозрачный цвет). Вам необходимо включить простое полутоновое сглаживание для получения желаемого эффекта:

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 
+0

Это сработало, спасибо! Это не совсем так, как ClearType, но даже шрифты, разработанные для ClearType (например, Consolas), все еще выглядят хорошо. – iano

+0

Любопытно, что для меня «AntiAliasGridFit» создает текст с нулевым сглаживанием. Однако «AntiAlias» работает. –

+0

'AntiAliasGridFit' может не делать сглаживания, если размер шрифта слишком мал. При таких размерах шрифта, «AntiAlias» дает уродливый результат в любом случае. –

1

Я не уверен, если это действительно необходимо, но если вы хотите сделать альфа-смешивание, вы должны указать 32-битное изображение:

Bitmap bitmap = new Bitmap(this.Width, this.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); 

Используя ваш пример, я был в состоянии сделать текст прилично выглядеть, добавив текст рендеринга подсказку:

g.Clear(Color.Empty); 
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias; 
g.DrawString("hello world", new Font(this.Font.FontFamily, 24), Brushes.Blue, new Point(50, 50)); 

Является ли это делать то, что вы хотите, или просто скрывает проблему?

+3

Если опустить '' Bitmap' в PixelFormat', по умолчанию 'Format32bppArgb' в любом случае. –