2010-06-01 52 views
0

我試圖用GD + PHP輸出多行文本,但無法讓它工作。我的PHP知識是非常基本的。 這裏是代碼,關於如何輸出2或3行文本的任何想法?我可以使用GD和PHP多行文本嗎?

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

回答

3
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位置。請記住,您的整個圖像應該足夠高並且足夠寬以適應文本。

+0

謝謝! 有沒有辦法將它自動​​分割成幾行?例如計算圖像的文字或寬度? – alekone 2010-06-01 16:43:19

+0

好,因爲ttf字體中每個字符的寬度差別很大,所以存在問題。一種不像ttf字體那麼華麗的解決方案,但其中大部分是足夠好的將是正常的像素字體。 我寫了一個腳本,它前一段時間,你可以在這裏找到: http://gist.github.com/421165 只是讀它你就會明白它 - 它並不難 - 它也不是很乾淨或寫得很好......;) 你只是傳遞它的文字和圖像的寬度 - 它會完成剩下的工作。玩的開心! :) – Tobias 2010-06-03 01:44:44

+0

有適當的功能來獲得「文本」的「邊界框」,你可以使用這些。要分割,使用'split';要知道「邊界框」,使用'imagettfbbox' ...如果你已經閱讀了我在答案中給出的鏈接,你會看到一些示例,告訴你如何去做。 – ShinTakezou 2010-06-06 06:36:14

0

每行可以重複一個imagettftext;剛剛拆分$theText到一個數組(分隔符是換行)和循環數組中的每個元素,由線(見$textSize的高度遞增$textYposition,但確確實實你會得到更好利用imageftbboxRead the page in the PHP manual

0

我有一個未知的字符串長度,但只有一定的寬度來處理,所以我想出了這個,基本上它把這個句子分解爲字符,如果它碰到一個空白字符,它會檢查這個單詞是否可以添加到上一行如果不是,則開始一個新的行,對於超長的單詞也有一個蹩腳的安全措施,那些正在被切碎的單詞,以便不會從圖像中跳出來

在我實際打印文字到圖像,我檢查是否該行小於允許的最大字符數,並添加前導+尾隨空格,以模仿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; 
    }