![Использование php для графики](http://lines.net.ua/images/articles/16.gif)
Далеко не всегда графика на веб-ресурсе используется исключительно для придания ему уникального внешнего вида. Зачастую у разработчика возникает необходимость использовать графические представления для наглядного отображения приводимых на сайте данных, показывать в материалах сайта динамически изменяемые в зависимости от каких-либо условий или поведения и запросов пользователя иллюстрации, защищать формы для отправки данных на сервер графическим подтверждением, изменяюшимся при каждом обращении к форме. Обычными картинками, созданными в любом графическом редакторе, тут не обойтись - и на помощь приходит PHP с его мощными средствами работы с изображениями.
Для создания и всевозможных манипуляций с изображениями форматов jpeg, png, tiff, gif вам понадобится библиотека gd_library. Начиная с версии PHP 4.3 эта библиотека является встроенной. Вам необходимо установить или перекомпилировать PHP с указанием --with-gd. Для пользователей Windows необходимо в файле php.ini указать расширение extension=php_gd2.dll.
Gd-library - это open-source (проект с открытым кодом), работа над новыми версиями ведется постоянно. Получить свежайший релиз библиотеки возможно на официальном сайте , там же доступна и подробная документация по работе с функциями.
При работе с изображениями разработчику может понадобиться поддержка дополнительных шрифтов и форматов - имеются специальные расширения библиотеки gd для работы с форматами gif, xpm и другими, а также для установки дополнительных шрифтов.
Рассмотрим основные функции, позволяющие создавать, модифицировать и выводить в броузер изображения.
Функции для создания изображений из уже существующих:
Imagecreatefromgif(), imagecreatefrompng(), imagecreatefromjpeg() и подобные, принимая в качестве аргумента url или путь к файлу изображения, возвращают идентификатор, представляющий данное изображение.
Например: $image = imagecreatefromgif('path/to/your/image.gif') вернет идентификатор картинки image.gif, посредством которого в последствии можно модифцировать изображение, выводить на него текст, комбинировать его с другими изображениями. В случае неудачи выполнения функции этого типа возвращают false, то есть проверить и обработать неудачу легко можно, сделав проверку типа:
if (!$image = @imagecreatefromgif('path/to/your/image.gif'))
{
//код, который необходимо выполнить в случае, если изображение открыто не было
}
Функции для создания нового изображения:
Imagecreatetruecolor(), imagecreate() создают пустые изображения, принимая в качестве параметра ширину и высоту создаваемого изображения в пикселах. Таким образом, если в предыдущем примере нам не удалось создать идентификатор уже существующего изображения, мы может создать новое изображение.
if (!$image = @imagecreatefromgif('path/to/your/image.gif'))
{
$image = imagecreatetruecolor(88, 31); //если не было создано изображение на основе image.gif, мы создаем новую картинку размером 88 на 31 пикселов
}
Функции для работы с цветами:
Imagecolorallocate() - принимая в качестве аргументов идентификатор изображения и три компоненты нужного цвета (RGB: красную, зеленую и синюю составляющую), определяет нужный цвет для данного изображения.
В нашем примере определим цвета фона и шрифта для вывода текста:
$fontcolor = imagecolorallocate($image, 0, 0, 0);
$backgroundcolor = imagecolorallocate($image, 255, 255, 255);
Функции заливки изображения цветом:
Imagefill(), imagefilledrectangle(), imagefilledarch(), imagefilledellipse() и прочие imagefill… функции, принимая в качестве аргументов координаты геометрических фигур на изображении, обеспечивают заливку этих частей картинки указанным цветом. К примеру, зальем наш прямоуголник цветом фона:
imagefill($image, 0, 0, $backgroundcolor); //здесь 0, 0 - это координаты левого верхнего угла заливаемой площади.
Функции для вывода текста:
Imagestring(), imagettftext(), imagestringup() выводят на изображении текст в различных направлениях, используя различные шрифты.
Например,
imagestring($image, 5, 0, 0, 'text', $fontcolor); //выводим слово text на наше изображение $image встроенным шрифтом по координатам (верхняя левая точка) 0, 0.
На этой стадии у вас может возникнуть проблема с выводом текста на русском языке - встроенные шрифты (для функции imagestring() 1-5 в зависимости от размера) не поддерживают кириллицу, и даже при указании своего шрифта функции imagettftext() кириллица может выводиться в неверной кодировке.
Есть несколько способов решения этой проблемы. Самый простой - конвертировать строку с символами кириллицы в кодировку UTF-8:
$text = iconv("windows-1251", "UTF-8", "наш текст");
Также нам может помочь загрузка своего шрифта, например, формата .phpfont посредством imageloadfont(). Такой шрифт может быть создан в специальном редакторе, и будет поддерживать все необходимые вам символы, в том числе и русские буквы. Благодаря этой возможности вы также можете использовать нестандартные шрифты - все, на какие способно ваше воображение.
Слияние изображений:
Imagecopymerge(), imagecopy(), imagecopymergegray(), imagecopyresampled(), imagecopyresized(). Функции gd_library могут также управляться не с одним, а с несколькими изображениями. Например, функция imagecopy() позволяет наложить одно изображение на другое по точно указанным координатам. Эта возможность широко используется в популярном сейчас сервисе отсчета времени на графическом измерителе (линейки отсчета времени metric): суть отсчета заключается в том, что координаты расположения "бегунка" на измерителе определяются в зависимости от количества прошедших дней/месяцев/лет с момента начала отсчета.
Напрмер:
imagecopy ( resource $image, resource $another_image, int x_координата_назначения, int y_координата_назначения, int x_координата_источника, int y_координата_источника, int ширина_копируемого_изображения, int высота_копируемого_изображения )
Добавление специальных эффектов:
Множество функций gd_library позволяют добавлять специальные эффекты на текущее изображение, рисовать на нем новые объекты, выделять определенные области и прочее. Приведем всего несколько примеров:
- функция imagedashedline() - рисует пунктирную линию;
- функция imageellipse() - рисует эллипс;
- функция imagesetbrush() - создает кисть;
- функция imagefilter() - применяет изображению определенный фильтр, например, инвертирует цвета изображения, переводит изображение в черно-белый режим, изменяет яркость, контраст изображения, добавляет фаску и прочее.
Выдача полученного изображения пользователю:
Функции вида imagegif(), imagepng(), imagejpeg() выводят полученный результат в броузер или в файл. Не забудьте, что заголовок Content-Type для таких скриптов должен быть переопределен:
header("Content-type: image/gif");
imagegif($image);
Доведем наш пример до логического завершения. Предположим, нашей целью было создание так называемой капчи (captcha), то есть картинки, на которой при каждом обращении к странице будет демонстрироваться новая последовательность из символов - например, четырхзначное число.
![Приведенный пример создания изображения можно усложнить: добавить тень, фильтры, наклон, заменить цифры на буквы](http://lines.net.ua/images/articles/18.gif)
//пробуем создать капчу из картинки с каким-нибудь "шумным" фоном:
if (!$image = @imagecreatefromgif("path/to/your/image.gif"))
{
//если не было создано изображение на основе image.gif, мы создаем новую картинку размером 88 на 31 пикселов
$image = imagecreatetruecolor(88, 31);
//определяем цвет фона:
$backgroundcolor = imagecolorallocate($image, 255, 255, 255);
//заливаем полученное изображение выбранным цветом:
imagefill($image, 0, 0, $backgroundcolor);
}
//определяем цвет шрифта:
$fontcolor = imagecolorallocate($image, 0, 0, 0);
//создаем случайное четырехзначное число:
$text = mt_rand(1000, 9999);
//выводим число на картинку:
imagestring($image, 5, 0, 0, "text", $fontcolor);
//и выдаем полученный результат пользователю:
header("Content-type: image/gif");
imagegif($image);
Данный скрипт всегда можно усложнить, например, добавив угол наклона для надписи, тень от цифр, применив фильтры к полученному изображению.
Работа с фотографиями:
Расширение exif. позволяет работать с информацией, хранящейся в заголовках цифровых фотографий. Для работы с функциями данного расширения нет необходимости ни в каких дополнительных библиотеках, PHP просто должен быть установлен с поддержкой --enable-exif. Для пользователей Windows: в файле php.ini должны быть указаны расширения extension=php_mbstring.dll и extension=php_exif.dll, при том mbstring обязательно должен быть указан первым.
Функция exif_imagetype(), принимая в качестве аргумента путь к файлу, позволяет определить формат изображения. Это необходимо для того, чтобы не применять другие функции exif к изображениям неподдерживаемых форматов. Формат изображения для последующей работы с данными функциями должен быть gif, jpeg, png, swf, psd, bmp, tiff_II, tiff_MM, jpc, jp2, jpx, jb2, swc, iff, wbmp, xbm.
Функция exif_read_data() считывает exif заголовки из файлов формата jpeg и tiff.
Например:
![Такую информацию можно получить о цифровом фото средствами exif](http://lines.net.ua/images/articles/19.gif)
//проверяем, действительно ли формат данного изображения jpeg
if (exif_imagetype("image.jpeg") == IMAGETYPE_JPEG)
{
//считываем заголовки
$imagedata = exif_read_data("image.jpeg", 0, true);
if ($imagedata === false)
echo "No headers"; //если заголовки отсутствуют
else
{
//выводим массив заголовков по секциям
foreach ($imagedata as $key => $section)
{
foreach ($section as $name => $value)
echo "$key.$name : $value";
}
}
}
else
echo "Non supported format";
В этой статье описаны возможности применения лишь некоторых функций как gd_library, так и exif-extension. Более подробную информацию обо всех доступных функциях работы с изображениями в PHP можно найти на страницах официального сайта, в разделе .
Angie D. Walker
Статья написана для издательства , все права на эту статью принадлежат издетальству. Перепечатка и любое использование материала категорически запрещаются.