Рисование текста в.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

Другие вопросы по тегам