с примера сценария, который представляет
Начнем сразу с примера сценария, который представляет собой не HTML-страницу в обычном смысле, а рисунок PNG. То есть URL этого сценария можно поместить в тэг:
<img src=button.php?Hello+world!>
Как только будет загружена страница, содержащая указанный тэг, сценарий запустится и отобразит надпись Hello world! на фоне рисунка, лежащего в images/button.png. Полученная картинка нигде не будет храниться— она создается "на лету".
Рис. 23.1. Демонстрация
возможностей вывода
TrueType-шрифтов на PHP
Листинг 23.1. Создание картинки "на лету"
<?
// Получаем строку, которую нам передали в параметрах
$string=$QUERY_STRING;
// Загружаем рисунок фона с диска
$im = imageCreateFromPng("images/button.png");
// Создаем в палитре новый цвет — оранжевый
$orange = imageColorAllocate($im, 220, 210, 60);
// Вычисляем размеры текста, который будет выведен
$px = (imageSx($im)-7.5*strlen($string))/2;
// Выводим строку поверх того, что было в загруженном изображении
imageString($im,3,$px,9,$string,$orange);
// Сообщаем о том, что далее следует рисунок PNG
Header("Content-type: image/png");
// Теперь — самое главное: отправляем данные картинки в
// стандартный выходной поток, т. е. в браузер
imagePng($im);
// В конце освобождаем память, занятую картинкой
imageDestroy($im);
?>
Итак, мы получили возможность "на лету"
создавать стандартные кнопки с разными надписями, имея только "шаблон"
кнопки.
В листинге 23.3 я привожу пример сценария, который использует возможности вывода TrueType-øрифтов, а также демонстрирует работу с цветом RGB. Хотя размер примера довольно велик, рисунок, который он генерирует, выглядит довольно привлекательно
(см. рис. 23.1)[E115][DK116] .
Листинг 23.3. Вывод строки произвольного формата
<?
// Аналог imageColorAllocate() (по умолчанию), но работает не с
// RGB-тройкой, а с цветом в формате XXYYZZ, где:
// * XX — red-составляющая в шестнадцатеричном формате;
// * YY — green-составляющая в шестнадцатеричном формате;
// * ZZ — blue-составляющая в шестнадцатеричном формате.
// Можно указать другую функцию получения цвета, задав ее
// имя в параметре $func (например, imageColorClosest).
function imageColorHex($im, $c, $func="imageColorAllocate")
{ // Сначала дополняем нулями в начале, если нужно
for($i=strlen($c); $i<6; $i++) $c='0'.$c;
$r=hexdec(substr($c,0,2));
$g=hexdec(substr($c,2,2));
$b=hexdec(substr($c,4,2));
return $func($im,$r,$g,$b);
}
// Первым делом устанавливаем параметры по умолчанию. Эти
// параметры можно переопределять при вызове сценария
// (например, ttf.php?a=20&f=arial&text=Hi+there)
if(!@$a) $a=30; // угол поворота (по умолчанию 30)
if(!@$s) $s=80; // размер шрифта (80)
if(!@$b) $b="00AAAA"; // цвет заднего плана (зеленовато-голубой)
if(!@$c) $c="FFFF00"; // цвет букв (ярко-желтый)
if(!@$d) $d=10; // зазор между текстом и границей рисунка
if(!@$f) $f="times"; // шрифт
if(!@$text) $text="Hello world!"; // текст
// Получаем границы рамки текста
$Bnd=imageTTFBBox($s,$a,getcwd()."/$f.ttf",$text);
// Массивы x- и y-координат всех точек
$X=$Y=array();
// Заполняем эти массивы на основании $Bnd
for($i=0; $i<4; $i++) {
$X[]=$Bnd[$i*2];
$Y[]=$Bnd[$i*2+1];
}
// Вычисляем размер картинки с учетом зазора $d
$MX=max($X)-min($X)+$d*2; // размер по x
$MY=max($Y)-min($Y)+$d*2; // размер по y
Напоследок рассмотрим пример применения описанных выше функций. Предположим, в некотором текстовом файле хранится список подписчиков, каждая строка которого оформлена в следующем формате:
Имя_подписчика|адрес|timestamp_подписки|кодировка_письма
Напишем сценарий, который будет посылать каждому подписчику из этой простейшей базы данных "личное" письмо с самыми последними новостями сайта. Предположим для простоты, что эти новости в программе уже сохранены в массиве $News.
Для начала создадим шаблон письма (листинг32.3):
Листинг 32.3. Шаблон "личного" письма: mail.txt
Content-type: text/plain
From: Система рассылки <subscribe@ourserver.ru>
To: <?=$User['name']?>.
Subject: Свежие новости
Content-type: text/plain
~StartOfMail
Уважаемый <?=$User['name']?>!
Вы подписались на наш лист рассылки <?=date("d.m.Y",$User['time'])?>.
Предлагаем Вашему вниманию последние новости.
---------------------------------------------------------------
<?foreach($News as $k=>$v) {?>
<?=WordWrap($v,60)?>.
<?}?>
Как видим, шаблон практически ничем не отличается от небольшого сценария на PHP. Он получает данные из переменных $User (данные пользователя) и $News (блоки новостей), которые должны устанавливаться запускающей программой. Вскоре мы рассмотрим процедуру более подробно, а пока обратите внимание на некоторые моменты при написании этого шаблона.
r Мы указали заголовок Content-type сразу в двух местах шаблона — в начале и конце. В силу рассуждений, приведенных в главе 20, это необходимо для того, чтобы помочь некоторым "недогадливым" почтовым программам в определении кодировки письма.
r Заметьте, что в конце заголовка To стоит точка. Зачем она нужна? Дело в том, что закрывающий тэг PHP ?>, если он занимает последние символы строки, никогда не генерирует знака перевода строки \n. Это, видимо, сделано для того, чтобы уменьшить количество пустых строк в страницах, которые создает интерпретатор. В нашем случае отсутствие разделителя может сильно помешать,
// Теперь вычисляем координаты базовой точки строки, чтобы
// она располагалась точно по центру поля картинки
$x=$d+$Bnd[0]-min($X)+2;
$y=$d+$Bnd[1]-min($Y)+2;
// Создаем рисунок нужного размера
$im = imageCreate($MX,$MY);
// Создаем в палитре новые цвета
$black = imageColorHex($im, 0); // черный (тень)
$back = imageColorHex($im, $b); // задний план
$front = imageColorHex($im, $c); // цвет букв
// Очищаем задний план
imageFill($im,0,0,$back);
imageRectangle($im,0,0,$MX-1,$MY-1,$black);
// Выводим тень от текста
imagettftext($im,$s,$a,$x+2,$y+2,$black,getcwd()."/$f.ttf",$text);
// Выводим текст
imagettftext($im,$s,$a,$x,$y,$front,getcwd()."/$f.ttf",$text);
// Выводим рисунок в браузер
Header("Content-type: image/png");
imagePng($im);
?>
Сценарий из листинга 23.3 (назовем его ttf.php)
генерирует картинку с заданным цветом заднего плана, в которую выводится указанная строка с тенью. При этом используется TrueType-шрифт, а также определяются размер строки, угол ее наклона, цвет и т. д.
Формат вызова сценария имеет следующий общий вид:
ttf.php?a=Градусы&s=Размер&b=ЗаднийЦвет&c=Цвет&d=Зазор&f=Фонт&text=Текст
Ни один из этих параметров не является обязательным — в случае пропуска подставляются значения по умолчанию (см. листинг 23.3).
Необходимо заметить, что прежде, чем запускать сценарий, нужно скопировать TTF-файл со шрифтом в каталог, где расположена программа (например, взяв его из C:/WINDOWS/FONTS для платформы Windows). Параметр f задает имя этого файла без расширения, и ищется он в текущем каталоге. По умолчанию выбран шрифт Times.