PDA

Просмотр полной версии : [Q] функция текстовой дуги (PHP, GD)


draliokero
19.03.2009, 21:02
Помогите пожалуйста написать функцию: нужно вывести текст в виде дуги.

textarc(“antichat”, x, y, start, end, r); - текстовая дуга с радиусом r, с центром в точке (x,y) от угла start до угла end выводит текст antichat



Большое спасибо scrat!
/**
* @DESC: Функция вывода строки в виде дуги/круга
* @HELP: textarc("string", 13, 250, 250, 180, 0, 50, $rImage, "arial.ttf", "000000");
* @NEEDS: PHP 4.0.1 or higher & GD
* @author: scrat (http://forum.antichat.ru/)
*/

function textarc($sText, $fSize, $fX, $fY, $fStart, $fEnd, $fRadius, $rImage, $sFontfile, $iColor)
{
$a = ($fStart - $fEnd) / strlen($sText);

sscanf($iColor, "%2x%2x%2x", $red, $green, $blue);

imagecolorallocate($rImage,255,255,255);
$iColor = imagecolorallocate($rImage, $red, $green, $blue);

imagesetpixel($rImage, $fX, $fY, $iColor);

$fAng = $fStart + $a;

for($i = 0;$i < strlen($sText);$i++) {
$fAng -= $a;

$iXt = $fX + $fRadius * cos(deg2rad($fAng));
$iYt = $fY - $fRadius * sin(deg2rad($fAng));

$fAngle = $fStart > $fEnd ? $fAng-90 : $fAng + 90;

imagettftext($rImage, $fSize, $fAngle, $iXt, $iYt, $iColor, $sFontfile, $sText[$i]);
}
}

scrat
19.03.2009, 21:44
можно пример такой дуги? я не очень понял.

draliokero
19.03.2009, 22:02
Да, пожалуйста:
http://s48.radikal.ru/i120/0903/27/360236be902b.jpg

Pashkela
19.03.2009, 22:09
ну вот информация к размышлению:


<?php

$im = imagecreate(800, 800);

$string = 'ANTICHAT';

$bg = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);

$x = 200; // Стартовая x позиция
$y = 200; // Стартовая y позиция
$flag = false;

for ($i=0;$i<strlen($string);$i++) {

imagechar($im, 20, $x, $y, $string{$i}, $black);
if ($string{$i}=='I') $flag = true;
if (!$flag) {
$x = $x+10;
$y = $y-10;
} else {
$x = $x+10;
$y = $y+10;
}

}

header('Content-type: image/gif');
imagegif($im);

?>


результат:

http://s55.radikal.ru/i149/0903/55/da5e4bece065.jpg

дальше ломает чото:)

scrat
19.03.2009, 22:31
тут либо считать угол наклона каждой буквы либо искажать изображение

draliokero
19.03.2009, 22:48
Pashkela, мне тоже в голову сначала пришло, что нужно через цикл для каждого символа менять координаты…. Из-за середины больше на знак крышки похоже, чем на дугу. Но думаю если количество символов в строке четное, например 6, то для 3го и 4го символа задавать специальные координаты, если нет, скажем 5, то для 3го символа.

scrat, я c GD только сейчас начал работать, подскажите, пожалуйста, как с искажением можно сделать?

Pashkela
19.03.2009, 22:52
Ну да, в этом ручье, и сдвиг не такой большой (+10), чтобы типо плавный переход. В общем этот алгоритм, этот. Просто начинать надо с центральной буквы (предварительно даже, вероятно, перегнав строку в массив), а потом уже плясать.

тут главное вот оно, imagechar, остальное - дело техники.

Если нечетное - центральная буква выше всех, четное - две средних буквы типо на одном уровне. В общем надо проверять

А радиус вообще элемнтарно посчитать - y-первой буквы минус y-той буквы, что выше всех (или двух букв)

А итоговый результат зависит как и от РАЗМЕРА шрифта, так и от ТИПА шрифта, в общем чисто визуальное восприятие.

mailbrush
19.03.2009, 23:31
Эм, а не легче будет найти/написать свой шрифт дугоподобный?

scrat
19.03.2009, 23:32
если вы не видите что надпись на картинке по дуге,то вам надо срочно употребить LSD.
http://leprastuff.ru/data/img/20090319/0164e5ea0bb43860686df8c4971173f7.jpg

ps ща доделаю.

draliokero
19.03.2009, 23:44
mailbrush, каждый символ такого шрифта должен иметь несколько позиций и нужно будет вычислять когда использовать каждую позицию символа.

scrat
20.03.2009, 00:06
mailbrush, каждый символ такого шрифта должен иметь несколько позиций и нужно будет вычислять когда использовать каждую позицию символа.
да это элементарная тригонометрия,на листочке всё уже расписал,чёто только криво работает.

scrat
20.03.2009, 00:39
http://leprastuff.ru/data/img/20090319/thumb_b71b92df4a26aff89e1504d70f98f3bb.png

До конца лень доделывать,сам разберёшься. Общий принцип такой. Если нужны пояснения - пиши в пм/аську.

<?php
header("Content-type: image/jpeg");
$im = imagecreate(500,500); //создаём изображение

textarc("antichat", 250, 250, 180, 0, 50, $im, "arial.ttf");

function textarc($s, $x, $y, $start, $end, $r, $im, $ttf_file) //textarc(строка,x центра,y центра,начальный угол,конечный угол,радиус,картинка,файл шрифта)
{
$a = ($start-$end) / strlen($s);

imagecolorallocate($im,255,255,255);
$c = imagecolorallocate($im,0,0,0);

imagesetpixel($im,$x,$y,$c);

$ang = $start + $a;

for($i=0;$i<strlen($s);$i++)
{
$ang -= $a;

$xt = $x + $r*cos(deg2rad($ang));
$yt = $y - $r*sin(deg2rad($ang));

imagettftext($im, 10, $ang, $xt, $yt, $c, $ttf_file, $s[$i]); //не ясен наклон букв(возможно зависит от шрифта)

}
}
imagepng($im);
?>

draliokero
20.03.2009, 00:52
В сети по данному сабжу не чего не нашел…
Pashkela, scrat, спасибо Вам большое за помощь!!

//не ясен наклон букв(возможно зависит от шрифта)
Нужно с $ang проиграться

scrat
20.03.2009, 01:25
В сети по данному сабжу не чего не нашел…
Pashkela, scrat, спасибо Вам большое за помощь!!

//не ясен наклон букв(возможно зависит от шрифта)
Нужно с $ang проиграться
лол,думаешь я не поигрался...

Chaak
20.03.2009, 01:35
scrat, скрипт не работает =\

draliokero
20.03.2009, 01:44
Chaak, GD>=2, arial.ttf в текущей директории скрипта.

Chaak
20.03.2009, 02:06
Все есть =\ скрипт генерирует черную точку по центру

Pashkela
20.03.2009, 02:10
у меня работает

Chaak
20.03.2009, 13:36
Кладу рядом arial.ttf
Php 5.3
Gd 2.1

draliokero
20.03.2009, 14:01
Chaak, у меня такой же суповой набор и все работает. Как вариант если точка есть, то возможно радиус выставлен большой и текстовая дуга находится за пределами изображения.

Я поправил функцию и отредактировал свой первый пост, теперь наклон букв нормальный стал.