Вот еще статейку нашел.Может тоже будет полезна кому то.
Делаем эксклюзивную линейку в подписи
Предисловие
Итак, в последнее время в интернете, особенно на форумах, получили распространение так называемые "линейки" — динамические картинки, изменяющиеся в зависимости от текущего времени и показывающие, скажем, количество лет, месяцев и дней от какой-либо даты... В основном это: "Я на форуме уже ....", "Живу в стране уже ...", "Женат уже ..." и т. д. Поставить себе такую линейку в подпись может каждый — благо, таких сервисов развелось немало. Посмотреть, что они нам предлагают, можно, например, здесь.
НО! Хочется эксклюзива... =) Даже беглого взгляда на сайт хватит, чтобы понять, насколько местные линейки жлобские. А если учесть, что каждую из них уже юзает огромное количество людей, становится и вовсе стрёмно... Впрочем, за бесплатно вам ничего лучше не предложат. Поэтому единственный выход — действовать самому. Собственно, этому и посвящено следующее руководство.
Что нам надо?
Ко всему нужно подходить с пониманием, к творческой работе — тем более =) Перечислим то, что стоит приготовить, прежде чем приступать к работе.
Графический редактор. В зависимости от сложности поставленной перед вами задачи, это может быть как MS Paint, так и Adobe Photoshop. Я все же склоняюсь к последнему... Текстовый редактор. Подойдет и "Блокнот", но при наличии навороченного кода ГОРАЗДО удобней писать и редактировать его в специализированных программах. Один из самых удобных продуктов для этой цели — прога ListEdit. Хостинг. Картинку надо будет где-то поместить, поэтому позаботьтесь о наличии хоста с поддержкой PHP. Подойдет, например, hut.ru. Знания, умения и креативность. Основной пункт! Мы будем использовать язык PHP, следовательно, если вы никогда не писали сценариев на PHP, ознакомьтесь хотя бы с его синтаксисом — это может весьма облегчить вашу работу. Если же вы обладаете достаточным знанием языка, просто откройте какой-нибудь справочник по его функциям или же используйте официальный сайт php.net. Умению рисовать, хорошему вкусу, а также элементарной сообразительности, к сожалению, научиться тяжелее, поэтому придется довольствоваться тем, чем "наградил" Бог =)
Подготовились? Читайте дальше.
Поехали!
Начнем с того, что определимся с идеей. Зачастую, оригинальный задум компенсирует не самое лучшее исполнение. Я, в свою очередь, не буду сверхоригинальным и буду описывать процесс на примере весьма заезженной темы "Я <там-то> уже <столько-то>", но с Веб-Хаковсксим дизайном =)
Далее заготовим картинку, которая будет служить нам фоном. Размер — не более 400х80 пикселей. Назовем ее "bg.jpg". Оформление картинки — на ваше усмотрение. В моем примере (для простоты) это всего лишь кусок логотипа web-hack'a с главной страницы: фон . Как вы уже догадались, наша надпись разместится внизу картинки =)
Теперь выберем шрифт, которым мы будем "писать". Где взять шрифты — не мне вам рассказывать =) Прощего всего заглянуть в папку "WINDOWS\Fonts" (если вы под Виндой) и скопировать оттуда в папку с картинкой нужный ttf-файл. Не хотите стандартных шрифтов? Гугл к вашим услугам!
Создайте теперь файл index.php (потом поймете, почему именно "индекс") и откройте его в вашем любимом текстовом редакторе. Отсюда и начинается основная работа...
Работа с датами и временем.
В любом учебнике по PHP есть раздел с таким названием. Просмотрите его еще раз, так как мы будем активно использовать функции по работе с датами.
Наша основная цель — правильно сформировать строку, выводимую на картинку. Допустим, мы хотим написать "Тусуюсь на Веб-Хаке уже X лет Y дней". Мы должны позаботиться не только о правильном подсчете количества дней, прошедших со дня регистрации, но и о правильном отображении слов: "год/года/лет", "день/дня/дней". Согласитесь, надпись "5 года и 103 дней" выглядит некрасиво... Начнем с первого, а дальше — дело техники ;-)
Вот две основные функции, необходимые нам для построения правильной даты:
string date(string $format [, int $timestamp])
int strtotime(string $time [, int $timestamp])
За подробным их описанием обратитесь в мануал =)
Идея такая: в переменную $days пишем количество выводимых дней, в $years — лет, а в $out — уже полностью сформированную строку, готовую для вывода на экран. Алгоритмов получения этих значений — множество. Главное, чтобы считало правильно, а о простоте кода пока не беспокойтесь =)
Полагаясь на вышенаписанное, может иметь место следующий код, написанный мной "на коленке":
PHP:
$stamp=strtotime("30 September 2004"); //$timestamp даты, от который ведем отсчет (большое целое число)
$start_day=date("z",$stamp); //Номер "стартового" дня в году начиная с 01.01 (1-365)
$start_year=date("Y",$stamp); //"Стартовый" год
$now_year=date("Y"); //Текущий год
$now_day=date("z"); //Номер текущего дня в году
$years=$now_year-$start_year; //Количество неполных лет, прошедших с точки отсчета
if($now_day<$start_day) //Если годовщины в этом году еще не было, ...
{
if($years>0) $years--; //...отнимаем один год
$days=365-$start_day+$now_day; //А тут попробуйте догадаться сами =)
}
else $days=$now_day-$start_day; //В противном случае считаем разность между текущим и "стартовым" днями
Как видите, все просто... "Цифры" у нас уже есть в соответствующих переменных, поэтому перейдем к корректному выводу их на экран.
Грамматика — наше всё =)
Заведем еще две строковые переменные:
$y — может принимать значения {"год", "года", "лет"}
$d — может принимать значения {"день", "дня", "дней"}
Пораскинув мозгами, мы понимаем, что $y должно принять значение: "год" — только тогда, когда в переменной $years записано любое (кроме 11) число, заканчивающееся на "1": "1 год", "31 год", "991 год" и т. д. "года" — только тогда, когда в переменной $years записано любое (кроме 12, 13, 14) число, заканчивающееся на "2", "3", "4": "2 года", "3 года", "104 года" и т. д.
"лет" — в остальных случаях...
Абсолютно так же обстоят дела с падежами слова "день". Алгоритм можете придумать сами, я использовал следующий:
PHP:
//годы
$buf1=$years%10; $buf2=$years%100;
if($buf1==2 || $buf1==3 || $buf1==4 && $buf2!=12 && $buf2!=13 && $buf2!=14) $y="года";
elseif($buf1==1 && $buf2!=11) $y="год";
else $y="лет";
//дни
$buf1=$days%10; $buf2=$days%100;
if($buf1==2 || $buf1==3 || $buf1==4 && $buf2!=12 && $buf2!=13 && $buf2!=14) $d="дня";
elseif($buf1==1 && $buf2!=11) $d="день";
else $d="дней";
Не буду объяснять каждую строку — он не настолько сложен, чтобы не понять его...
Итак, мы имеем ВСЁ для того, чтобы сформировать корректную выходную строку
PHP:
$out!
$out="Тусуюсь на Веб-Хаке уже ";
if($years) $out.=$years." ".$y." ";
$out.=$days." ".$d;
Осталось вывести это на картинку нужным шрифтом, нужного цвета и размера! Но есть еще одна проблема...
Отображение кириллицы
Чтобы вывести русский текст таким, какой он есть, надо перекодировать его в Unicode-представление. Для этого, не мудрствуя лукаво, заюзаем функцию toUnicodeEntities($string cyr), написанную кем-то (не мной
PHP:
function toUnicodeEntities($text, $from="w")
{
$text = convert_cyr_string($text, $from, "i");
$uni = "";
for ($i=0, $len=strlen($text); $i<$len; $i++)
{
$char = $text{$i};
$code = ord($char);
$uni .= ($code>175)? "&#" . (1040+($code-176)) . ";" : $char;
}
return $uni;
}
Теперь вместо написать($что-то) мы будем использовать написать(toUnicodeEntities($что-то)) и будем уверены, что текст отобразится правильно =) Впрочем, если текст набран только цифрами и латинскими буквами — конвертировать ничего не нужно...
Работа с изображениями.
Теперь мы точно на финишной прямой — осталось только сделать штамп печатью с заготовленным текстом в нужном месте =) Поскольку мы используем шрифты True Type, должны существовать специальные функции для работы с ними. Нам пригодится только одна из них:
PHP:
list imageTtfText(int $im, int $size, int $angle, int $x, int $y, int $col, string $fontfile, string $text)
Мда, 8 параметров... Ну ничего, переживем. Вот что означает каждый из них:
$im — наш рисунок.
$size — размер шрифта.
$angle — угол наклона шрифта (рекомендую юзать 0).
($x, $y) — координаты левого нижнего угла прямоугольника, в который вписывается текст.
$col — цвет текста.
$fontfile — ПОЛНЫЙ путь к ttf-файлу со шрифтом.
$text — собственно, текст.
Ну что ж... Последние штрихи:
PHP:
$im=imageCreateFromJpeg("bg.jpg");
$col=imageColorAllocate($im, 0, 160, 0);
imageTtfText($im, 6, 0, 70, 52, $col, realpath("your_font.ttf"), toUnicodeEntities($out));
Header("Content-type: image/gif");
imageGif($im);
Мы открыли наш фон, написали на нем строку $out зеленым цветом и вывели получившуюся картику на экран, сжав ее в *.gif.
Размещение файлов на удаленном хосте.
Готово! Заливаем это дело на сервер... Создайте папку с названием "ruler.gif" (теперь понятно, почему файл скрипта должен был называться index.php?) и в нее загрузите файлы "bg.jpg", "index.php" и "font.ttf" (font — название КОНКРЕТНОГО шрифта: Arial, Tahoma etc.)
Теперь, написав у себя в подписи [img_]http://your_host/ruler.gif[/img_] вы увидите вашу картинку! Поэкспериментируйте со шрифтами, размерами, цветами — добейтесь наилучшего вида =) Ну и конечно же, никто не запрещает вам редактировать мой скрипт под свои условия, поскольку это только шаблон ;-)
В завершение... br>
Прошу заметить, что я выбрал простейший "Arial Black" — выбрав шрифт попонтовей, вы обеспечите более симпатичную картинку. Ну а если оригинально отфотошопить наш бэкграунд, результат окажется и вовсе на порядок интересней. Также вы можете переделать ЭТО под линейку в чистом виде: с указателем, бегающим по символическому отрезку с делениями, отвечающими за годы, месяцы или дни... Как это сделать? Юзайте другие функции по работе с графикой в PHP (см. мануал) и, что самое главное, ВАШУ ФАНТАЗИЮ! ;-)
Автор: nerezus