在.NET中绘制文本
我正在做一些关于在.Net中绘制文本的测试,我得到了以下结果。
- 第一个字符串是本机Label,
FlatStyle
设置为System
- 第二个字符串使用
Graphics.DrawString()
方法绘制 - 最后一个是使用
TextRenderer.DrawText()
方法绘制的
所有情况都使用默认的Windows Vista / 7字体:Segoe UI,9
如您所见,第二个字符串与其他字符串之间存在差异(质量较低,反别名不同)。 我试图在Graphics
对象中配置反别名和平滑模式,没有任何结果。
是否可以绘制文本使用Graphics.DrawString
并获得与其他方法相同的质量?
提前致谢。
编辑:我已经使用Reflector审查了代码。 我意识到Graphics.DrawString
使用gdiplus.dll调用方法GdipDrawString()和TextRenderer.DrawText
使用user32.dll调用DrawTextExW
和DrawTextExA
。
有什么评论吗?
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); } }
以下代码来自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
方法驻留在System.Drawing
命名空间中,这意味着它使用GDI +而不是GDI,这是TextRenderer.DrawText
方法正在使用的。
在这种情况下看起来差异的具体原因是抗锯齿。 您可以通过Graphics.TextRenderingHint
属性控制消除锯齿。
graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
我相信你也可以使用Abbas显示的方法在每个字体的基础上禁用它。
除了在您的情况下可能更正确的其他建议之外,您还可以尝试使用基于八叉树的图像量化。 我将它用于普通图片,而不是用于文本。 有一篇微软文章详细讨论了这个问题,并有一个示例项目: http : //msdn.microsoft.com/en-us/library/aa479306.aspx