У меня была неизвестная длина строки, но только определенная ширина для работы. Вот я и придумал это. В основном это разделяет предложение в символах. Если он сталкивается с пробелом, он проверяет, может ли слово быть добавлено к предыдущей строке, если нет, он начинает новую строку. Существует также слабая безопасность для очень длинных слов, которые просто обрезаются, чтобы не выйти из образа.
На этапе, на котором я фактически печатаю текст на изображении, я проверяю, меньше ли строка, чем максимально допустимые символы, и добавляю пробелы в начале + в конце, чтобы имитировать 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;
}