Я предлагаю вам немного другой метод, использующий класс GraphicsPath для измерения и рисования текста на растровом объекте.
Преимущество состоит в том, что класс GraphicsPath
сообщает фактические координаты, в которых будет нарисован объект, на который он ссылается, а также размер текста относительно определенного шрифта.
Эти меры возвращаются вRectagleF
структура с использованием метода GraphicsPath.GetBounds () .
Базовый конструктор предполагает, что размер Pen равен 1 пикселю.
Есть только одна (маленькая) деталь, о которой нужно позаботиться: объект GDI + Bitmap принимает измерения, выраженные только в целочисленных значениях, тогда как все остальные меры выражаются в значениях с плавающей запятой.
Нам необходимо компенсироватьокругление, но обычно оно составляет всего ± 1 пиксель.
Пример результатов:
![GraphicsPAth GetBounds text measure](https://i.stack.imgur.com/0P3zS.png)
Описание процедуры:
- Определение шрифтаСемейство и размер
- Добавьте текстовую строку к объекту
GraphicsPath
- Получите
GraphicsPath
ограничивающий прямоугольник текстового объекта - Создайте растровый объект, используя ограничивающий прямоугольникРазмер
- Перемещение координат мира с помощью Graphics.TranslateTransform в координаты, определяемые позицией ограничительного прямоугольника
Y
и размером пера, используя их отрицательное значение : нам нужно переместиться назад на эту меру. - Нарисуйте текст
См. Также эти заметки о GraphicsPath
и шрифтах:
Правильно рисуйте текст с использованием графического контура
Пример кода:
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
string text = "This is my Text";
Font font = new Font("Arial", 52, FontStyle.Regular, GraphicsUnit.Point);
float penSize = 1f;
using (GraphicsPath path = new GraphicsPath())
{
path.AddString(text, font.FontFamily, (int)font.Style, font.Size, Point.Empty, StringFormat.GenericTypographic);
RectangleF textBounds = path.GetBounds();
using (Bitmap bitmap = new Bitmap((int)textBounds.Width, (int)textBounds.Height, PixelFormat.Format32bppArgb))
using (Graphics g = Graphics.FromImage(bitmap))
{
g.SmoothingMode = SmoothingMode.AntiAlias;
g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
g.Clear(Color.Black);
g.TranslateTransform(-penSize, -(textBounds.Y + penSize));
using (SolidBrush brush = new SolidBrush(Color.LightGreen))
{
g.FillPath(brush, path);
}
bitmap.Save("[Image Path]", ImageFormat.Png);
//Or: return (Bitmap)bitmap.Clone();
}
}