9

我想在透明位图上绘制抗锯齿文本,并将抗锯齿绘制为 alpha 混合像素。这样,我可以将位图绘制到任何颜色表面(或图像,就此而言),并且抗锯齿看起来仍然很好。

这是一个显示问题的简化示例:

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));
}

结果如下:

替代文字

这样做的最终目标是使用 UpdateLayeredWindow 来绘制我的透明 alpha 混合窗口。我正在创建一个类似 Conky 的应用程序,我希望能够对文本使用 ClearType 渲染(当然,这很容易,无需抗锯齿)。

目前,我抓住表单后面的屏幕,绘制它,然后绘制我的文本。它看起来不错,但必须更新并且绘制速度很慢。任何其他在桌面上完成绘图文本的想法也将受到欢迎。

4

2 回答 2

16

您的文本会按原样显示,因为您启用了 ClearType 亚像素抗锯齿模式(这是 Vista 及更高版本的默认设置)。根据定义,ClearType 不能很好地与 alpha 通道配合使用,因为它混合了颜色,因此与背景无关。所以它忽略了 alpha 通道,并混合为黑色(否则就是你的透明颜色)。您需要启用纯灰度抗锯齿以获得所需的效果:

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
于 2009-08-18T00:22:53.393 回答
3

我不确定它是否真的有必要,但如果你想做 alpha 混合,你应该指定一个 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));

这是在做你想做的事,还是只是隐藏问题?

于 2009-08-18T00:12:29.173 回答