Intereting Posts
Получение информации из базы данных MYSQL & Codeigniter использование заполнителей с php и mysql для предотвращения инъекций Улавливание ошибок PHP mail () и отображение разумного сообщения об ошибке пользователя Время работы функции PHP XAMPP отличается от местного времени машины рассчитать ранг пользователя Как вызвать скрипт оболочки из php, который требует SUDO? Участники Как установить адрес электронной почты в качестве имени пользователя в Joomla 3.x? Объект Javascript для Json. PHP не может декодировать сериализованный JSON Пользовательский агент SimpleXML Остановите скрипт (без фатальной ошибки) после определенного количества времени запроса / разбора Панель выполнения AJAX и PHP Есть ли способ использования PHP-ActiveRecord в качестве уровня ORM / абстракции Symfony? Получение всех дат по понедельникам и вторникам на следующий год Загрузить изображения на сервере

Есть ли функция переноса слов для GD2 в php?

люди.

У меня небольшая проблема с текстом GD2 на изображении. У меня все работает, и теперь я пытаюсь добавить текст на изображение, которое можно обернуть в изображение.

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

Есть ли какой-то выделенный метод GD2 для установки поля ширины, в котором текст должен соответствовать, и если он попадает в рамку этого окна, он должен продолжаться в новой строке?

Related of "Есть ли функция переноса слов для GD2 в php?"

Не уверен, что вы ищете, но вы можете попробовать следующее:

  function wrap($fontSize, $fontFace, $string, $width){ $ret = ""; $arr = explode(' ', $string); foreach ( $arr as $word ){ $teststring = $ret.' '.$word; $testbox = imagettfbbox($fontSize, 0, $fontFace, $teststring); if ( $testbox[2] > $width ){ $ret.=($ret==""?"":"\n").$word; } else { $ret.=($ret==""?"":' ').$word; } } return $ret; } 

Функция от сафарова содержит небольшую ошибку, которая была продемонстрирована для моего случая пользователя. Если бы я послал слово больше ширины $, он впоследствии изменил бы каждое слово, например, например:

 veryloooooooooooooongtextblablaOVERFLOWING this should be one line 

Причина в том, что imagettfbox всегда будет> $ width с этим «злым» словом внутри текста. Мое решение состояло в том, чтобы просто проверить каждую ширину слова отдельно и, необязательно, вырезать слово, пока оно не станет равным $ width (или отмените резание, если мы дойдем до длины 0). Затем я продолжаю нормальную переписку. В результате получается что-то вроде:

 veryloooooooooooooongtextblabla this should be one line 

Вот измененная функция:

 function wrap($fontSize, $fontFace, $string, $width) { $ret = ""; $arr = explode(" ", $string); foreach ( $arr as $word ){ $testboxWord = imagettfbbox($fontSize, 0, $fontFace, $word); // huge word larger than $width, we need to cut it internally until it fits the width $len = strlen($word); while ( $testboxWord[2] > $width && $len > 0) { $word = substr($word, 0, $len); $len--; $testboxWord = imagettfbbox($fontSize, 0, $fontFace, $word); } $teststring = $ret.' '.$word; $testboxString = imagettfbbox($fontSize, 0, $fontFace, $teststring); if ( $testboxString[2] > $width ){ $ret.=($ret==""?"":"\n").$word; } else { $ret.=($ret==""?"":' ').$word; } } return $ret; } 

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

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