Получаем размер шрифта в пикселях в C#

Одна странность класса Font заключается в том, что его свойство «Размер» возвращает размер шрифта в единицах, которые использовались для создания шрифта. Свойство Unit класса Font указывает вам единицы, используемые для создания шрифта, но если вам нужен размер шрифта в определенных единицах (например, пикселях), вам необходимо обрабатывать несколько возможных случаев при преобразовании размера шрифта.

Пример При рисовании гладкого текста в GraphicsPath в C# используется следующий код, чтобы избежать необходимости конвертировать размер шрифта.

// Используйте большой шрифт.
private void Form1_Load(object sender, EventArgs e)
{
    this.AutoScaleMode = AutoScaleMode.None;
    this.Font = new Font("Times New Roman", 30,
        FontStyle.Bold, GraphicsUnit.Pixel);
}

Этот код использует пиксели для определения шрифта формы. Позже программа использует следующий код для добавления строки к объекту GraphicsPath.

path.AddString("DrawPath Normal", this.Font.FontFamily,
    (int)this.Font.Style, this.Font.Size, new Point(10, y),
    string_format);

Метод AddString определяет размер шрифта в пикселях. Поскольку обработчик события Load формы определяет размер шрифта в пикселях, этот код может использовать this.Font.Size для размера, переданного методу AddString.

В этом примере используется другой метод. Вместо того, чтобы создавать шрифт с использованием единичных пикселей, он использует свойство PropertyInPoints объекта Font, чтобы получить размер шрифта в точках, а затем преобразует их в пиксели.

// Рисуем образцы текста.
private void Form1_Paint(object sender, PaintEventArgs e)
{
    const string txt = "Sample Text";

    int y = 10;
    e.Graphics.TextRenderingHint = TextRenderingHint.AntiAlias;
    e.Graphics.DrawString(txt, this.Font, Brushes.Green, 10, y);
    y += this.Font.Height;

    using (StringFormat string_format = new StringFormat())
    {
        string_format.Alignment = StringAlignment.Near;
        string_format.LineAlignment = StringAlignment.Near;

        // Get the form's font size in pixels no matter
        // what unit was used to create the font.
        float size_in_pixels =
            this.Font.SizeInPoints / 72 * e.Graphics.DpiX;

        using (GraphicsPath path = new GraphicsPath())
        {
            path.AddString(txt, this.Font.FontFamily,
                (int)this.Font.Style, size_in_pixels, new Point(10, y),
                string_format);
            e.Graphics.SmoothingMode = SmoothingMode.AntiAlias;
            e.Graphics.FillPath(Brushes.Green, path);
        }
    }
}

Строка ключевого кода выше выделена синим цветом. По определению точка принтера составляет 1/72 дюйма дюйма. Код получает размер шрифта в точках и делит на 72, чтобы получить дюймы. Затем он умножается на разрешение экрана в точках (пикселей) на дюйм, чтобы получить размер в пикселях. Он использует этот размер, чтобы добавить строку к объекту GraphicsPath.

Результаты, полученные методом DrawString объекта Graphics и объектом GraphicsPath, почти одинаковы. В этом примере метод DrawString использует значение TextRenderingHint AntiAlias. Если вы используете AntiAliasGridFit, вы получите немного лучший кернинг (межсимвольный интервал), чтобы получить более приятный результат, но тогда ширина строки не совпадает с результатом, заданным объектом GraphicsPath.

Источник: csharphelper.com/blog/2017/07/get-font-size-in-pixels-in-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (2 оценок, среднее: 5,00 из 5)
Adblock
detector