Графическая библиотека РНР предназначена для генерации изображений в форматах GIF, PNG, JPEG и др.
JPEG. Идеален для фотографий, но сжатие изображения происходит с потерями качества, так что этот формат совершенно не подходит для хранения различных диаграмм и графиков.
GIF. Позволяет достичь довольно хорошего соотношения размер/качество, в то же время не искажая изображение; применяется в основном для хранения небольших точечных рисунков и диаграмм.
PNG. Сочетает в себе хорошие стороны как JPEG, так и GIF, но в настоящий момент ему почему-то не выражают особого доверия — скорее, по историческим причинам, из-за нежелания отказываться от GIF и т. д.
Для работы с графической библиотекой надо подключить необходимые расширения. В первую очередь, это библиотека gd2. Для чтения метаданных из файлов фотографий, сделанных цифровой камерой используется функция из библиотеки exif. При работе с графикой может потребоваться еще и библиотека mbstring, которая представляет специальные функции для работы со строками в многобайтовых кодировках. Эти библиотеки должны быть указаны в файле php.ini:
extension=php_mbstring.dll
extension=php_exif.dll
extension=php_gd2.dll
Посмотреть, поддерживается ли графическая библиотека, можно, вызвав функцию phpinfo() и найдя в ней раздел gd.
Все функции, которые необходимы для создания динамических изображений, будут условно разбиты на восемь разделов:
Примечание. При работе с функциями GDLib следует учитывать, что координаты абсцисс X и Y отсчитываются, как это принято в большинстве графических систем (из левого верхнего угла), а не вдекартовой системе координат (из левого нижнего угла).
Информационные функции предоставляют информацию о текущей версии библиотеки, а также параметры изображений. В таблице приводится список функций относящихся к этой группе.
Функция | Описание |
gd_info() | Возвращает ассоциированный массив с информацией об установленной библиотеке GD |
exif_imagetype($filename) | Читает несколько первых байтов файла $filename и определяет формат изображения |
exif_read_data($filename [, $sections [, $arrays, [, $thumbnail]]]) |
Читает заголовки файлов форматов JPEG и TIFF и возвращает ассоциированный массив со свойствами секций этого файла |
exif_thumbnail($filename [, &$width [, &$height [, &$imagetype]]]) |
Возвращает встроенные эскизы (уменьшенные изображения) файлов форматов JPEG и TIFF |
getimagesize($filename [, &$imageinfo]) |
Возвращает размер в пикселях и тип файла $filename, кроме того, может возвращать дополнительную информацию об изображении в дополнительном параметре $imageinfo |
imagesx($image) | Возвращает ширину изображения в пикселях. В качестве параметра $image функция принимает дескриптор открытого изображения. |
imagesy($image) | Возвращает высоту изображения в пикселях. В качестве параметра $image функция принимает дескриптор открытого изображения |
image_type_to_mime_type ($imagetype) |
Определяет MIME-типы для констант imagetype, возвращаемых функциями getimagesize(), exif_read_data(), exif_thumbnail(), exif_imagetype() |
imagetypes() | Возвращает битовое поле, соответствующее форматом изображений, которые поддерживаются текущей реазизацией РНР и билиотеки GD. Возвращаемое битовое поле может содержать следующие биты: IMG_GIF|IMG_JPG|IMG_PNG|IMG_WBMP |
Рассмотрим более подробно наиболее часто используемые из таблицы функции.
Функция gd_info() возвращает ассоциированный массив, элементы которого позволяют определить версию библиотеки, а также поддерживающие форматы.
Вызов функции gd_info()
<?php
$arr = gd_info();
echo "<pre>";
print_r($arr);
echo "</pre>";
?>
В окне веб-браузера это будет выглядеть ТАК.
В результате работы скрипта вернулась следующая информация:
Первый элемент массива GD Version сообщает о том, текущей является версия 2.0.34. Элементы возвращаемого функцией gd_info() массива описываются в таблице.
Атрибуты и значения возвращаемого ассоциированного массива
Элемент | Описание |
GD Version | Версия библиотеки GD |
FreeType Support | Возвращает true, если установлена поддержка шрифтов Freetype |
FreeType Linkage | Описывает, каким образом включена поддержка шрифтов Freetype. Возможны следующие значения: 'with freetype', with TTF library', with unknown library'. Этот параметр существует, только если Freetype Support = true |
T1Lib Support | Возвращает true, если включена поддержка шрифтов PostScript Type1 |
GIF Read Support | Возвращает true, если если включена поддержка чтения файлов формата GIF |
GIF Create Support | Возвращает true, если включена возможность создания изображений в формате GIF |
JPG Support | Возвращает true, если если включена поддержка формата JPEG |
PNG Support | Возвращает true, если если включена поддержка формата PNG |
WBMP Support | Возвращает true, если если включена поддержка формата WBMP |
XPM Support | Возвращает true, если если включена поддержка формата XPM |
JIS-mapped Japanese Font Support | Возвращает true, если если включена поддержка японских иероглифов |
Примечание. О параметрах библиотеки GDLib можно узнать также из отчета функции phpinfo().
Определить формат файла позволяет функция exit_imagetype(), которая читает несколько первых байтов файла и определяет формат изображения. Если формат определен, то возвращается константа, соответствующая типу файла, в противном случае возвращается false.
Соответствие констант идентификаторов файлов
Возвращаемое значение | Соответствующая значению константа |
1 |
IMAGETYPE_GIF |
2 |
IMAGETYPE_JPEG |
3 |
IMAGETYPE_PNG |
4 |
IMAGETYPE_SWF |
5 |
IMAGETYPE_PSD |
6 |
IMAGETYPE_BMP |
7 |
IMAGETYPE_TIFF_II |
8 |
IMAGETYPE_TIFF_MM |
9 |
IMAGETYPE_JPC |
10 |
IMAGETYPE_JP2 |
11 |
IMAGETYPE_JPX |
12 |
IMAGETYPE_JB2 |
13 |
IMAGETYPE_SWC |
14 |
IMAGETYPE_IFF |
15 |
IMAGETYPE_WBMP |
16 |
IMAGETYPE_XBM |
Для получения размера файла предназначена функция getimagesize(), которая принимает в качестве первого параметра путь к файлу (допускается в том числе и сетевой путь, начинающийся с http://) и возвращает массив из четырех элементов: ширину изображения, высоту изображения, одно из значений представленных в предыдущей таблице, и строку формата "width = x height = y", которая может быть использована в HTML-теге <IMG> (вывод изображения). Для изображений формата JPEG возвращается три дополнительных элемента: chenel, bits, mime. Элемент chenel содержит значение 3 для RGB-изображений и 4 для CMYK-изображений ; bits — количество бит для каждого из цветов; mime возвращает MIME-тип файла, например, для JPEG-файлов будет возвращаться строка "image/jpeg".
Использование функции getimagesize()
<?php
list($width, $height) = getimagesize("images/100-IMGA0390.JPG");
echo "<img src= images/100-IMGA0390.JPG width=$width height=$height>";
?>
В окне веб-браузера это будет выглядеть ТАК.
В приведенном примере, размеры изображения определяются автоматически при помощи функции getimagesize() и подставляются в HTML-тег <IMG>. А теперь рассмотрим альтернативный вариант, в котором для указания размера изображения используется четвертый элемент массива, возвращаемого функцией getimagesize().
Альтернативный способ указания размера в HTML-теге <IMG>
<?php
list($width, $height, $type, $size)=getimagesize("images/100-IMGA0390.JPG");
echo "<img src=images/100-IMGA0390.JPG $size";
?>
В окне веб-браузера это будет выглядеть ТАК.
Как будет показано ниже, основная часть функций библиотеки GDLib работает с изображениями по схеме, напоминающей схему работы с файлами. Изображение открывается при помощи одной из функций открытия, которые возвращают дескриптор изображения. Этот дескриптор передается всем функциям, которые осуществляют манипуляции с изображением (при помощи дескрипторов одно открытое изображение отличается от другого). После завершения всех операций изображение закрывается. При работе в таком режите более удобными являются функции imagesx() и imagesy(), возвращающие соответственно высоту и ширину изображения. Однако в отличии от функции getimagesize(), в качестве параметра эти функции принимают не имя файла, а дескриптор открытого изображения.
Аббревиатура MIME дословно расшифровывается как Multiporpose Internet Mail Extensions (Многоцелевые Расширения Электронной Почты). Это расширение было введено для обозначения форматов файлов, которые прикрепляются в качестве вложения к электронным письмам. В разных средах это позволяет автоматически подбирать предложения, которые способны адекватно открывать такой файл.
В настоящее время MIME-типы используются не только в почте, но в веб-среде. Так, при отправке любого документа с сервера MIME-тип передается в HTML-заголовке Content_Type. Это позволяет браузеру клиента правильно работать с текстом, HTML-страницами, графикой, музыкальными и видеофайлами. Например, для HTML-страниц посылается MIME-тип text/html, который сообщает браузеру, что ему пересылается HTML-страница для интерпретации. Однако если послать MIME-тип text/plain, соответствующий обычному тексту, браузер вместо интерпретации отобразит HTML-код страницы как есть.
Строка с MIME-типом состоит из двух частей: идентификатора типа и идентификатора подтипа, разделенных косой чертой /. Так для текстовой информации идентификатор типа принимает значение text, a идентификатор подтипа может принять два значения: html и plain. Для изображений идентификатор типа принимает значение image, а идентификатор подтипа расшифровывает формат файла:
Запоминать значения MIME-типов необязательно, их всегда можно получить автоматически. Функция image_type_to_mime_type() принимает в качестве параметра значение константы и возвращает соответствующий ей MIME-тип.
Получение MIME-типа изображения
<?php
list($width, $height, $type)=getimagesize("images/100-IMGA0390.JPG");
echo image_type_to_mime_type($type); //возвращает image/jpeg
?>
В окне веб-браузера это будет выглядеть ТАК.
При использовании функции getimagesize() для получения MIME-типа можно воспользоваться элементом mime возвращаемого массива.
Получение MIME-типа изображения с помощьюэлемента mime
<?php
$arr=getimagesize("images/100-IMGA0390.JPG");
echo $arr['mime']; //возвращает image/jpeg
?>
В окне веб-браузера это будет выглядеть ТАК.
В таблице приведены принимаемые функцией image_type_to_mime_type() значения и возвращаемые ею MIME-типы.
Соответствие констант GDLib и MIME-типов
Константа | Числовое значение | MIME-тип |
IMAGETYPE_GIF |
1 |
image/gif |
IMAGETYPE_JPEG |
2 |
image/jpeg |
IMAGETYPE_PNG |
3 |
image/png |
IMAGETYPE_SWF |
4 |
application/x-shockwave-flash |
IMAGETYPE_PSD |
5 |
image/pcd |
IMAGETYPE_BMP |
6 |
image/bmp |
IMAGETYPE_TIFF_II |
7 |
image/tiff |
IMAGETYPE_TIFF_MM |
8 |
image/tiff |
IMAGETYPE_JPC |
9 |
application/octet-stream |
IMAGETYPE_JP2 |
10 |
image/jp2 |
IMAGETYPE_JPX |
11 |
application/octet-stream |
IMAGETYPE_JB2 |
12 |
application/octet-stream |
IMAGETYPE_SWC |
13 |
application/x-shockwave-flash |
IMAGETYPE_IFF |
14 |
image/iff |
IMAGETYPE_WBMP |
15 |
image/vnd.wap.wbmp |
IMAGETYPE_XBM |
16 |
image/xbm |
MIME-типы часто используются для отправки изображений в среде веб. Рассмотрим пример, где скрипт, передает изображение в окно браузера без использования HTML-тега <IMG>. Если перед телом изображения не отправлять HTML-заголовок Content-Type с соответствующим MIME-типом вместо изображения, браузер попытается вывести бинарное содержимое файла.
Вывод изображения без использования HTML-тега <IMG>
<?php
list($width, $height, $type)=getimagesize("images/100-IMGA0390.JPG");
//Отправляем HTTP-заголовок Content-type
$header="Content-type: ".image_type_to_mime_type($type);
header($header);
//Отправляем размер файла
$header="Content-type: ". filesize("images/100-IMGA0390.JPG");
header($header);
//Отправляем содержимое файла
echo file_get_contents("images/100-IMGA0390.JPG");
?>