|
В данной статье описаны некоторые приёмы работы с 2-х мерной графикой в PHP на примере сценария для уменьшения изображения. Они могут быть полезны как для начинающих PHP программистов, так и для специалистов. В своё время проиллюстрированые в этой статье функции были разработаны автором, как часть сценария фотогалереи. И, хотя изначально программа была написана на Perl, перевести её на PHP не составляло особого труда. Т.к. для работы с графикой в программе используется библиотека GD (вер. 2) с которой можно работать не только из Perl и PHP, но и из Си. В частности, в дистрибутиве PHP имеется стандартный модуль для поддержки GD. Вкратце о том, как добавить поддержку этой библиотеки в PHP, говорится в следующей части данной статьи. Следовательно, если на вашем веб-сервере уже установлена библиотека GD и PHP настроен надлежащим образом для работы с ней, можете спокойно пропустить следующую часть статьи.
Установка библиотеки GDДля ОС Windows Библиотека включена в дистрибутивы всех последних версий PHP (например у меня 4-ая версия). Для её подключения к PHP достаточно отредактировать файл “%SysDir%\php.ini” следующим образом: 1. extension_dir = "полный_путь_к_каталогу php\extensions";
2. extension=php_gd2.dll Данная строка по умолчанию является закомментированой, удалите символ “;” в начале её. После чего необходимо перезапустить web-сервер. Для Unix`like ОС Последовательность действий: 1. Загрузить дистрибутив GD с сайта разработчика http://www.boutell.com/gd 2. Выполнить комманды: - ./configure
- make
- make install
Описание сценария Сценарий представляет из себя 2 функции: minimizeImg - основная задача этой функции- уменьшить изображение до заданных размеров. Она уменьшает исходное изображение в n раз (где n - целое, положительное число) и если полученное изображение немного вылезает за заданные гранницы, либо наоборот имеет меньшие, чем указанные функции размеры, то изображение урезается или размещается посередине соответственно (ниже проиллюстрированы примеры). Кроме основной задачи, функция может также преобразовать изображение из одного типа в другой (будет работать только с типами поддерживаемыми установленной у вас версией GD).
Функция получает на вход: · $width - требуемую ширину изображения; · $height - требуемую высоту изображения; · $fin - (нет, это ещё не конец по французски=) имя и путь к файлу с исходным изображением; · $fout - имя и путь к файлу, куда будет записано уменьшенное изображение. Функция возвращает: · 0 - не удалось уменьшить изображение; · 1 - функция отработала успешно (изображение уменьшено). getImageType - функция определяющая тип изображения по расширению файла. Является вспомогательной для minimizeImg.Функция получает на вход: · $filename - имя файла, содержащего изображение; Функция возвращает: · Jpeg · Gif (GD открывает этот тип изображений только для чтения. Это связанно с авторскими правами формата “gif”.
· Png · 0 - тип изображения не поддерживается GD (ver. 2) Исходники сценария <?php
//############################################# // Функция getImageType определяет формат // изображения по расширению его файла. // В нашем случае,она является вспомогательной // для функции minimizeImg (см. ниже);
// Вход: $filename - название файла.
// Выход: Если тип изображения поддерживается // библиотекой GD (ver. 2.), то функция возвращает // его название, иначе 0.
function getImageType($filename) { if (preg_match('!\.(jpg|jpeg)$!si',$filename)) { return 'Jpeg'; } else if (preg_match('!\.gif$!si',$filename)) { return 'Gif'; } else if (preg_match('!\.png$!si',$filename)) { return 'Png'; } return 0; }
// После вызова функция getImageType // начинает сравнивать расширение файла // переданного ей в качестве параметра // (значение переменной $filename) // с расширениями типов поддерживаемых GD. // Для этого используются регулярные выражения. // Если результатом хотя бы одной проверки // будет истина, функция вернёт название // соответствующего типа. Иначе, результатом // выполнения функции окажется 0.
//############################################# // Функция minimizeImg уменьшает изображение // (имя файла = $fin) в n раз // (где n-натуральное число). // // Если уменьшенное изображения будет немного // не помещаться в указанные рамки // (значения переменных $width и $height), // оно будет урезано до этих размеров.Если // уменьшенное изображение окажется меньше, // оно будет размещено посередине // картинки - результата ($fout).
function minimizeImg($width,$height,$fin,$fout) {
// Пытаемся узнать размеры изображения из файла // $fin. Если результат "ложь", то функция // выдаёт 0 и заканчивает свою работу.
if (!$size=GetImageSize("$fin")) { return 0; }
// С помощью вышеописаной функции // getImageType узнаём тип исходного изображения // и запоминаем его на будущее в переменной // $typein. Таким же образом распознаём тип // изображения-результата и запоминаем // в переменной $typeout.
$typein=getImageType($fin); $typeout=getImageType($fout);
// Если тип хотя бы одного изображения // не установлен (о чём будет свидетельствовать // значения равное 0 в $typein или/и $typeout), // либо изображение-результат имеет тип "gif" // происходит выход из функции (возвращаемый // результат - 0. if (($typeout=='Gif')||($typeout=='0')||($typein=='0')) { return 0; }
// С помощью функции ImageCreateFrom[Type] // загружаем файл ($fin) и присваиваем // указатель на изображение переменной $im_in. // Где [Type]- тип открываемого изображения. // Чтобы осуществить столь хитрую операцию, // нам приходиться использовать функцию eval.
eval('$im_in=ImageCreateFrom'.$typein.'("$fin");');
// Делим ширину исходного изображения на ширину // заданую для результирующего изображения. Результат // запоминаем в $wm. // Делим высоту исходного изображения на // высоту результирующего изображения. // Результат запоминаем в $hm.
$wm=$size[0]/$width; $hm=$size[1]/$height;
// Сравниваем значения переменных $wm и $hm. // В результате в $hm оказывается наибольшее // из 2-ух значений.
if ($wm>$hm) { $hm=$wm; }
// Вычисляем высоту уменьшенного // изображения ($ah) - делим ширину исходного изображения // на значение переменной $hm и "откидываем" // дробную часть полученного значения // (в PHP не существует операции целочисленного // деления). // Подобным же образом вычисляем ширину // рез. изображения.
$ah=(int) $size[1]/$hm; $aw=(int) $size[0]/$hm;
// Присваиваем начальные значения координат // рез. изображения.
$x1=0; $y1=0;
// Если ширина уменьшеного изображения // получается меньше указанной, то // изображение будет распологатся посередине. // рез. изобр. Тоже относится к высоте. // В результате уменьшеное изображение // будет в центре, а вокруг него будет рамка.
if ($aw<$width) { $x1=(int) ($width-$aw)/2; } if ($ah<$height) { $y1=(int)($height-$ah)/2; }
// Создаём изображение требуемых размеров // и присваиваем его указатель переменной // $im_out.
$im_out=ImageCreate($width,$height);
// Определяем цвет рамки (в данном случае RGB(0,0,0)- // - чёрный) и присваиваем его переменной $bgcolor.
$bgcolor=ImageColorAllocate($im_out,0,0,0);
// Выводим рамку на рез. изображение.
ImageRectangle($im_out,0,0,$width,$height,$bgcolor);
// Уменьшаем исх. изобр. и выводим его на рез. изобр. // P.S: В результате работы функции ImageCopyResized // исх. изобр. уменьшается в n раз. Где n-целое, // положительное число.
ImageCopyResized($im_out,$im_in,$x1,$y1,0,0,(int) $size[0]/$hm,(int) $size[1]/$hm,$size[0],$size[1]);
// Сохраняем полученное изображение ($im_out) // в файл ($fout). // Для этого используется функция Image[Type] // Где [Type] - тип изображения. // В нашем случае,для реализации коректного вызова // последней функции необходимо использовать eval.
eval('Image'.$typeout.'($im_out,$fout);');
// Удаляем изображения из памяти. // При успешном завершении функция выдаёт 1.
ImageDestroy($im_in); ImageDestroy($im_out); return 1; }
?> Тестируем сценарий Для того, чтобы убедиться, что сценарий работает как надо, необходимо его испытать в действии. Ниже приведены результаты таких испытаний.  Исходное изображение (450x338 Jpeg)  Уменьшенное изображение (300x250 Jpeg)  Уменьшенное изображение (250x200 Jpeg) Автор:
This e-mail address is being protected from spam bots, you need JavaScript enabled to view it
Views: 261
 Be first to comment this article | | |