16

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

绘图文本示例

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

如您所见,第二个字符串与其他字符串之间存在差异(它的质量较低,并且抗锯齿不同)。我尝试在对象中配置抗锯齿和平滑模式Graphics,但没有任何结果。

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

提前致谢。


编辑:我已经用 Reflector 查看了代码。我意识到Graphics.DrawString使用gdiplus.dll调用方法 GdipDrawString() 并TextRenderer.DrawText使用user32.dll调用DrawTextExWDrawTextExA.

对此有何评论?

4

4 回答 4

14

GDI+ 是 Microsoft 首次尝试呈现与分辨率无关的文本。也是在 .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);
    }
}
于 2011-09-01T10:44:07.093 回答
12

以下代码来自 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));

我对此进行了测试,效果很好,在我的表单上绘制了平滑的文本!;) 这是文章的链接。

于 2011-09-01T09:28:12.693 回答
1

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

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

graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;

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

于 2011-09-01T09:29:50.150 回答
1

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

于 2011-09-01T09:34:37.687 回答