Druzya.org
Возьмемся за руки, Друзья...
 
 
Наши Друзья

Александр Градский
Мемориальный сайт Дольфи. 
				  Светлой памяти детей,
				  погибших  1 июня 2001 года, 
				  а также всем жертвам теракта возле 
				 Тель-Авивского Дельфинариума посвящается...

Библиотека :: Компьютеры и Программирование :: Котеров Д. В. - Самоучитель PHP 4
<<-[Весь Текст]
Страница: из 287
 <<-
 
 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. Обратите внимание, что первым параметром функция требует идентификатор 
изображения, загруженного в память или созданного до этого. Практически каждый 
цвет, который планируется в дальнейшем использовать, должен быть получен (опре- 

делен) при помощи вызова этой функции. Почему "практически" — станет ясн
 
<<-[Весь Текст]
Страница: из 287
 <<-