Ваш первый Сайт С использованием РНР-скриптов
ФУНКЦИЯ ДЛЯ СОЗДАНИЯ МИНИ-КАРТИНОК
В прошлом примере мы уменьшили картинку и в виде графической ссылки вывели ее в браузер. Однако код в листинге 8.1 далеко не совершенен. Во-первых, при создании мини-копии фиксированного размера, изображение в этой мини-картинке может быть искаженным, поскольку полные размеры самих картинок могут быть различны. Во-вторых, программа работает только с картинками формата jpeg, а хотелось бы, чтобы она обрабатывала и другие форматы, например gif и png. В-третьих, а если картинок 10 или 100? Писать код для обработки каждой картинки просто неразумно. Давайте просто составим отдельную функцию для создания мини-копии картинки и будем вызывать ее по мере надобности. Если мини-картинка, по каким-либо причинам не будет создана, то функция возвратит значение false. Если вы разобрались с прошлым кодом, то код функции для создания мини - картинок (листинг 8.2) не вызовет у вас особых затруднений.
В РНР-редакторе создайте новый файл и сохраните его в папке risynki Под названием minkartinki.php. Наберите код, приведенный внизу.
Листинг 8.2 (файл MinkartinkLphp) <?php
Function resizeimg($f, Smin, $w, $h)
{
$koaf=$w/$h;
$razmer=getimagesize($f);
$src_koaf=$razmer[0]/$razmer[l];
If (($razmer[0]<$w) && ($razmer[ll<$h)) return true;
If ($koaf<$src_koaf) $h=$w/$src_koaf;
Else $w=$h*$src_koaf;
$pust=imagecreatetruecolor($w, $h);
If ($razmer[2]==2) $img=imagecreatefromjpeg($f);
Else if ($razmer[2|=l) $img=imagecreatefromgif($f);
Else if ($razmer[2]==3) $img=imagecreatefrompng($f);
If (!imagecopyresampled($pust, $img, О, О, О, О, $w, $h, $razmer[0], $razmer|l]))
Return false;
$path=pathinfo($min);
If(($path("extension"] = "jpg") || ($path["extension"] = "JPG")) imagejpeg($pust, $min);
Else if(($path["extension"] == "gif') || ($path|"extension"] = "GIF")) imagegif($pust, $min);
Else if(($path["extension"l = "png") || ($path["extension") = "PNG")) imagepng($pust, $min); imagedestroy(Spust); imaged estroy ($img);
Return true;
}
?>
Разберем строчки данного кода:
Function resizeimg($f $min, $w, $h) - создаваемая нами функция resizeimg будет иметь 4 аргумента: $f- имя файла с исходным изображением, $min - имя файла с уменьшенной копией изображения, $w и $h - соответственно максимальные ширина и высота содаваемой уменьшенной копии. Хочу отметить, что это именно максимальные ширина и высота мини-копии. Реальные размеры будут вычисляться программно и будут соответствовать значениям, зависящим от размеров исходной картинки, чтобы не вызвать искажений;
{ - начало функции;
$koaf=$w/$h; - определяем коэффициент сжатия уменьшенной копии картинки, как соотношение ее ширины и высоты;
Srazmer=getimagesize($f); - получаем массив Srazmer с данными о графическом файле $f. В элементе массива $razmer[0] содержится ширина исходного изображения, а в элементе Srazmer[1] - высота исходного изображения. И, наконец, в элементе Srazmer[2] содержится информация о расширении (формате) исходного графического файла (см. табл. 8.1);
$src_koaf=$razmer[0]/Srazmer[1]; - определяем коэффициент сжатия исходного изображения как соотношение ее ширины и высоты; If ((Srazmer[0J<$w) && ($razmer[l]<$h)) return true; - если размеры исходного изображения меньше размеров создаваемой мини-копии, то никакой мини-копии делаться не будет и функция завершит работу;
If ($koaf<$src_koaf) $h=$w/$src_koaf; - если коэффициент сжатия мини - картинки меньше коэффицента сжатия исходной картинки, то высота создаваемой мини-картинки будет вычисляться отношением ее ширины и коэффициента сжатия исходной картинки. Это делается для того, чтобы сохранить пропорции изображения при уменьшении. Действительно, допустим, реальная картинка имеет размеры 300X100 (коэффициент сжатия равен трем), а нам нужно создать ее мини-копию размером 100X100 (коэффициент сжатия равен единице). Ширина картинки уменьшится в 3 раза, но высота-то останется прежней. В итоге изображение исказится. Чтобы этого не произошло, мы должны уменьшить высоту мини-картинки тоже в 3 раза, что мы и сделаем в этой программной строке. В итоге мы получим мини - картинку с размерами примерно 100X33. Это меньше, чем 100Х 100, но зато
Koaf; - иначе, если коэффициент сжатия мини-картинки больше коэффициента сжатия исходного изображения, то уменьшаем ширину мини-картинки (коэффициент Ssrckoaf будет меньше единицы);
$pust=imagecreatetruecolor($w, $h); - создаем в памяти пустое полноцветное изображение для нашей мини-картинки, размером $wX$h пикселей и присваиваем ему дескриптор $pust;
If ($razmerf2]==2) $img-imagecreatefromjpeg($f); - проверяем, какое расширение имеет исходный графический файл, ведь от этого зависит, какие встроенные php-функции для работы с изображением мы будем использовать. Информация о расширении, как вы помните, находится в элементе массива $razmer[2] (см. таблицу 8.1). Итак, если графический файл имеет формат Jpeg, то при помощи встроенной функции imagecreatefromjpeg создаем в памяти исходное изображение формата jpeg и присваиваем его дескриптор $img;
Else if ($razmer[2J==1) $img=imagecreatefromgif($f); - иначе, если исходный графический файл имеет расширение gif, то создаем в памяти исходное изображение формата gif
Else if ($razmer[2]==3) $img=imagecreatefrompng($f); - иначе, если исходный графический файл имеет расширение png, то создаем в памяти исходное изображение формата png;
If (! imagecopyresampled($pust, $img, 0, 0, 0, 0, $w, $h, $razmer[0], $razmer[l])) return false; - далее - функция imagecopyresampled копирует изображение, имеющее размеры $razmer[0] х $razmer[l], с дескриптором $img в созданную пустую область $pust, имеющую размер $wX$h. Если же мини-картинка по каким либо причинам не будет создана, то функция возвратит значение false. Вообще условие //здесь необязательно, и данную строку можно записать так: Imagecopyresampled($pust, $img, 0, 0, 0, 0, $w, $h, $razmer[0], $razmer[l]'), т. e. без проверки условия, но если мини-копия картинки не будет создана, например, обрабатывается картинка другого формата, не указанного в данной программе, то при выполнении этой программы произойдет ошибка;
$path=pathinfo($min); - функция pathinfo, если помните (см. гл. 4, п. «работа со строками»), возвращает массив (присвоим ему имя $path), хранящий в своих элементах: путь к директории, по которому расположен файл ($path["dirname"j), имя файла ($path["basename"]), расширение файла ($path["extension"]). Нам нужно именно расширение графического файла ми - ни-картинки, путь к которому находится в переменной $min
If(($path["extension"] == "jpg") || ($path["extension"j == "JPG")) image- jpeg($pust, $min); - если расширение файла с мини-картинкой jpg ($path["extension"] == "jpg") или JPG ($path["extension"] == "JPG"), то используем функцию сохранения jpeg изображения imagejpeg. Эта функция сохраняет изображение с дескриптором Spust в файле, указанном в переменной $min. А переменную $min мы зададим при вызове в других программах создаваемой сейчас нами этой функции minkartinki.php;
Else if(($path["extension"] == "gif) || ($path["extension'] == "GIF")) image- gif($pust, $min); - иначе, если расширение файла с мини-картинкой gij ($path["'extension"] == "gif') Или GIF ($path["extension"] == "GIF"), То используем функцию сохранения gz/изображения imagegif
Else if(($path["extension"] == "png") || ($path["extension"] = = "PNG")) im- agepng($pust, $min); - иначе, если расширение файла с мини-картинкой png ($path["extension"] == "png") Или PNG ($path["extension"] == "PNG"), То используем функцию сохранения png Изображения imagepng;
Imagedestroy(Spust); - очищаем память от созданного изображения с дескриптором $pust;
Imagedestroy($img); - очищаем память от созданного изображения с дескриптором $img;
Return true; - в случае успешного выполнения данной функции (Minkar- tinki.php), она возвратит true, хотя в программах, где мы будем использовать эту функцию, возвращаемое значение нам не понадобится. Данная функция выполнит свою задачу (создаст и сохранит мини-картинку) и закончит работу; } - окончание функции.
Итак, функция для создания мини-копий графических изображений создана. Теперь мы ее будем использовать в. дальнейшем.