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

4

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

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

Вы не можете рассчитать размер шрифта по длине текста, если он не является моноширинным шрифтом. И нет хорошего приближения. Строка всех W займет гораздо больше места, чем строка всех I. Brian Warshaw

Ваш Ответ

2   ответа
12

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

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

scale = targetWidth / bboxWidth;

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

fontSize = 20 * scale;

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

Смотрите документациюimagettfbox Вот.

Это отлично работает !! Спасибо! Asaf
помог мне тоже ....
Чтобы сделать масштаб на 100% идеальным, вы можете сделать второй проход со шрифтом 40 и рассчитать масштаб на основе разницы между 20 и 40 размерами шрифта для той же входной строки.
-1
while (itsTooBigAccordingToimagettftext() && $fontSize > 0) {
    $fontSize--;
}
Предупреждение: делатьcan вызвать длительные задержки, если вы не будете осторожны.
Это приведет к & quot; фатальной ошибке: вызов неопределенной функции itsTooBigAccordingToimagettftext () & quot ;. Другими словами, пожалуйста, дайте лучшее объяснение вашего ответа вместо использования полукода :-)
Stackoverflow - это место, где вы должны получать руководство, а не полностью рабочий код. Для меня это хорошее руководство, единственная ошибка - читатьitsTooBigAccordingToimagettfbbox() и неitsTooBigAccordingToimagettftext() ;-)

Похожие вопросы