Как настроить размер текста в соответствии с размером изображения при рисовании строки на изображении в C # - PullRequest
1 голос
/ 31 октября 2011

Я использую метод Drawstring класса Graphics для рисования текста на изображении. Шрифт указывается перед рисованием.

G.DrawString(mytext, font, brush, 0, 0)

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

Я прикрепляю изображения разных размеров, на которых нарисован текст с одинаковым размером шрифта.http://i.stack.imgur.com/ZShUI.jpg

http://i.stack.imgur.com/GUfbM.jpg

Я не могу напрямую опубликовать изображение, потому что мне запрещено.

Ответы [ 2 ]

2 голосов
/ 31 октября 2011

Вы получите наиболее точное масштабирование, нарисовав отдельное изображение, а затем добавив это изображение к исходному. Вы сделали бы это следующим образом:

  1. Создание растрового изображения в памяти с достаточным пространством
  2. Нарисуйте текст на этом растровом изображении шрифтом по умолчанию
  3. Нарисуйте изображение, содержащее текст, на оригинальном изображении, масштабируя его до нужного вам размера

Код:

Bitmap textBmp = new Bitmap(100, 100);
Graphics textBmpG = Graphics.FromImage(textBmp);
textBmpG .DrawString("test 1", new Font(FontFamily.GenericSansSerif, 16), Brushes.Red, new PointF(0, 0));
Graphics origImgG = Graphics.FromImage(originalImg);
origImgG.DrawImage(textBmpG, new Rectangle(50, 50, 50, 50), new Rectangle(0, 0, 100, 100), GraphicsUnit.Pixel);

Обратите внимание на последнюю строку и Rectangle параметры. Используйте их для масштабирования вашего текстового растрового изображения на исходное изображение. Кроме того, вы также можете выбрать метод Graphics.MeasureString, чтобы определить, насколько широким будет ваш текст, и делать попытки, пока не получите лучший из возможных.

  1. Используйте Graphics.MeasureString () , чтобы измерить размер вашей строки на изображении
  2. Уменьшить / увеличить шрифт, шаг за шагом соответственно

Как вы и просили в комментарии, я дам вам более подробное предложение здесь. Скажем, исходная ширина изображения - WI1, а ширина текста на нем с использованием Graphics.MeasureString - WT1. Если вы измените размер изображения до ширины WI2, то ваша идеальная ширина текста будет WT2 = WT1 * WI2 / WI1. Используя метод DrawText, вы не сможете получить точную ширину, потому что при увеличении шрифта на 1 он может перепрыгнуть через это значение. Таким образом, вы должны сделать несколько попыток и найти лучшее. Выберите размер шрифта, если получающаяся ширина текста меньше (измерьте с помощью MeasureString), увеличивайте его до тех пор, пока он не станет больше целевого, и вы получите близкое соответствие. То же самое происходит, если он слишком большой. Уменьшить шрифт шаг за шагом.

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

Разница между этими решениями заключается в том, что сначала вы можете получить текст, соответствующий размеру, который вам нужен, но вы, вероятно, потеряете некоторую читаемость шрифта из-за масштабирования. Второе решение даст хорошую читабельность, но вы не можете получить идеальный размер текста в пикселях.

0 голосов
/ 31 октября 2011

По моему мнению, у вас есть два способа:

  1. Нарисуйте текст на исходном изображении и затем измените размер полученного изображения (так, даже текста, включенного в него)фактор newImageWidth/originalImageWidth.
    Это не идеально, потому что у вас могут быть проблемы с высотой текста (если новое изображение не только масштабируется, но с другим соотношением сторон), но это идея
...