2013-12-08 33 views
4

我正在嘗試將文本從db寫入圖像。文字有時包含冗長的線條,因此它不適合圖像上的一行。使用gd在圖像邊界內換行顯示文本

截至目前我得到的輸出:http://prntscr.com/29l582

這是此代碼:

$imageCreator = imagecreatefrompng($i+1 . ".png"); 
     $textColor = imagecolorallocate($imageCreator, 0, 0, 0); 
     $textfromdb = $factformatted['fact']; 
     $y = imagesy($imageCreator) - 228; 
     $dimensions = imagettfbbox(20, 0, $fontname, $textfromdb); 
     $x = ceil(($imageWidth - $dimensions[4])/2); 
     imagettftext($imageCreator, 20, 0, $x, $y, $textColor, $fontname, $textfromdb); 
     imagepng($imageCreator, "./fact".$i.".png"); 

有人可以幫助我,使工作?

+1

你怎麼竟想以適應嗎?插入換行符?改變字體大小等? – Salman

+0

我更喜歡換行符,但是如果字符串實際上大於圖像寬度,那麼必須減小字體大小! – defiant

回答

12

可以使用wordwrap功能和explode函數來截斷字符串中的多個陣列的文本,然後將其打印:

$word = explode("\n", wordwrap ("A funny string that I want to wrap", 10)); 

你得到這樣的輸出:

array(5) { 
    [0]=> 
    string(7) "A funny" 
    [1]=> 
    string(6) "string" 
    [2]=> 
    string(6) "that I" 
    [3]=> 
    string(7) "want to" 
    [4]=> 
    string(4) "wrap" 
} 

能比嗎詳細說明它(切割文本,在不同行上打印每個字符串等)。

例(新行打印):

... 
$dimensions = imagettfbbox(20, 0, $fontname, $textfromdb); 
$y = imagesy($imageCreator) - 228; 
$text = explode("\n", wordwrap($textfromdb, 20)); // <-- you can change this number 
$delta_y = 0; 
foreach($text as $line) { 
    $delta_y = $delta_y + $dimensions[3]; 
    imagettftext($imageCreator, 20, 0, 0, $y + $delta_y, $textColor, $fontname, $line); 
} 
... 

要居中垂直和水平:

... 
$dimensions = imagettfbbox(20, 0, $fontname, $textfromdb); 
$margin = 10; 
$text = explode("\n", wordwrap($textfromdb, 20)); // <-- you can change this number 
$delta_y = 0; 
//Centering y 
$y = (imagesy($imageCreator) - (($dimensions[1] - $dimensions[7]) + $margin)*count($text))/2; 

foreach($text as $line) { 
    $dimensions = imagettfbbox(20, 0, $fontname, $line); 
    $delta_y = $delta_y + ($dimensions[1] - $dimensions[7]) + $margin; 
    //centering x: 
    $x = imagesx($imageCreator)/2 - ($dimensions[4] - $dimensions[6])/2; 

    imagettftext($imageCreator, 20, 0, $x, $y + $delta_y, $textColor, $fontname, $line); 
} 
... 
+1

這現在是這樣的:http://prntscr.com/2btaek我會盡力修復它自己,但因爲我是新來的這個任何幫助將不勝感激。我試圖將它垂直和水平居中。 – defiant

+1

我改變了將文本居中的答案,請看一看。我無法測試,但它應該工作... – ProGM

+0

我做到了這一點,並對齊y部分:http://pastie.org/private/ryutguudjnk7sjp5afsbdw。但是你的$ x部分給了我空白的圖像。我認爲文本正在成爲圖像的外部部分! :(當我檢查XX的值:-841.5 – defiant