| |
23.1 "на предпоследнее
место",
которая, собственно, и выполняет большую часть работы — выводит изображение в
браузер пользователя. Оказывается, эту же функцию можно применять и для сохра-
нения рисунка в файл.
int imagePng(int $im [,string $filename]) или
int imageJpeg(int $im [,string $filename]) или
int imageGif(int $im [,string $filename])
Эти функции сохраняют изображение, заданное своим идентификатором и находя-
щееся в памяти, на диск, или же выводят его в браузер. Разумеется, вначале
изобра-
жение должно быть загружено или создано при помощи функции imageCreate(),
т. е. мы должны знать его идентификатор $im.
Если аргумент $filename опущен, то сжатые данные в соответствующем формате
выводятся прямо в стандартный выходной поток, т. е. в браузер. Нужный заголовок
Content-type при этом не выводится, ввиду чего нужно выводить его вручную при
помощи Header(), как это было показано в примере из листинга 23.1.
Некоторые браузеры не требуют вывода правильного Content-type, а опре-
деляют, что перед ними рисунок, по нескольким первым байтам присланных
данных. Ни в коем случае не полагайтесь на это! Дело в том, что все еще су-
ществуют браузеры, которые этого делать не умеют. Кроме того, такая техника
идет вразрез со стандартами HTTP.
Фактически, вы должны вызвать одну из трех команд, в зависимости от типа
изобра-
жения:
Header("Content-type: image/png") для PNG
Header("Content-type: image/jpeg") для JPEG
Header("Content-type: image/gif") для GIF
Рекомендую их вызывать не в начале сценария, а непосредственно перед вызовом
imagePng(), imageGif() или imageJpeg(), поскольку иначе вы не сможете никак
увидеть сообщения об ошибках и предупреждения, которые, возможно, будут сгене-
рированы программой.
Часть IV. Стандартные функции PHP 320
К рассмотренным только что функциям можно сделать точно такие же замеча-
ния, как и к семейству imageCreateFromXXX(), т. е., некоторые из них могут
отсутствовать — скорее всего, последняя. Однако случаются и забавные казу-
сы. Я видел версию PHP, в которой не поддерживалась вообще ни одна из
этих функций, ровно как и функции imageCreateFromXXX(). В то же время
imageCreate() работала (во всяком случае, так казалось). Возникает инте-
ресный вопрос: мы можем создавать изображения, рисовать в них линии, кру-
ги, выводить текст, но не в состоянии ни сохранить их где-нибудь, ни даже за-
грузить уже готовую картинку с диска. Зачем тогда вообще были нужны все
остальные функции?..
Работа с цветом в формате RGB
Наверное, теперь вам захочется что-нибудь нарисовать на пустой или только что
за-
груженной картинке. Но чтобы рисовать, нужно определиться, каким цветом это де-
лать. Проще всего указать цвет заданием тройки RGB-значений (от red-green-blue)
—
это три цифры от 0 до 255, определяющие содержание красной, зеленой и синей со-
ставляющих в нужном нам цвете. Число 0 обозначает нулевую яркость соответст-
вующей компоненты, а 255 — максимальную интенсивность. Например, (0,0,0) зада-
ет черный цвет, (255,255,255) — белый, (255,0,0) — ярко-красный, (255,255,0) —
желтый и т. д.
Правда, GD не умеет работать с такими тройками напрямую. Она требует, чтобы пе-
ред использованием RGB-цвета был получен его специальный идентификатор. Даль-
ше вся работа опять же осуществляется через этот идентификатор. Скоро станет
ясно,
зачем нужна такая техника.
Создание нового цвета
int imageColorAllocate(int $im, int $red, int $green, int $blue)
Функция возвращает идентификатор цвета, связанного с соответствующей тройкой
RGB. Обратите внимание, что первым параметром функция требует идентификатор
изображения, загруженного в память или созданного до этого. Практически каждый
цвет, который планируется в дальнейшем использовать, должен быть получен (опре-
делен) при помощи вызова этой функции. Почему "практически" — станет ясн
|
|