Это только часть проблем, связанных с использованием динамических кнопок. Например, в листинге 25.1 содержится сценарий, создающий PNG-изображение кнопки с текстовым обозначением. Кнопка имеет прямоугольную форму и рельефное изображение. Текст имеет оттеняющий эффект и отцентрирован горизонтально и вертикально. Вывод, полученный в результате работы этого сценария, показан на рис. 25.1.

Листинг 25.1. Кнопка PNG

<?php /*
** Кнопка PNG
** Создание графической кнопки на основании ** переменных форм.
*/
class Button {
private $image;
public function _construct($width, $height, $label, $font)
{
$this->image = imagecreate($width, $height); $colorBody = imagecolorallocate($this->image,
0x99, 0x99, 0x99); $colorShadow = imagecolorallocate($this->image,
0x33, 0x33, 0x33); 
$colorHighlight = imagecolorallocate($this->image,
0xCC, 0xCC, 0xCC); //создать тело кнопки imagefilledrectangle($this->image,
1, 1, $width-2, $height-2,
$colorBody); // нарисовать тень imageline($this->image,
0, $height-1,
$width-1, $height-1,
$colorShadow); // нарисовать тень справа imageline($this->image,
$width-1, 1,
$width-1, $height-1,
$colorShadow); //нарисовать подсветку сверху imageline($this->image,
$width-1, 0,
$colorHighlight); // нарисовать подсветку слева imageline($this->image,
0, 0,
0, $height-2,
$colorHighlight); // определить размер текста $labelHeight = imagefontheight($font);
$labelWidth = imagefontwidth($font) * strlen($label); // задать верхний левый угол текста
$labelX = ($width - $labelWidth)/2; $labelY = ($height - $labelHeight)/2;
// оттенить текст imagestring($this->image,
$font,
$labelX+1, $labelY+1,
$label,
$colorShadow); //задать обозначение imagestring($this->image,
$font, $labelX, $labelY, $label,
$colorHighlight);
}
public function drawPNG()
{
header("Content-type: image/png"); imagepng($this->image);
}
public function drawJPEG()

{

 header("Content-type: image/jpeg"); imagejpeg($this->image);
}}
//задать параметры, если они отсутствуют if(!isset($_REQUEST['width']))
$_REQUEST['width'] = 100;
if(!isset($_REQUEST['height']))
$_REQUEST['height'] = 30; if(!isset($_REQUEST['label']))
$_REQUEST['label'] = "CLICK";
if(!isset($_REQUEST['font']))
$_REQUEST['font'] = 5;
$b = new Button($_REQUEST['width'], $_REQUEST['height'], $_REQUEST['label'], $_REQUEST['font']); $b->drawPNG();
Создание графических изображений
Первым действием данного сценария является попытка убедиться в том, что у него есть действительная информация для всех параметров, включая размеры кнопки и текста, привязанного к кнопке. Я выбрал использование встроенных шрифтов, которые прону­мерованы от единицы до пяти. В главе 16, "Обработка изображений и графики", описывались функции, предназначенные для загрузки различных шрифтов, и я могу лишь пожелать читателю успехов в модификации этого сценария и дальнейшем использовании его.
Следующим действием является создание изображения. Для этого есть два пути. Можно создать пустое изображение определенного размера, но можно и загрузить уже существующий файл изображения. Я выбрал первый способ, так как он позволяет создавать кнопки любого размера. Более стилизованные кнопки можно создавать с помощью последнего способа. Но это совсем другая задача.
Эта кнопка будет создана в трех цветах: основном цвете, цвете подсветки и цвете тени. Для этого были выбраны три оттенка серого цвета, которые распределяются с помощью функции imagecolorallocate. С использованием основного цвета этот сценарий создает прямоугольник, который на один пиксель меньше всего изображения. Граница этого прямоугольника создается с помощью четырех линий. Снизу и справа эти линии вырисовываются в цвете тени, а слева и сверху - в цвете подсветки, что создает иллюзию трехмерного изображения.
В завершение сценарий создает текст. Сначала текст появляется немного смещенным относительно центра в цвете тени. После этого по нему выписывается точно от­центрированный текст в цвете подсветки, создавая впечатление, что он может свободно перемещаться на кнопке. 
Теперь сценарий создает изображение, и ему необходимо отправить его в браузер. Очень важно, чтобы при этом был отправлен заголовок, который дает понять, что этот файл является изображением. Без этого будет получен набор загадочных символов.