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