c# - 位图中的 TextRenderer.DrawText 与 OnPaintBackground

标签 c# textrenderer

如果我使用 TextRenderer.DrawText() 并使用 OnPaintBackground 中提供的 Graphics 对象,我的文本看起来很完美。如果我创建自己的 Bitmap 并使用从我的 Bitmap 获得的 Graphics 对象,我的文本看起来很糟糕。看起来它是使用黑色而不是位图的背景颜色来消除文本锯齿。如果我使用 Graphics.DrawString(),我可以避免这个问题,但这种方法有可怕的字距调整问题。我应该怎么办?如何使用位图的内容使 TextRenderer.DrawText() 正确消除锯齿?

看起来很糟糕:

Bitmap bmp = new Bitmap(100, 100, PixelFormat.Format32bppArgb);
using (Graphics g = Graphics.FromImage(bmp))
{
    g.Clear(Color.Red);
    TextFormatFlags tf = TextFormatFlags.Left;
    TextRenderer.DrawText(g, @"C:\Development\Testing\blag", font, clip, Color.White,
                          Color.Transparent, tf);
}

看起来不错,但我想将它渲染到位图上,而不是控件的表面:

protected override void OnPaintBackground(PaintEventArgs e)
{
    e.Graphics.Clear(Color.Red);
    TextFormatFlags tf = TextFormatFlags.Left;
    TextRenderer.DrawText(e.Graphics, @"C:\Development\Testing\blag", font, clip,
                          Color.White, Color.Transparent, tf);
}

有什么区别?

最佳答案

答案是不使用 TextRenderer。 TextRenderer 是文本呈现的 GDI(而非 GDI+)实现的包装器,它具有许多功能,但正如您所发现的那样,不能与内存中的 DC 很好地互操作。

使用 Graphics.DrawStringGraphics.MeasureString,但记得将它传递给 StringFormat.GenericTypographic 以获得准确的尺寸和定位。

最初引入 TextRenderer 的原因是 GDI+ 不支持 GDI 的 Uniscribe 引擎支持的所有复杂脚本。然而,随着时间的推移,GDI+ 对复杂脚本的支持得到了扩展,现在已经没有任何充分的理由使用 TextRenderer(它甚至不再是两者中更快的了,事实上它看起来恰恰相反)。

不过,实际上,除非您遇到严重的、可衡量的性能问题,否则请使用 Graphics.DrawString

关于c# - 位图中的 TextRenderer.DrawText 与 OnPaintBackground,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/849531/

相关文章:

c# - .Net (C#/VB.NET) 中泛型的使用示例

c# - 如何从 SHA-1 字节数组生成 Guid?

c# - .NET 的缓存服务器(例如 Memcached)

.net - TextRenderer.MeasureText 返回字符 "&"的 Width=0

wpf - 文字渲染仍然模糊 : Best font for WPF application?

c# - 自定义 EventHandler 与 EventHandler<EventArgs>

c# - 根据上下文源将 Serilog 日志过滤到不同的接收器?

c# - .Net Winforms 中 Graphics.DrawString 和 TextRenderingHint 的可能错误

.net - TextRenderer 不绘制长字符串