Используя функцию imagettftext с несколькими строками? Кто-нибудь делал это раньше? - PullRequest
5 голосов
/ 29 мая 2011

Я создаю прозрачный текст -> PNG изображения с помощью PHP и пока все хорошо.Единственная проблема заключается в том, что я хочу иметь возможность переносить текстовое слово из-за фиксированной ширины. Или же иметь возможность вставлять в текст разрывы.У кого-нибудь был такой опыт?вот мой код ...

<?php

$font = 'arial.ttf';
$text = 'Cool Stuff! this is nice LALALALALA LALA HEEH EHEHE';
$fontSize = 20;

$bounds = imagettfbbox($fontSize, 0, $font, $text); 

$width = abs($bounds[4]-$bounds[6]); 
$height = abs($bounds[7]-$bounds[1]); 



$im = imagecreatetruecolor($width, $height);
imagealphablending($im, false);
imagesavealpha($im, true);


$trans = imagecolorallocatealpha($im, 255, 255, 255, 127);

// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);


imagecolortransparent($im, $black);
imagefilledrectangle($im, 0, 0, $width, $height, $trans);


// Add the text
imagettftext($im, $fontSize, 0, 0, $fontSize-1, $grey, $font, $text);


imagepng($im, "image.png");
imagedestroy($im);


?>

Ответы [ 4 ]

17 голосов
/ 14 января 2014

Попробуйте это

$text = 'Cool Stuff! this is nice LALALALALA LALA HEEH EHEHE';
$text = wordwrap($_POST['title'], 15, "\n");

Я надеюсь, что это поможет другим, так как я думаю, что слишком поздно для вас ...

6 голосов
/ 28 сентября 2011

Просто разбейте текст на пробелы, чтобы получить массив слов, затем начните строить строки, просматривая массив слов, проверяя добавление каждого нового слова через imagettfbbox, чтобы увидеть, создает ли он ширину, превышающую установленную вами максимальную ширину. Если это так, начните следующее слово на новой новой строке. Я считаю, что проще просто создать новую строку с добавлением специальных символов разрыва строки, а затем просто снова взорвать эту строку, чтобы создать массив строк, каждую из которых вы будете записывать в окончательное изображение отдельно.

Примерно так:

$words = explode(" ",$text);
$wnum = count($words);
$line = '';
$text='';
for($i=0; $i<$wnum; $i++){
  $line .= $words[$i];
  $dimensions = imagettfbbox($font_size, 0, $font_file, $line);
  $lineWidth = $dimensions[2] - $dimensions[0];
  if ($lineWidth > $maxwidth) {
    $text.=($text != '' ? '|'.$words[$i].' ' : $words[$i].' ');
    $line = $words[$i].' ';
  }
  else {
    $text.=$words[$i].' ';
    $line.=' ';
  }
}

Где символ канала - это символ разрыва строки.

1 голос
/ 04 июня 2018

Из всех опубликованных ответов мне понравилось Гений в беде х лучший, но он просто добавляет перевод строки через каждые 15 символов, а не позволяет тексту "течь", как это было бы всовременный текстовый процессор с переменной длиной строки в зависимости от выбора шрифта и используемых символов (например, строчная буква L занимает меньше горизонтального пространства, чем заглавная буква W - l против W).

Я нашел решение, которое явыпущен как открытый исходный код на https://github.com/andrewgjohnson/linebreaks4imagettftext

Для использования вы просто измените:

$font = 'arial.ttf';
$text = 'Cool Stuff! this is nice LALALALALA LALA HEEH EHEHE';
$fontSize = 20;
$bounds = imagettfbbox($fontSize, 0, $font, $text); 
$width = abs($bounds[4]-$bounds[6]); 

На:

$font = 'arial.ttf';
$text = 'Cool Stuff! this is nice LALALALALA LALA HEEH EHEHE';
$fontSize = 20;
$bounds = imagettfbbox($fontSize, 0, $font, $text); 
$width = abs($bounds[4]-$bounds[6]);

// new code to add the "\n" line break characters to $text
require_once('linebreaks4imagettftext.php'); //https://raw.githubusercontent.com/andrewgjohnson/linebreaks4imagettftext/master/source/linebreaks4imagettftext.php
$text = \andrewgjohnson\linebreaks4imagettftext($fontSize, 0, $font, $text, $width);

Вот пример ранееи после с более длинным фрагментом текста:

Example

0 голосов
/ 07 июля 2019

Если в вашей строке нет пробела, вы можете попробовать это:

 $text = 'Cool Stuff!thisisniceLALALALALALALAHEEHEHEHE';
 $text = wordwrap($_POST['title'], 15, "\n",true); //TRUE = Wrap
...