透明位图上的抗锯齿文本

问题描述 投票:9回答:2

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

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

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

c# winforms gdi+ alphablending
2个回答
16
投票

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

g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;

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

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

© www.soinside.com 2019 - 2024. All rights reserved.