набросал за 10 минут. Не готовое идеальное решение, но принцип думаю понятен
class RoundedText
{
private $string = "some text";
private $angle = 45;
private $image;
private $startX = 150;
private $startY = 250;
/**
* @param string $string текст для отрисовки
*/
public function __construct($string = '')
{
if (!empty($string)) {
$this->string = $string;
}
}
/**
* Рисует текст
*/
private function drawText()
{
// пустая черная картинка 500х500
$this->image = imagecreatetruecolor(500, 500);
//массив символов из строки
$simbols = str_split($this->string);
//центр строки
$center = round(count($simbols)/2);
//цвет символов (красный)
$color = imagecolorallocate($this->image, 0xFF, 0x00, 0x00);
//множитель угла наклона
$i = 1;
//счетчик символов
$j = 1;
while ($simbols) {
$simbol = array_shift($simbols);
//угол поворота символа
$angle = $this->angle / $i;
//если текущий символ дальше центра, инвертируем угол накрона
if ($j > $center) {
$angle *= -1;
$i--;
} else {
$i++;
}
//рисуем символ
$coords = imagefttext($this->image, 24, $angle, $this->startX, $this->startY, $color, 'path_to_font.ttf', $simbol);
//присваиваем координаты нового символа
$this->startX = $coords[2];
$this->startY = $coords[3];
$j++;
}
}
public function save($path = null)
{
$this->drawText();
header("Content-type: image/jpeg");
imagejpeg($this->image, $path, 90);
imagedestroy($this->image);
}
}
$roundText = new RoundedText();
$roundText->save();