люди.
У меня небольшая проблема с текстом GD2 на изображении. У меня все работает, и теперь я пытаюсь добавить текст на изображение, которое можно обернуть в изображение.
Например, у меня есть изображение с шириной 200 пикселей и большим блоком текста. Если вы используете imagettftext()
текст выходит за рамки изображения, и только частичный текст на самом деле видимый. Я попытался использовать функцию переноса текста Zend, но здесь мы не всегда получаем точные результаты (не сказать, что это не работает, только не в этом случае).
Есть ли какой-то выделенный метод GD2 для установки поля ширины, в котором текст должен соответствовать, и если он попадает в рамку этого окна, он должен продолжаться в новой строке?
Не уверен, что вы ищете, но вы можете попробовать следующее:
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-м символе.
Если вы используете моноширинные шрифты (маловероятно, я знаю), вы можете получить точный результат, поскольку они равномерно распределены.