Рисование текста в .NET.

Я делаю несколько тестов по рисованию текста в .NET, и у меня были следующие результаты.

Drawing text example

  • Первая строка - это родная метка с FlatStyle, установленная на System
  • Вторая строка рисуется с помощью Graphics.DrawString() method
  • Последний разрисован с использованием метода TextRenderer.DrawText()

Во всех случаях используется шрифт 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