在.NET中绘制文本

时间:2011-09-01 09:11:23

标签: c# .net drawing gdi+ drawstring

我正在做一些关于在.Net中绘制文本的测试,我得到了以下结果。

Drawing text example

所有案例都使用默认的Windows Vista / 7字体:Segoe UI,9

正如您所看到的,第二个字符串与其他字符串之间存在差异(质量较差,反别名不同)。我试图在Graphics对象中配置反别名和平滑模式,没有任何结果。

是否可以绘制文本Graphics.DrawString并获得与其他方法相同的质量?

提前致谢。


编辑:我已经使用Reflector审核了代码。我意识到Graphics.DrawString使用 gdiplus.dll 调用方法GdipDrawString()而TextRenderer.DrawText使用 user32.dll 调用DrawTextExW和{{ 1}}。

有关它的任何评论吗?

4 个答案:

答案 0 :(得分:14)

GDI +是微软首次尝试渲染分辨率独立文本。并且是在.NET 1.x中呈现文本的唯一方法。它因质量问题而被广泛宣传,鼓励在.NET 2.0中引入TextRenderer和Application.SetCompatibleTextRenderingDefault()。它使用GDI绘制文本,有效地解决问题。您应该只在高分辨率设备上使用Graphics.DrawString()。打印机。

Fwiw,第二次尝试是WPF,它也有很多模糊文本问题。解决了.NET 4。

尝试使用此示例表单查看最严重的问题之一:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
    }
    protected override void OnPaint(PaintEventArgs e) {
        e.Graphics.DrawString("Hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii", 
            this.Font, Brushes.Black, 0, 0);
    }
}

答案 1 :(得分:11)

以下代码来自MSDN上的示例:

var fontFamily = new FontFamily("Times New Roman");
var font = new Font(fontFamily, 32, FontStyle.Regular, GraphicsUnit.Pixel);
var solidBrush = new SolidBrush(Color.FromArgb(255, 0, 0, 255));

e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
e.Graphics.DrawString("Your Text Here", font, solidBrush, new PointF(10, 60));

我对此进行了测试并且工作正常,在我的表单上绘制了一个流畅的文字! ;)这是article的链接。

答案 2 :(得分:1)

Graphics.DrawString方法驻留在System.Drawing命名空间中,这意味着它使用GDI +而不是GDI,这是TextRenderer.DrawText方法正在使用的方式。

在这种情况下看起来差异的具体原因是抗锯齿。您可以通过Graphics.TextRenderingHint属性控制抗锯齿。

graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;

我相信您也可以使用Abbas显示的方法在每个字体的基础上禁用它。

答案 3 :(得分:1)

除了在您的情况下可能更正确的其他建议之外,您还可以尝试使用基于八叉树的图像量化。 我将它用于普通图片,而不是用于文本。 有一篇微软文章详细讨论了这个问题,并有一个示例项目: http://msdn.microsoft.com/en-us/library/aa479306.aspx