Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

PHP5_nachinayushim

.pdf
Скачиваний:
29
Добавлен:
20.03.2015
Размер:
26.79 Mб
Скачать

PHP5 и электронная почта 603

?>

</td>

</tr>

</table>

</body>

</html>

?>

Сохраните файл как php_mail.php, а затем откройте его в браузере. Первона+ чальная страница приложения показана на рис. 15.2.

Рис. 15.2.

604 Глава 15

На рис. 15.3 показано подтверждающее сообщение, которое получает пользова+ тель после нажатия кнопки Отправить e-mail.

Рис. 15.3.

Однако это еще не все.

Дело в том, что если определенные поля (CC, BCC или другие) не заполнены, выво+ дится сообщение об ошибке. В упражнении, приведенном в конце главы, необходимо модифицировать сценарий так, чтобы он мог генерировать правильно сформирован+ ные заголовки независимо от того, ввел ли пользователь соответствующие данные.

Резюме

В главе рассматривались почтовые протоколы Internet, структура e+mail+ сообщений, функция mail() и ее аргументы, а также методика отправки многоэле+ ментных и HTML+сообщений с помощью PHP. Представленное в главе учебное при+ ложение может быть хорошей отправной точкой, если разработчику придется реали+ зовывать e+mail+функциональность на Web+сайтах. Эта глава должна послужить той базой, с которой можно начинать изучение сложностей Internet+почты.

Более подробную информацию об электронной почте можно найти на сайте Меж+ дународного почтового консорциума (International Mail Consortium), www.imc.org.

PHP5 и электронная почта 605

Упражнение

Представленное в главе приложение хорошо работает в случае создания и отправ+ ки одиночных писем. Модифицируйте это приложение так, чтобы оно позволяло от+ правлять сообщения списку получателей, взятому из базы данных.

16

Генерирование графики

До сих пор в книге рассматривалось использование PHP для взаимодействия

спользователем, подключения и манипулирования базами данных и отправки ин+ формации по e+mail. Другой аспект Web+технологий ++++++ добавление графики на стра+ ницы. Речь идет не о создании изображений для HTML+страниц с помощью графиче+ ских редакторов, а об использовании PHP для генерирования графики во время выполнения сценария. На страницах книги уже обсуждалось использование инфор+ мации, полученной из базы данных, для создания динамических страниц. Теперь изу+ чим возможность динамического создания изображений.

ВPHP имеется широкий диапазон функций, позволяющих открывать, манипули+ ровать и выводить графику как в Web+браузер, так и на диск. В этой главе рассматри+ вается работа этих функций и их использование для создания графики для Web+ страниц. Сначала рассмотрим некоторые базовые понятия, прежде чем создавать изображения: например, теория цвета и то, как в PHP работают системы координат изображений (image coordinate systems). Затем, используя PHP+средства для рисова+ ния, читатель научится создавать изображения с нуля, чертить прямые линии, кри+ вые и различные фигуры в изображениях. Также в главе освещаются вопросы работы

ссуществующими изображениями, например, создание водяных знаков в изображе+ ниях, создание пиктограмм и добавление текста в изображение.

Функции обработки изображений, которые используются в PHP, основаны на библиотеке GD, разработанной компанией Boutell.Com (www.boutell.com). Начиная

сверсии PHP 4.3 код библиотеки был встроен в PHP+инсталляцию и включает в себя не+ которые усовершенствования первоначального кода, такие как альфа+сопряжение. Встроенная версия библиотеки GD хорошо поддерживается в PHP и, таким образом, более стабильна. С PHP5 поставляется GD версии 2.0.15, и теперь, когда истекает срок действия патентов на LZW+сжатие, в библиотеку включена только поддержка операций чтения файлов формата GIF. Кроме чтения GIF библиотека позволяет так+ же читать и записывать файлы форматов JPEG, PNG и WBMP.

Генерирование графики 607

Основы компьютерной графики

Сначала необходимо изучить некоторые базовые понятия, связанные с изображе+ ниями. Для работы с графикой следует понимать основы теории цвета и цветовую модель RGB, позиционирование элементов изображения с помощью библиотек GD, а также представлять себе особенности различных типов изображений.

Теория цвета

Компьютеры создают цвета, опираясь на теоретическую модель, которая называ+ ется RGB. Модель RGB (red, green, blue) означает красный, зеленый и синий ++++++ три основных цвета, различные комбинации которых позволяют создавать цвета, ото+ бражаемые на экране монитора. RGB+модель также называется аддитивной цветовой моделью (additive color model), потому что окончательный цвет создается комбинацией разного количества красного, зеленого и синего цветов. Значения красного, зеленого и синего цветов находятся в диапазоне от 0 до 255, а окончательный цвет определяет+ ся комбинацией трех значений. Например, чистый синий цвет имеет RGB+значение 0,0,255 ++++++ значения красного и зеленого цветов равны 0, а значение синего цвета ус+ тановлено максимальным (255). Таким образом, максимальное количество цветов, ко+ торое доступно в модели RGB, равно 256 × 256 × 256 = 16,7 миллиона.

Когда значения всех компонентов красного, зеленого и синего равны 0, получает+ ся полное отсутствие цвета или черный цвет. Аналогично, белый цвет представлен максимальными значениями всех цветов ++++++ 255.

Отдельные значения для красного, зеленого и синего цвета хранятся в 8+битовых числах ++++++ число 255 представляет собой десятичное значение восьмиразрядного дво+ ичного числа 11111111. Сложение этих восьмибитовых чисел дает битовую глубину RGB+изображения ++++++ 24 бита. Обычно битовая глубина находится в диапазоне от 1 до 64 ++++++ битовая глубина равная 1 позволяет использовать только два цвета ++++++ черный и бе+ лый, битовая глубина 8 позволяет использовать 256 цветов, а битовая глубина 64 по+ зволяет использовать в изображении миллионы цветов.

Как будет показано далее, библиотеки GD позволяют создавать как 8+ так и 24+би+ товые изображения.

Системы координат

Чтобы рисовать внутри изображения фигуры и писать текст, должна быть воз+ можность позиционировать эти фигуры и текст в изображении. Читателю несомнен+ но известна система координат, в которой координаты x и y отсчитываются вправо вверх от левого нижнего угла (рис. 16.1).

В графических функциях PHP координаты отсчитываются вправо вниз из верхне+ го левого угла (рис. 16.2).

y

x

Рис. 16.1.

x

y

Рис. 16.2.

608 Глава 16

 

 

 

300 пикселей

 

 

 

 

 

 

 

0,0

299,0

200 пикселей

 

 

 

 

 

 

0,199

299,199

 

 

 

 

 

 

 

Рис. 16.3.

Первый пиксель в левом верхнем углу имеет координаты 0,0. Это означает, что по+ следний по горизонтали пиксель в изображении имеет горизонтальную координату равную ширине изображения минус 1, а последний по вертикали пиксель имеет верти+ кальную координату равную высоте изображения минус 1. На рис. 16.3 показано изобра+ жение шириной 300 пикселей и высотой 200 пикселей и его угловые координаты в PHP.

Типы изображений

Как правило, встречается два типа изображений: векторные и растровые. В век+ торном изображении используются математические уравнения, описывающие фигу+ ры, из которых состоит изображение. Хорошим примером векторного формата явля+ ется SVG (Scalable Vector Graphics ++++++ масштабируемая векторная графика). Векторные изображения хорошо подходят для диаграмм, в которых используются прямые ли+ нии, кривые, а также разноцветные блоки, но не подходят для изображений фото+ графического типа. Растровые изображения состоят из пиксельных данных ++++++ изо+ бражение 20 × 20 пикселей составляют 400 отдельных пикселей, и каждый из этих пикселей имеет собственное RGB+значение.

Современные GD+библиотеки позволяют генерировать изображения трех основ+ ных файловых форматов Web ++++++ JPEG и PNG для Web+браузеров в настольных систе+ мах, а также WBMP для PDA+браузеров. Все указанные форматы являются растровы+ ми. GD+функции в PHP не генерируют векторные изображения.

JPEG, PNG и WBMP ++++++ файловые форматы со сжатием. Это означает, что в них исполь+ зуются математические алгоритмы для сокращения количества данных, необходимых для полного описания изображения. Эти алгоритмы весьма важны, поскольку позволя+ ют сохранить небольшие размеры файлов и сокращают время загрузки изображений.

Очень важно знать, когда следует использовать тот или иной формат. Хотя JPEG и PNG являются растровыми форматами, в них используются различные методики сжатия, и они не одинаково хорошо подходят для разных изображений.

В формате JPEG используется сжатие с потерями, в котором некоторые данные ис+ ходного изображения теряются в процессе сжатия. Этот формат наилучшим образом подходит для работы с такими изображениями, как фотографии, в которых есть мно+ жество едва различимых полутонов, но очень мало точных деталей. Этот формат сле+ дует применять, когда небольшая потеря качества не будет слишком заметной.

С другой стороны в формате PNG используется сжатие без потерь. Лучше всего его использовать для изображений, которые содержат линии и крупные блоки цвета, на+

Генерирование графики 609

пример, для мультипликационных изображений. Когда изображение распаковывает+ ся, в нем содержится вся исходная информация. Это означает, что четкие границы и прямые линии (которые страдают от JPEG+сжатия) будут точно воспроизведены.

Ранние версии GD (и соответственно PHP) поддерживали формат GIF, который

во многих аспектах похож на PNG. Однако компания Unisys запатентовала алгоритм, используемый для создания сжатых GIF*файлов, и в результате в версии GD 1.6 поддержка GIF была полностью заменена поддержкой формата PNG. Хотя форматов JPEG и PNG должно быть достаточно для всех потребностей разработчика в графике, в PHP также включена поддержка чтения формата GIF.

Работа с растровыми изображениями

Рассмотрим возможности PHP по созданию и улучшению изображений. В PHP создание и модификация изображений предполагает четыре этапа.

1.Создание пустого холста для изображения, с которым будет работать PHP. Это, по сути, зарезервированная область памяти, в которую графические функции PHP будут записывать данные создаваемого изображения.

2.Работа, связанная с рисованием изображения. Сюда включается настройка цве+ тов, рисование фигур и текста внутри изображения.

3.Отправка завершенного изображения в Web+браузер или сохранение изобра+ жения на диске.

4.Удаление изображения из памяти сервера.

Создание нового изображения

Сначала необходимо создать пустой холст нового изображения, с которым будет работать PHP. Для этого можно либо использовать функцию vimagecreate(), соз+ дающую индексированное изображение с максимальным числом цветов 256, либо функцию imagecreatetruecolor(), которая создает полноцветное изображение (максимум 16,7 млн цветов). Обе указанные функции принимают два параметра ++++++

ширину и высоту пустого изображения, которое необходимо создать:

resource imagecreate (int x_size, int y_size)

$myImage = imagecreate(200, 150);

Созданное в результате такого вызова изображение имеет ширину 200 и высоту 150 пикселей. Кроме того, функция возвращает значение. В данном случае переменная $myImage содержит идентификатор изображения, который ссылается на новое пустое изображение в памяти. Этот идентификатор используется в других графических функциях для того, чтобы однозначно идентифицировать в памяти изображение, которое необхо+ димо обрабатывать. Идентификатор изображения аналогичен дескриптору файла или идентификатору соединения с базой данных, которые упоминались в предыдущих главах.

Распределение цветов

Прежде чем начинать создавать пустое изображение, необходимо решить, какие цвета будут использоваться, а затем вызвать функцию imagecolorallocate(), кото+ рая принимает четыре параметра:

int imagecolorallocate (resource image, int red, int green, int blue)

610Глава 16

ВPHP+коде это делается следующим образом:

$myGreen = imagecolorallocate($myImage, 51, 153, 51);

Первый параметр ++++++ идентификатор изображения, для которого необходимо соз+ дать цвет. Это тот идентификатор, который возвращается функцией imagecreate() или imagecreatetruecolor(). При одновременной работе с двумя изображениями для выделения в каждом из них одного и того же цвета необходимо вызвать функцию imagecolorallocate() дважды, по одному разу для каждого изображения.

Следующие три параметра ++++++ значения красного, зеленого и синего цвета, из ко+ торых должен быть создан желаемый цвет. Как уже отмечалось, каждое из этих зна+ чений может находиться в диапазоне от 0 до 255 и определяет цвет в модели RGB.

Функция imagecolorallocate() возвращает идентификатор только что создан+ ного цвета в пределах палитры изображения, либо значение –1, если в палитру не+ возможно добавить цвет. Такое случается, когда в палитре уже содержится 256 цветов и для нового цвета просто нет места. В таком случае можно использовать функцию imagecolorresolve(), которая всегда возвращает корректный идентификатор цвета.

Функция imagecolorresolve() принимает те же параметры, что и imagecolorallocate() (идентификатор изображения и значения красного, зеленого и синего для формирования необходимого цвета), но в отличие от последней функции, кото+ рая просто пытается поместить необходимый цвет в палитру изображения, функция imagecolorresolve() сначала пытается выяснить, имеется ли этот цвет уже в па+ литре. Если это так, то функция возвращает индекс цвета. Если нет, то функция пыта+ ется добавить цвет в палитру. В случае успеха она возвращает идентификатор цвета в палитре. Если добавить цвет в палитру не удалось, то функция просматривает все цвета в палитре и возвращает идентификатор того цвета, который больше всех похож на запрашиваемый цвет.

Цвет, добавляемый в индексированное изображение (созданное функцией imagecreate()) первым, используется в качестве фонового цвета этого изображения. Изображения, созданные с помощью функции imagecreatetrucolor(), получают черный фон, и затем программист сам определяет цвет фона.

Основные функции рисования

Как только в палитру помещены все необходимые цвета, их можно использовать для рисования на пустом холсте. Графическая библиотека PHP предоставляет функ+ ции для рисования точек, линий, прямоугольников, эллипсов, дуг и многоугольников.

Все функции рисования в PHP имеют аналогичные наборы принимаемых парамет+ ров. Первым параметром всегда является идентификатор изображения, которое требу+ ется нарисовать. Количество последующих параметров может варьироваться, но всегда есть координаты x и y (в пикселях), необходимые для рисования фигур или линий. Что+ бы нарисовать только один пиксель, нужно указать только одну пару координат, а для рисования линии указываются x+ и y+координаты для начальной и для конечной точки этой линии. В качестве последнего параметра всегда указывается цвет рисуемой линии.

Рисование отдельных пикселей

Чтобы нарисовать на холсте один пиксель, можно использовать функцию imagesetpixel():

int imagesetpixel (resource image, int x, int y, int color)

Генерирование графики 611

imagesetpixel($myImage, 120, 60, $myBlack);

В данном случае функция задает цвет, определенный в палитре как $myBlack, пикселю, который является 121+м по горизонтали и 61+м по вертикали в изображении $myImage. На рис. 16.4 показано расположение этого пикселя в изображении.

 

60

 

x = 120

120

y = 60

Рис. 16.4.

Стоит еще раз напомнить, что первый пиксель находится в левом верхнем углу изображения и имеет координаты 0,0, именно поэтому координата x равная 120 пик+ селям фактически соответствует 121 пикселю в изображении, считая слева направо.

Рисование линий

Для рисования линии в изображении используется функция imageline(). Так как линия имеет начальную и конечную точки, необходимо передать функции дополни+ тельную пару координат:

int imageline (resource image, int x1, int y1, int x2, int y2, int color)

Практика Рисование линии

1. Откройте текстовый редактор и введите следующий код:

<?php

$myImage = imagecreate(200,100);

$myGrey = imagecolorallocate($myImage,204,204,204); $myBlack = imagecolorallocate($myImage, 0, 0, 0); imageline($myImage, 15, 35, 120, 60, $myBlack); header("Content-type: image/png"); imagepng($myImage);

imagedestroy($myImage); ?>

2.Сохраните файл как line.php.

3.Откройте файл в Web+браузере. На рис. 16.5 показан результат работы сценария.

Рис. 16.5.

612 Глава 16

Если расширение GD не включено (чтобы включить его, нужно раскомментировать

в файле php.ini строку extension=php_gd2.dll), то PHP сгенерирует сообщение об ошибке.

После внесения изменений в конфигурацию PHP не забудьте перезапустить сервер.

Как это работает

Сначала создается новое пустое изображение. Функция imagecreate() возвра+ щает идентификатор изображения, который сохраняется в переменной $myImage. Затем в палитру изображения добавляются два цвета ++++++ серый и черный. Поскольку серый цвет добавляется первым, он используется в качестве фона в изображении.

Чтобы нарисовать линию, используется функция imageline(). Первым парамет+ ром всегда является идентификатор изображения. Два следующих параметра указы+ вают функции imageline(), где начинается линия ++++++ в данном случае на расстоянии 16 пикселей вправо и 36 пикселей вниз от левого верхнего угла. Следующая пара па+ раметров определяет конечную точку линии ++++++ 121 пиксель вправо и 61 вниз. Послед+ ний передаваемый функции параметр ++++++ цвет линии.

После того как изображение создано, его необходимо отправить в Web+браузер. Эта операция выполняется в два этапа.

1.Для отправки Web+браузеру заголовка, указывающего тип передаваемых дан+ ных, используется функция header(). Это гарантирует, что браузер корректно отобразит содержимое.

2.Используется функция imagepng(), которой в качестве параметра передается идентификатор изображения. Эта функция отправляет Web+браузеру данные изображения, которые хранятся в переменной $myImage, в виде PNG+файла.

Наконец, с помощью функции imagedestory() изображение удаляется из памяти.

Рисование прямоугольников

Чтобы нарисовать прямоугольник, требуется указать только две точки в изобра+ жении ++++++ два противоположных угла прямоугольника. Поэтому синтаксис функции imagerectangle() в точности повторяет синтаксис imageline(). В данном случае две передаваемые пары координат используются для определения противоположных углов прямоугольника:

int imagerectangle (resource image, int x1, int y1, int x2, int y2, int col)

Откройте только что созданный файл line.php и сохраните его как rectangle.php. Замените строку:

imageline($myImage, 15, 35, 120, 60, $myBlack);

строкой:

imagerectangle($myImage,15,35,120,60,$myBlack);

Очевидно, что значения передаваемых функции imagerectangle() параметров те же, что и в примере с рисованием линии. Сохраните файл и откройте его в Web+ браузере. Изображение, сгенерированное этим сценарием, показано на рис. 16.6.

Функция imagerectangle() использует первую пару координат как координаты левого верхнего угла прямоугольника, а вторую пару ++++++ как координаты правого ниж+ него угла. Если оставить обе функции, imageline() и imagerectangle(), то сцена+ рий сгенерирует результат, показанный на рис. 16.7.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]