我有一個未知的字符串長度,但只有一定的寬度來處理,所以我想出了這個,基本上它把這個句子分解爲字符,如果它碰到一個空白字符,它會檢查這個單詞是否可以添加到上一行如果不是,則開始一個新的行,對於超長的單詞也有一個蹩腳的安全措施,那些正在被切碎的單詞,以便不會從圖像中跳出來
在我實際打印文字到圖像,我檢查是否該行小於允許的最大字符數,並添加前導+尾隨空格,以模仿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;
}
謝謝! 有沒有辦法將它自動分割成幾行?例如計算圖像的文字或寬度? – alekone 2010-06-01 16:43:19
好,因爲ttf字體中每個字符的寬度差別很大,所以存在問題。一種不像ttf字體那麼華麗的解決方案,但其中大部分是足夠好的將是正常的像素字體。 我寫了一個腳本,它前一段時間,你可以在這裏找到: http://gist.github.com/421165 只是讀它你就會明白它 - 它並不難 - 它也不是很乾淨或寫得很好......;) 你只是傳遞它的文字和圖像的寬度 - 它會完成剩下的工作。玩的開心! :) – Tobias 2010-06-03 01:44:44
有適當的功能來獲得「文本」的「邊界框」,你可以使用這些。要分割,使用'split';要知道「邊界框」,使用'imagettfbbox' ...如果你已經閱讀了我在答案中給出的鏈接,你會看到一些示例,告訴你如何去做。 – ShinTakezou 2010-06-06 06:36:14