C# 在.NET中绘制文本

C# 在.NET中绘制文本,c#,.net,drawing,gdi+,drawstring,C#,.net,Drawing,Gdi+,Drawstring,我正在做一些关于在.Net中绘制文本的测试,结果如下 第一个字符串是本机标签,其FlatStyle设置为System 第二个字符串是使用方法绘制的 最后一个是使用方法绘制的 所有案例都使用默认的Windows Vista/7字体:Segoe UI,9 如您所见,第二个字符串与其他字符串之间存在差异(质量较低,反别名也不同)。我尝试在图形对象中配置反别名和平滑模式,但没有任何结果 是否可以使用gnGraphics.DrawString绘制文本,并获得与其他方法相同的质量 提前谢谢 编辑:我

我正在做一些关于在.Net中绘制文本的测试,结果如下

  • 第一个字符串是本机标签,其
    FlatStyle
    设置为
    System
  • 第二个字符串是使用方法绘制的
  • 最后一个是使用方法绘制的
所有案例都使用默认的Windows Vista/7字体:Segoe UI,9

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

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

提前谢谢


编辑:我已经用Reflector检查了代码。我意识到
Graphics.DrawString
使用gdiplus.dll调用方法GdipDrawString()和
textrender.DrawText
使用user32.dll调用
DrawTextExW
DrawTextExA


对此有何评论?

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

我测试了这个,效果很好,在我的表格上画了一个平滑的文本!;)这里是指向.

Graphics.DrawString方法的链接,它位于名称空间中,这意味着它在封面下使用GDI+,而不是GDI,而GDI正是
TextRenderer.DrawText
方法所使用的

在这种情况下,造成差异的具体原因似乎是抗锯齿。可以通过属性控制抗锯齿

graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;

我相信您也可以使用阿巴斯所示的方法,在每种字体的基础上禁用它。

除了其他建议之外,您还可以尝试使用基于八叉树的图像量化。 我把它用于普通的图片,而不是文字。 有一篇Microsoft文章对此进行了详细讨论,并提供了一个示例项目:

GDI+是微软第一次尝试呈现分辨率无关的文本。也是在.NET1.x中呈现文本的唯一方法。它因其质量问题而受到广泛批评,这激发了在.NET 2.0中引入TextRenderer和Application.SetCompatibleTextRenderingDefault()的灵感。它使用GDI绘制文本,有效地解决了这些问题。只能在高分辨率设备上使用Graphics.DrawString()。打印机

第二次尝试是WPF,它在模糊文本问题上也受到了很多抨击。在.NET4中解决

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

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

您是否在所有情况下都使用完全相同的字体?您只是缺少了
反别名
选项…在Windows XP上也有同样的问题。打开ClearType是导致问题的原因。(失去“边缘”,字体边缘变为“块状”。我不知道您是否可以在Windows 7中关闭ClearType。我使用了://“当用户启用clear type时,仅反别名有效。
g.TextRenderingHint=Drawing.Text.TextRenderingHint.AntiAliasGridFit
抱歉,但此答案不正确。请尝试使用具有相同字体和颜色的系统标签复制此示例,然后您将I’我会看到文本不是完全绘制的。-1.好的,有一点不同,但如果使用“TextRenderingHint.AntiAliasGridFit”,质量是相同的。我用标签复制了我的示例以检查结果!:)使用TextRenderingHint播放,测试了所有可能性,但没有得到有利的结果。