Я хочу удалить отступы сверху и снизу сгенерированного изображения - PullRequest
0 голосов
/ 26 января 2019

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

Я попытался изменить формат строки при использовании DrawString, но каким-то образом мне удалось удалить извлево и вправо.

private void button1_Click(object sender, EventArgs e)
    {
        Font font = new Font("Arial", 52, FontStyle.Regular);
        Image i = GetTextAsImage(textBox1.Text,400, font, Color.Black, Color.LightGray);

        i.Save("myImage.jpeg", ImageFormat.Jpeg);

    }
    private Image GetTextAsImage(String text, int widthInPixel, Font textFont, Color textColor, Color backColor)
    {
        //first, create a dummy bitmap just to get a graphics object
        Image img = new Bitmap(1, 1);
        Graphics drawing = Graphics.FromImage(img);

        //measure the string to see how big the image needs to be
        SizeF textSize = drawing.MeasureString(text, textFont);

        //free up the dummy image and old graphics object
        img.Dispose();
        drawing.Dispose();

        //create a new image of the right size
        img = new Bitmap((int)textSize.Width, textFont.Height);

        drawing = Graphics.FromImage(img);
        drawing.SmoothingMode = SmoothingMode.AntiAlias;
        drawing.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
        //paint the background
        drawing.Clear(backColor);

        //create a brush for the text
        Brush textBrush = new SolidBrush(textColor);


        drawing.DrawString(text, textFont, textBrush, 0, 0,StringFormat.GenericTypographic);

        drawing.Save();

        textBrush.Dispose();
        drawing.Dispose();

        return img;

    }

Ожидаемый результат должен быть достигнут, чтобы удалить заполнение сверху и снизу. Вывод я получаю Это ожидаемый вывод

1 Ответ

0 голосов
/ 27 января 2019

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

Преимущество состоит в том, что класс GraphicsPath сообщает фактические координаты, в которых будет нарисован объект, на который он ссылается, а также размер текста относительно определенного шрифта.
Эти меры возвращаются вRectagleF структура с использованием метода GraphicsPath.GetBounds () .
Базовый конструктор предполагает, что размер Pen равен 1 пикселю.

Есть только одна (маленькая) деталь, о которой нужно позаботиться: объект GDI + Bitmap принимает измерения, выраженные только в целочисленных значениях, тогда как все остальные меры выражаются в значениях с плавающей запятой.
Нам необходимо компенсироватьокругление, но обычно оно составляет всего ± 1 пиксель.

Пример результатов:

GraphicsPAth GetBounds text measure

Описание процедуры:

  • Определение шрифтаСемейство и размер
  • Добавьте текстовую строку к объекту 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();
    }
}
...