можно многострочный текст с GD и PHP? - PullRequest
0 голосов
/ 01 июня 2010

Я пытаюсь вывести многострочный текст с помощью GD + PHP, но не могу заставить его работать. мои знания php действительно базовые. вот код, есть идеи, как вывести 2 или 3 строки текста?

$theText = (isset($_GET['caption']))? stripslashes($_GET['caption']) :'';
imagettftext($baseImage, $textSize, $textAngle, $textXposition, $textYposition, $textColor, $fontName, $theText);

Ответы [ 4 ]

3 голосов
/ 01 июня 2010
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. имейте в виду, что все изображение должно быть достаточно высоким и широким, чтобы вместить текст.

1 голос
/ 01 июня 2010

Это не поддерживается API. Вот код, чтобы сделать это «вручную»:

http://php.net/manual/en/function.imagettftext.php#75718

0 голосов
/ 29 марта 2013

У меня была неизвестная длина строки, но только определенная ширина для работы. Вот я и придумал это. В основном это разделяет предложение в символах. Если он сталкивается с пробелом, он проверяет, может ли слово быть добавлено к предыдущей строке, если нет, он начинает новую строку. Существует также слабая безопасность для очень длинных слов, которые просто обрезаются, чтобы не выйти из образа.

На этапе, на котором я фактически печатаю текст на изображении, я проверяю, меньше ли строка, чем максимально допустимые символы, и добавляю пробелы в начале + в конце, чтобы имитировать 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;
    }
0 голосов
/ 01 июня 2010

Вы можете повторить один imagettftext на строку; просто разделите $theText на массив (разделитель - NewLine) и выполните цикл для каждого элемента в массиве, увеличивая $textYposition на высоту строки (см. $textSize, но на самом деле вы получите это лучше, используя imageftbbox. Прочтите страницу в руководстве по PHP

...