Задача
Необходимо создать изображение, основанное на имеющемся шаблоне и динамических данных (как правило, на тексте). Например, надо создать счетчик выполнения.
Решение
Загрузите шаблон изображения, найдите правильное положение, чтобы соответствующим образом отцентрировать текст, добавьте текст к области изображения и пошлите изображение броузеру:
// Конфигурационные настройки
$image = ImageCreateFromPNG('button.png');
$text = $_GET['text'];
$font = ImagePSLoadFont('Times');
$size = 24;
$color = ImageColorAllocate($image, 0, 0, 0); // черный
$bg_color = ImageColorAllocate($image, 255, 255, 255); // белый
// Печатаем центрированный текст
list($x, $y) = pc_ImagePSCenter($image, $text, $font, $size);
ImagePSText($image, $text, $font, $size, $color, $bg_color, $x, $y);
// Посылаем изображение
header('Content-type: image/png');
ImagePNG($image);
// Удаляем
ImagePSFreeFont($font);
ImageDestroy($image);
Обсуждение
Строить динамические изображения с помощью библиотеки GD довольно легко, достаточно объединить несколько рецептов вместе. В на-чале программы из раздела «Решение» мы загружаем изображение из запаса шаблонов кнопок; оно играет роль фона, на который накладывается текст. Считаем, что текст поступает прямо из строки запроса. В качестве альтернативы можно получить текст из базы данных (в случае счетчиков доступа) или с удаленного сервера (котировки акций или пиктограммы прогноза погоды).
После этого мы продолжаем работать с другими параметрами: загружаем шрифт и указываем его размер и цвет, а также цвет фона. Однако перед тем как печатать текст, необходимо вычислить его местоположение; функция pc_ImagePSCenter().Наконец, мы выдаем изображение и удаляем шрифт и зображение из памяти.
Например, следующий фрагмент кода генерирует HTML-страницу и теги изображения с динамическими кнопками.<?php
if (isset($_GET['button'])) {
// Параметры конфигурации
$image = ImageCreateFromPNG('button.png');
$text = $_GET['button']; // динамически сгенерированный текст
$font = ImagePSLoadFont('Times');
$size = 24;
$color = ImageColorAllocate($image, 0, 0, 0); // черный
$bg_color = ImageColorAllocate($image, 255, 255, 255); // белый
// Печатаем центрированный текст
list($x, $y) = pc_ImagePSCenter($image, $text, $font, $size);
ImagePSText($image, $text, $font, $size, $color, $bg_color, $x, $y);
// Посылаем изображение
header('Content-type: image/png');
ImagePNG($image);
// Удаляем
ImagePSFreeFont($font);
ImageDestroy($image);
} else {
?>
<html>
<head>
<title>Sample Button Page</title>
</head>
<img src="<?php echo $_SERVER['PHP_SELF']; ?>?button=Previous"
alt="Previous" width="132" height="46">
<img src="<?php echo $_SERVER['PHP_SELF']; ?>?button=Next"
alt="Next" width="132" height="46">
</html>
<?php
}
?>
В этом сценарии, если значение для переменной $_GET['button'] передано, мы генерируем кнопку и посылаем броузеру PNG. Если значение переменной $_GET['button'] не установлено, мы печатаем базовую HTML-страницу с двумя внедренными обратными вызовами сценария с запросами для каждой кнопки – один для кнопки Previous (предыдущая) и один для кнопки Next (следующая). Общим решением будет создание отдельной страницы button.php, которая возвращает только картинки и устанавливает источник изображения по адресу этой страницы.