Я пытаюсь вывести многострочный текст с помощью GD + PHP, но не могу заставить его работать. мои знания php действительно базовые. вот код, любая идея о том, как выводить 2 или 3 строки текста?
$theText = (isset($_GET['caption']))? stripslashes($_GET['caption']) :''; imagettftext($baseImage, $textSize, $textAngle, $textXposition, $textYposition, $textColor, $fontName, $theText);
imagettftext($baseImage, $textSize, $textAngle, $textXposition, $textYposition, $textColor, $fontName, $theText); imagettftext($baseImage, $textSize, $textAngle, $textXposition+(25), $textYposition, $textColor, $fontName, $theText); imagettftext($baseImage, $textSize, $textAngle, $textXposition+(50), $textYposition, $textColor, $fontName, $theText);
вам нужно добавить x пиксель, чтобы переместить его вниз в положение X. имейте в виду, что весь ваш образ должен быть высоким и достаточно широким, чтобы соответствовать тексту.
Он не поддерживается API. Вот код для этого «вручную»:
Вы можете повторить один imagettftext в строке; просто разделите $theText
на массив (разделитель – это NewLine) и цикл для каждого элемента в массиве, увеличивая $textYposition
на высоту строки (см. $textSize
, но действительно вы получите его лучше, используя imageftbbox
. в руководстве по PHP
У меня была неизвестная длина строки, но только определенная ширина для работы. Поэтому я придумал это. В принципе, он разделяет предложение в символах. Если он попадает в пробелы, он проверяет, может ли слово быть добавлено к предыдущей строке, если нет, оно запускает новую строку. Существует также хромая безопасность для лишних длинных слов, которые просто рубится, чтобы не выходить из изображения.
На этапе, когда я на самом деле печатаю текст на изображение, я проверяю, меньше ли строка, чем максимально допустимые символы, и добавляет ведущие + завершающие пробелы, чтобы имитировать text-align: center.
# Split up the lines $arrMessage = str_split(stripcslashes($strMessage)); $arrTemp = array(); $line = 0; $word = array(); $arrTemp[$line] = array(); foreach($arrMessage as $char){ //if we hit a space, see if we should continue line, or make a new line if($char == " ") { //calculate numbers of chars currently on line + number of chars in word $numTotalChars = (int) count($word) + (int) count($arrTemp[$line]); //if total > 14 chars on a line, create new line if($numTotalChars > 14) { $line++; $arrTemp[$line] = array(); } $word[] = $char; //push word-array onto line + empty word array $arrTemp[$line] = array_merge($arrTemp[$line], $word); $word = array(); } else { //if word is too long for a line, split it if( count($word) > 16) { $numTotalChars = (int) count($word) + (int) count($arrTemp[$line]); if($numTotalChars > 16) { $line++; $arrTemp[$line] = array(); } $arrTemp[$line] = array_merge($arrTemp[$line], $word); $word = array(); } $word[] = $char; } }
Не забудьте также добавить последнее слово к строке. Вам также необходимо проверить, должна ли она быть на новой строке или нет.
Добавьте строки к изображению:
//add some px to x and y for every new line $pos_x = $font->position[0]; $pos_y = $font->position[1]; $numLineHeight = 20; $addToX = 0; if($font->angle > 5) { $addToX = 2; } else if($font->angle < 0) { $addToX = -2; } # ADD MESSAGE foreach($arrTemp as $arrLine){ //leading/trailing whitespace (==center text) $numCharsOnThisLine = count($arrLine); $extraWhiteSpace = 14 - $numCharsOnThisLine; $frontBackSpace = floor($extraWhiteSpace / 2); for($i = 0; $i < $frontBackSpace; $i++){ array_unshift($arrLine, " "); $arrLine[] = " "; } //make string from char array $strLine = implode("", $arrLine); imagettftext ($image, $font->size, $font->angle, $pos_x, $pos_y, $tlt, $font->family, $strLine); $pos_x = $pos_x + $addToX; $pos_y = $pos_y + $numLineHeight; }