Графика средствами PHP
работа с функциями gd_library, exif
Далеко не всегда графика на веб-ресурсе используется исключительно для придания ему уникального внешнего вида. Зачастую у разработчика возникает необходимость использовать графические представления для наглядного отображения приводимых на сайте данных, показывать в материалах сайта динамически изменяемые в зависимости от каких-либо условий или поведения и запросов пользователя иллюстрации, защищать формы для отправки данных на сервер графическим подтверждением, изменяющимся при каждом обращении к форме. Обычными картинками, созданными в любом графическом редакторе, тут не обойтись – и на помощь приходит PHP с его мощными средствами работы с изображениями.
Для создания и всевозможных манипуляций с изображениями форматов jpeg, png, tiff, gif вам понадобится библиотека gd_library. Начиная с версии PHP 4.3 эта библиотека является встроенной. Вам необходимо установить или перекомпилировать PHP с указанием --with-gd. Для пользователей Windows необходимо в файле php.ini указать расширение extension=php_gd2.dll.
Gd-library – это open-source (проект с открытым кодом), работа над новыми версиями ведется постоянно. Получить свежайший релиз библиотеки возможно на официальном сайте http://www.libgd.org/, там же доступна и подробная документация по работе с функциями.
При работе с изображениями разработчику может понадобиться поддержка дополнительных шрифтов и форматов – имеются специальные расширения библиотеки 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.
Кроме встроенных шрифтов вы можете использовать зарегистрированные посредством функции imageloadfont() шрифты. Функция imagettftext() позволяет использовать шрифты типа true type.
Сервис отсчета времени позволяет продемонстрировать работу основных функций gd |
На этой стадии у вас может возникнуть проблема с выводом текста на русском языке – встроенные шрифты (для функции 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), то есть картинки, на которой при каждом обращении к странице будет демонстрироваться новая последовательность из символов – например, четырехзначное число.
Приведенный пример создания изображения можно усложнить: добавить тень, фильтры, наклон, заменить цифры на буквы |
<?php
//пробуем создать капчу из картинки с каким-нибудь "шумным" фоном:
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 |
<?php
//проверяем, действительно ли формат данного изображения 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 можно найти на страницах официального сайта в разделе Image Functions и Exif Functions.