Всем доброго времени суток.
Вот хорошая функция для ресайза и обрезания фотографии под необходимый размер на PHP. Работает таким образом: передаем в функцию путь до картинки и название нужного размера изображения, далее функция проверяет существует ли уже отрезайженная картинка в кэш-папке, если есть — то возвращает её путь, если нет — функция пропорционально уменьшит картинку до большей стороны, отцентрирует картинку, обрежет остатки и возвратит путь. Если новые размеры будут больше чем существующие, ресайза не произойдет и просто вернётся путь.
Код функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
function x_resize_crop($file, $name) { // первый параметр - путь до картинки, второй - название размеров, у нас это big и small ini_set('memory_limit', '128M'); // побольше памяти возьмем $DOCUMENT_ROOT = rtrim( getenv("DOCUMENT_ROOT"), "/\\" ); // серверный путь до корня сайта $HTTP_HOST = getenv("HTTP_HOST"); // адрес сайта $HTTP_FILES_PATH = "/images/"; // папка со всеми картинками (от корня сайта) $FILES_FOLDER = $DOCUMENT_ROOT.$HTTP_FILES_PATH; // полный путь до папки с картинками switch($name) { // все размеры, можно добавлять сколько угодно case 'small': $resizeToWidth = 153.75; $resizeToHeight = 155; break; // маленькая case 'big': $resizeToWidth = 315; $resizeToHeight = 315; break; // большая } $file = str_replace("h_", "", $file); // подготовим имя файла $imgcache = "resized/".$name.'-'.substr($file, strrpos($file, "/") + 1, strlen($file)); //путь до новой картинки в кэш-папке if (!file_exists($FILES_FOLDER.$imgcache) and $file and file_exists($DOCUMENT_ROOT.$file)) { // если файла в кэш-папке нет list($width, $height, $itype) = getimagesize($DOCUMENT_ROOT.$file); // присваиваем переменным данные картинки switch($itype) { // в зависимости от формата создаем новые изображения case 1: $image = imagecreatefromgif($DOCUMENT_ROOT.$file); break; case 2: $image = imagecreatefromjpeg($DOCUMENT_ROOT.$file); break; case 3: $image = imagecreatefrompng($DOCUMENT_ROOT.$file); break; } if ($resizeToWidth >= $width) { // если нужная ширина меньше исходной $resizeToWidth = $width; // оставим её как есть } if ($resizeToHeight >= $height) { // если нужная высота меньше исходной $resizeToHeight = $height; // оставим её как есть } /* МАГИЯ С ПРОПОРЦИЯМИ И ЦЕНТРОВКОЙ */ $resizeWidthRatio = $width / $resizeToWidth; $resizeHeightRatio = $height / $resizeToHeight; $resizeRatio = min($resizeHeightRatio, $resizeWidthRatio); $resizeX = ($width / 2) - ($resizeToWidth / 2) * $resizeRatio; $resizeY = ($height / 2) - ($resizeToHeight / 2) * $resizeRatio; $image_n = imagecreatetruecolor($resizeToWidth, $resizeToHeight); // создаем новое полноцветное изображение if ($itype == 3) { // фигня для png imagealphablending($image, false); imagesavealpha($image, true); imagealphablending($image_n, false); imagesavealpha($image_n, true); } imagecopyresampled($image_n, $image, 0, 0, $resizeX, $resizeY, $resizeToWidth, $resizeToHeight, $width - 2 * $resizeX, $height - 2 * $resizeY); // копирование и изменение размера изображения с ресемплированием if ($itype == 3) { imagepng($image_n, $FILES_FOLDER.$imgcache); // новое png } else { imagejpeg($image_n, $FILES_FOLDER.$imgcache, 90); // или jpg } } return $HTTP_FILES_PATH.$imgcache; // возвращаем путь } |
Теперь можно вызвать функцию например так:
1 |
img src="<?php echo x_resize_crop('путь_до_картинки', 'название_размера'); ?>" /> |
Важное:
- Прозрачность гифа будет утеряна.
- В папке images надо создать папку resized.
- Из-за кэширования уже созданных картинок, функция не будет перегружать сервер.
Эта функция есть небольшая модификация этой взятой с форума по NetCat.