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