Рисование текста в .NET.
Я делаю несколько тестов по рисованию текста в .NET, и у меня были следующие результаты.
![Drawing text example]()
Во всех случаях используется шрифт Windows Vista/7 по умолчанию: Segoe UI, 9
Как вы можете видеть, есть разница между второй строкой и другими (она имеет меньшее качество, а также алиас отличается). Я попытался настроить анти-псевдоним и режим сглаживания в объекте Graphics
без каких-либо результатов.
Можно ли рисовать текст usign Graphics.DrawString
и получать то же качество, что и другие методы?
Спасибо заранее.
EDIT: Я просмотрел код с помощью Reflector. Я понял, что Graphics.DrawString
использует метод вызова gdiplus.dll GdipDrawString() и TextRenderer.DrawText
использует user32.dll вызов DrawTextExW
и DrawTextExA
.
Любые комментарии об этом?
Ответы
Ответ 1
GDI + была первой попыткой Microsoft рендерить независимый текст. И единственный способ визуализации текста в .NET 1.x. Он широко обсуждался по вопросам качества, вдохновляя внедрение TextRenderer и Application.SetCompatibleTextRenderingDefault() в .NET 2.0. Он использует 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);
}
}
Ответ 2
Следующий код приведен в примере на 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));
Я тестировал это, и он работал нормально, гладкий текст был нарисован на моей форме!;) Здесь ссылка на статью .
Ответ 3
Метод Graphics.DrawString
находится в пространстве имен System.Drawing
, что означает, что он использует GDI + под обложками вместо GDI, что и есть используется метод TextRenderer.DrawText
.
Похоже, что конкретная причина разницы в этом случае - сглаживание. Вы можете управлять сглаживанием с помощью свойства Graphics.TextRenderingHint
.
graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;
Я считаю, что вы также можете отключить его на основе шрифта, используя метод, показанный Аббасом.
Ответ 4
Помимо других предложений, которые, вероятно, более правильны в вашем случае, вы также можете попытаться использовать квантование изображения на основе Octree.
Я использую его для обычных изображений, а не для текста.
Существует статья Microsoft, в которой подробно рассказывается об этом и есть пример проекта:
http://msdn.microsoft.com/en-us/library/aa479306.aspx