【问题标题】:Antialiased text on transparent bitmap透明位图上的抗锯齿文本
【发布时间】:2010-11-20 10:26:59
【问题描述】:

我想在透明位图上绘制抗锯齿文本,并将抗锯齿绘制为 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 渲染(当然,这很容易,无需抗锯齿)。

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

【问题讨论】:

    标签: c# winforms gdi+ alphablending


    【解决方案1】:

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

    g.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
    

    【讨论】:

    • 这很好,谢谢!它不如 ClearType 漂亮,但即使是为 ClearType(例如 Consolas)设计的字体也看起来不错。
    • 奇怪的是,对我来说AntiAliasGridFit 生成的文本具有零抗锯齿。但是,AntiAlias 有效。
    • AntiAliasGridFit 如果字体太小,可能不会进行抗锯齿处理。在这样的字体大小下,AntiAlias 无论如何都会给出丑陋的结果。
    【解决方案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));
    

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

    【讨论】:

    • 如果你省略了BitmapPixelFormat,它默认为Format32bppArgb
    • 神秘的是你的代码TextRenderingHint.AntiAlias 而不是TextRenderingHint.AntiAliasGridFit就像一个魅力!谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2019-07-10
    相关资源
    最近更新 更多