透明位图上的抗锯齿文本

ian*_*ano 9 c# gdi+ alphablending winforms

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

这是结果:

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

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

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

Pav*_*aev 16

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

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
Run Code Online (Sandbox Code Playgroud)