imagettftext(): рассчитать размер шрифта, чтобы текст соответствовал ширине изображения

Я использую imagettftext() для написания динамического текста на изображении и хочу, чтобы он соответствовал ширине моего изображения.

Как рассчитать размер шрифта по длине текста?


person Asaf    schedule 21.05.2012    source источник
comment
Вы не можете рассчитать размер шрифта по длине текста, если это не моноширинный шрифт. И нет хорошего приближения. Строка всех букв W займет гораздо больше места, чем строка всех букв I.   -  person Brian Warshaw    schedule 21.05.2012


Ответы (2)


Вы можете рассчитать ограничивающую рамку текста TTF перед его выводом с помощью функции imagettfbbox. К сожалению, нет прямого способа масштабирования по ширине, поэтому вам придется делать это самостоятельно.

Один из способов сделать это — передать текст с размером шрифта по умолчанию, скажем, 20, в imagettfbbox и получить из него ширину. Затем вы можете рассчитать, насколько меньше или больше должен быть текст, чтобы соответствовать нужному размеру, вычислив коэффициент масштабирования:

scale = targetWidth / bboxWidth;

Затем нарисуйте текст нужного размера:

fontSize = 20 * scale;

используя функцию imagettftext. Таким образом шрифты не масштабируются на 100% идеально, но вы получите очень хорошее приближение.

См. документацию imagettfbox здесь.

person Overv    schedule 21.05.2012
comment
Чтобы сделать масштаб 100% идеальным, вы можете сделать второй проход со шрифтом 40 и вычислить масштаб на основе разницы между размером шрифта 20 и 40 для той же входной строки. - person Programista; 23.08.2012

person    schedule
comment
Это приведет к фатальной ошибке: вызов неопределенной функции itsTooBigAccordingToimagettftext(). Другими словами, дайте лучшее объяснение вашего ответа вместо использования полукода :-) - person Kapitein Witbaard; 15.08.2014
comment
Stackoverflow — это место, где вы должны получить руководство, а не полностью рабочий код. Для меня это хорошее руководство, единственная ошибка в том, что оно должно читаться как itsTooBigAccordingToimagettfbbox(), а не itsTooBigAccordingToimagettftext() ;-) - person Capsule; 15.04.2015
comment
Предупреждение: выполнение может привести к длительным задержкам, если вы не будете осторожны. - person starbeamrainbowlabs; 02.08.2015