我想在透明位图上绘制抗锯齿文本,并将抗锯齿绘制为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渲染文本(当然,这很容易没有抗锯齿)。
目前,我抓住表单后面的屏幕,绘制它,然后绘制我的文本。它看起来不错,但必须更新并且绘制缓慢。在桌面上完成绘图文本的任何其他想法也是受欢迎的。
答案 0 :(得分:15)
您的文本显示为原样,因为您启用了ClearType子像素消除锯齿模式(这是Vista及更高版本的默认设置)。根据定义,ClearType不能与alpha通道一起使用,因为它混合了颜色,因此不是与背景无关的。所以它忽略了alpha通道,并且混合为黑色(否则就是你的透明色)。您需要启用纯灰度消除锯齿以获得所需效果:
g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
答案 1 :(得分:2)
我不确定它是否真的有必要,但是如果你想进行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));
这样做你想要的,还是只是隐藏问题?