[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: php gd text ellipse
retro4u
Ребята, добрый вечер.
Столкнулся с проблемой.
Нужно нанести текст на изображение - текст должен быть расположен полукругом - приближенным к эллипсу.
Может быть кто-то сталкивался с подобной проблемой и нашел решение?
Заранее спасибо за ответ.
P.S. Во вложении пример - как именно текст должен ложиться на фото.
sergeiss
А что тебе мешает вычислить положение каждой буковки? Размеры буквы (если используешь, например, библиотеку GD) легко находятся при заданных шрифте и размере. Точку на эллипсе рассчитать не сложно. Этих данных достаточно, чтобы всё вычислить.
И не только вдоль эллипса, а даже вдоль любой кривой можно расположить.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
retro4u
Цитата (sergeiss @ 22.07.2014 - 21:46)
А что тебе мешает вычислить положение каждой буковки? Размеры буквы (если используешь, например, библиотеку GD) легко находятся при заданных шрифте и размере. Точку на эллипсе рассчитать не сложно. Этих данных достаточно, чтобы всё вычислить.
И не только вдоль эллипса, а даже вдоль любой кривой можно расположить.

А можно хотя бы пример отдаленный как это должно выглядеть для того же эллипса?
Был бы премного благодарен.
sergeiss
Ну вот смотри... У тебя должна быть известна формула, связывающая координаты y=f(x). Не важно вообще, что за формула. Если что, формула эллипса тут есть http://ru.wikipedia.org/wiki/Эллипс, тебе больше подойдет формула эллипса в каноничской форме, приведенная к виду y=f(x). Тут уж сам потрудись, формула просто получается smile.gif

1. Далее выбираешь начальную точку, располагаешь в ней первую букву.
2. Вычисляешь ее ширину.
3. Это будет смещение вправо для второй буквы. По найденной ранее формуле y=f(x) вычисляешь высоту положения второй буквы. Располагаешь ее.
4. Находишь ее ширину....
5. Переходишь к п.3, только с новыми координатами. И так по циклу, пока все буквы не закончатся.

Можно заранее рассчитать координаты "икс" для всех букв, с учетом ширины картинки и количества букв. Координаты "игрек" также будут вычислены по формуле y=f(x).

Это я расписал не пример, а алгоритм.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
retro4u
Цитата (sergeiss @ 22.07.2014 - 22:14)
Ну вот смотри... У тебя должна быть известна формула, связывающая координаты y=f(x). Не важно вообще, что за формула. Если что, формула эллипса тут есть http://ru.wikipedia.org/wiki/Эллипс, тебе больше подойдет формула эллипса в каноничской форме, приведенная к виду y=f(x). Тут уж сам потрудись, формула просто получается smile.gif

1. Далее выбираешь начальную точку, располагаешь в ней первую букву.
2. Вычисляешь ее ширину.
3. Это будет смещение вправо для второй буквы. По найденной ранее формуле y=f(x) вычисляешь высоту положения второй буквы. Располагаешь ее.
4. Находишь ее ширину....
5. Переходишь к п.3, только с новыми координатами. И так по циклу, пока все буквы не закончатся.

Можно заранее рассчитать координаты "икс" для всех букв, с учетом ширины картинки и количества букв. Координаты "игрек" также будут вычислены по формуле y=f(x).

Это я расписал не пример, а алгоритм.

Ага, я понял - попробую пошерстеть. smile.gif
Мерси, я отпишусь еще.)
retro4u
Шот не очень выходит(
retro4u
Ну вот собственно сам код, который ну никак не хочет накладывать текст на фотографию по эллиптической траектории.

$image = imagecreate(600,600);
$white = imagecolorallocate($image, 0xFF, 0xFF, 0x00);
$fontFile = './lib/fonts/times.ttf';
$textCoords = 'phpforum.su phpforum.su phpforum.su';

$fontColor = imagecolorallocate($image, 0xFF, 0x00, 0x00);
$fontSize = 25*0.752812499999996;

$y = 0+$fontSize;
$angle = 0;
$b = 100;
$x_B = 300;
$y_B = 300;
$a = 300;

$width = imagesx($image);
$textLength = strlen($textCoords);

$box = imagettfbbox( $fontSize , $angle , $fontFile , $textCoords);

$x = 0;


for($i=0;$i<$textLength;$i++)
{
$ch = $textCoords{$i};
$y = $b*sqrt(1-($x-$x_B)*2/$a*2)+$y_B;
imagefttext($image, $fontSize, $angle, $x, $y, $fontColor, $fontFile, $ch);
$type_space = imagettfbbox($fontSize, $angle, $fontFile, $ch);
$image_width = abs($type_space[4] - $type_space[0]);
$x += $image_width;
}

ob_start();
imagejpeg($image);
$imagestring = ob_get_contents();
ob_end_clean();
$encoded = base64_encode($imagestring);
?>
<img src="data://image/jpeg;base64,<?php echo $encoded ?>" />
<?
imagedestroy($image);

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.