2011-09-01 75 views
14

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

Drawing text example

所有情况下都使用默认的Windows Vista/7字体:Segoe UI,9

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

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

在此先感谢。


编辑:我已审查与反射器的代码。我意识到Graphics.DrawString使用gdiplus.dll调用方法GdipDrawString()和TextRenderer.DrawText使用user32.dll调用DrawTextExWDrawTextExA

对此有何评论?

+0

你在所有的情况下都使用完全相同的字体? – Tigran

+0

@Tigran:是的,看我的编辑 –

+0

你只是缺少'AntiAlias'选项... – balexandre

回答

13

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); 
    } 
} 
10

下面的代码来自一个例子在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的链接。

+0

对不起,但是这个答案不正确,请尝试使用与字体和颜色相同的系统标签来重现该示例,并且您会看到文本-1, –

+1

好吧,有一个MINOR差异,但如果你使用“TextRenderingHint.AntiAliasGridFit”,质量是相等的。我复制我的例子与标签检查结果!:) – Abbas

+1

嗯,它的工作为了我。谢谢一堆! :) –

1

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

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

graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit; 

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

+1

使用TextRenderingHint,测试了所有的可能性,没有有利的结果。 –

1

除了其他的建议,这可能是更正确的你的情况下,你也可以尝试使用基于八叉树的量化图像。 我用它来拍摄普通照片,而不是文字。 有,在详细谈论这一点,并有一个例子项目Microsoft文章:在渲染分辨率无关的文字 http://msdn.microsoft.com/en-us/library/aa479306.aspx