Шаг 20 - Работа с графикой-2

Логика работы с графикой проста. Есть html-страница, в которой надо вывести картинку. Пусть саму картинку генерирует скрипт, находящийся в файле image.php. В основном html-файле тогда будет написано что-то типа этого:

<img src="image.php?r=150&g=150&b=150">

Здесь мы передаем в скрипт, генерирующий картинку (в примере будет серый прямоугольник), RGB-палитру цвета формируемого прямоугольника (напомню, что эти переменные, передаваемые в скрипт как параметры, будут в нем видны так, как если бы они были в нем объявлены и проинициализированы передаваемыми в вызывающем скрипте параметрами, т.е. для их использования ничего делать не надо!).

В image.php будет такой код:

<?php
Header ("Content-type: image/jpeg");    //HTTP-заголовок для картинки
$im = ImageCreate (500, 30);            //создаем image
$background = ImageColorAllocate ($im, $r, $g, $b); //создаем цвет фона
ImageJpeg ($im);                        //выводим image
ImageDestroy ($im);     //освободим память, выделенную под image
?>

Комментарии здесь следующие. Первое - в файле image.php перед тегом, открывающим php-секцию, не должно быть ни одного символа (даже пробелов!). До функции HEADER() также не должно быть ни одного оператора ECHO или PRINT. Файл не должен начинаться с декларации html (<HTML>).

Это важно потому, что при появлении символов на вывод web-сервер прекращает формирование HTTP-заголовка и переходит к формированию секции данных (например, собственно html-страницы). А функция HEADER() как раз и добавляет/заменяет секцию заголовка (в данном случае, отвечающую за тип данных).
Кстати, "обойти" это ограничение можно буферизацией вывода. Т.е. это не обход, а организация выполнения скрипта - до окончания формирования HTTP-заголовка выводимая информация помещается в буфер, а потом буфер сбрасывается в выходной поток. В PHP есть для этого соответствующие функции.

Функция IMAGECREATE() создает image размера, указанного в параметрах функции: ширина и высота. Возвращаемое значение - целое, являющееся идентификатором ресурса image.

IMAGECOLORALLOCATE() возвращает идентификатор цвета, формируемого на основе RGB-значений (2..4 параметры; первый параметр - идентификатор image-ресурса).

IMAGEJPEG() формирует картинку (в данном случае, jpeg-формата) для передачи сервером клиентскому браузеру. Всего такого рода функций три. Кроме указанной для jpeg-формата есть еще IMAGEPNG() и IMAGEGIF() для png- и gif-форматов соответственно (формально, а на самом деле gif-ы, как я уже говорил, не поддерживаются, так что всего функций, формирующих картинки, две).

IMAGEDESTROY() освобождает память, выделенную функцией IMAGECREATE() под image. Единственный параметр - идентификатор image-ресурса.

Фоном картинки становится первый созданный после создания image цвет. А как сделать фон картинки прозрачным? Очень просто. Для этого есть функция IMAGECOLORTRANSPARENT(), ставящая для указанного цвета в указанной картинке атрибут transparent. Первый параметр этой функции - идентификатор image-ресурса, а второй (необязательный) - идентификатор созданного цвета, например:

imagecolortransparent ($im, $color);

Вообще говоря, идентификаторы создаваемых цветов представляют из себя, как я понял, целые числа, начинающиеся с нуля (первый вызов IMAGECOLORALLOCATE()) и увеличивающиеся на единицу при каждом последующем вызове функции создания цвета. Явного указания на этот факт в мануале я, правда, не нашел (не туда смотрел?).

P.S. Кстати, если у Вас картинка все же не формируется, проверьте синтаксис. В случае ошибок PHP выводит в выходной поток (сервер отдаст этот вывод браузеру) сообщение об ошибке (если в php.ini параметр "error_reporting" выставлен в "on"). Причем выводит до выполнения скрипта, т.е. на этапе компиляции, а не выполнения, а значит, до выполнения функции HEADER() - см. выше.

Если же в php.ini параметр "display_errors" вместо умолчательного значения "E_ALL & ~E_NOTICE" будет равен, скажем, "E_ALL" (т.е. выводить все сообщения, включая предупреждения), то остаться без картинки можно, например, использовав необъявленную переменую.


Предыдущий Шаг | Оглавление
Автор Константин Платонов - 25.12.2000