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

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

16 голосов
/ 01 сентября 2011

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

Drawing text example

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

Во всех случаях используется шрифт Windows Vista / 7 по умолчанию: пользовательский интерфейс Segoe, 9

Как видите, между второй строкой и остальными есть разница (она имееткачество меньше, а псевдоним другой).Я пытался настроить сглаживание и режим сглаживания в объекте Graphics, но безрезультатно.

Можно ли нарисовать текст с использованием знака Graphics.DrawString и получить то же качество, что и другие методы?

Заранее спасибо.


РЕДАКТИРОВАТЬ: Я просмотрел код с Reflector.Я понял, что Graphics.DrawString использует gdiplus.dll , вызывая метод GdipDrawString (), а TextRenderer.DrawText использует user32.dll , вызывая DrawTextExW и DrawTextExA.

Любой комментарий об этом?

Ответы [ 4 ]

14 голосов
/ 01 сентября 2011

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);
    }
}
11 голосов
/ 01 сентября 2011

Следующий код взят из примера на 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));

Я проверил это, и оно работало нормально, на моей форме был нарисован плавный текст!;) Вот ссылка на статью .

1 голос
/ 01 сентября 2011

Помимо других предложений, которые, вероятно, более правильны в вашем случае, вы также можете попытаться использовать квантование изображения на основе Octree.Я использую это для обычных изображений, а не для текстаСуществует статья Microsoft, в которой подробно говорится об этом и приведен пример проекта: http://msdn.microsoft.com/en-us/library/aa479306.aspx

1 голос
/ 01 сентября 2011

Метод Graphics.DrawString находится в пространстве имен System.Drawing, что означает, что он использует GDI + под обложками вместо GDI, как и метод TextRenderer.DrawText.

Похоже, что конкретной причиной различий в этом случае является сглаживание. Вы можете управлять сглаживанием через свойство Graphics.TextRenderingHint.

graphics.TextRenderingHint = TextRenderingHint.SingleBitPerPixelGridFit;

Я считаю, что вы также можете отключить его для каждого шрифта, используя метод, показанный Аббасом.

...