透明位图上的抗锯齿文本

我想在透明位图上绘制抗锯齿文本,并将抗锯齿绘制为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)); } 

这是结果:

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

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

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

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

 g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit; 

我不确定它是否真的有必要,但是如果你想进行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)); 

这样做你想要的,还是只是隐藏问题?