ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

Разработка отдельных фрагментов сайтов, консультации по вопросам верстки веб-страниц и веб-программирования.

Работа с изображениями. Подключение графической библиотеки

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

Графическая библиотека РНР предназначена для генерации изображений в форматах 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

Рассмотрим более подробно наиболее часто используемые из таблицы функции.

Текущая версия библиотеки GDLib

Функция 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-типа файла

Аббревиатура 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, а идентификатор подтипа расшифровывает формат файла:

  • image/gif — изображение в формате GIF;
  • image/jpeg — изображение в формате JPEG;
  • image/png —изображение в формате PNG.

Запоминать значения 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");
?>