[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Функция изменения размера картинки (оптимизация)
Evilsoul
Нашел её в интернете, мне не понравился результат её работы и я ее переделал:
    /**  
* Function resize images
* Функция изменения изображения для превьюв
*
@param string $src - дериктория исходного файла
*
@param string $dest - имя генерируемого файла
*
@param int $width, $height - ширина и высота генерируемого изображения, в пикселях
*
@param int $quality - качество генерируемого JPEG, по умолчанию - максимальное (80)
*
@return value - сообщение о ходе выполнения
*/

function imgResize($src, $dest, $width, $height, $quality = 80)
{
if(!file_exists($src)) return false;

$size = getimagesize($src);

if($size === false) return false;

// Определяем исходный формат по MIME-информации, предоставленной
// функцией getimagesize, и выбираем соответствующую формату
// imagecreatefrom-функцию.

$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$icfunc = 'imagecreatefrom' . $format;

if (!function_exists($icfunc)) return false;

$src_x = 0; // Точка координат по оси X в оригинальном изображении для выделения копируемой области
$src_y = 0; // Точка координат по оси У в оригинальном изображении для выделения копируемой области

$src_w = $size[0]; // Ширина прямоугольника копируемой области
$src_h = $size[1]; // Высота прямоугольника копируемой области

if($width === $height)
{
if($size[0] >= $size[1])
{
$difference = $size[0] - $size[1]; // Получаем разницу между шириной и высотой
$src_x = ceil($difference / 2); // Точка координат (половина разницы) по оси Х в оригинальном изображении для выделения копируэмой области
$src_w = $size[0] - $difference; // Ширина прямоугольника копируэмой области
}
else
{
$difference = $size[1] - $size[0];
$src_y = ceil($difference / 2);
$src_h = $size[1] - $difference;
}
}

else
{
if($size[0] >= $size[1])
{
$scale = round($size[0] / $width, 2);
$width = floor($size[0] / $scale);
$height = floor($size[1] / $scale);
}
else
{
$scale = round($size[1] / $height, 2);
$width = floor($size[0] / $scale);
$height = floor($size[1] / $scale);
}
}


$isrc = $icfunc($src);
$idest = imagecreatetruecolor($width, $height);

imagecopyresampled($idest, $isrc, 0, 0, $src_x, $src_y, $width, $height, $src_w, $src_h);

imagejpeg($idest, $dest, $quality);

imagedestroy($isrc);
imagedestroy($idest);

return true;
}


Её работа:
  • если хотим получить миниатюру квадратного размера, задаем в параметры равные стороны;
  • если хотим получить изображение меньшего размера но при этом сохранить пропорции, вводим ширину и высоту прямоугольника.

У меня на локальном сервере, выполнение этих двух функций и загрузка изображения занимает более 5 сек.
                $extensions = array('JPG', 'jpg', 'JPEG', 'jpeg', 'PNG', 'png', 'GIF', 'gif');

$message = uploadHandle(5000, $extensions, $upload_dir); // Загружаем изображение на сервер (данная функция в курсах)
$info = $message['error'] ? $message['error'] : $message['info'];

if(file_exists($upload_dir . $_FILES['file']['name'])) // Если изображение загружено
{
imgResize($upload_dir.$_FILES['file']['name'], $upload_dir.$_FILES['file']['name'], 900,675);

$preview = imgResize($upload_dir.$_FILES['file']['name'], // Создаем новое изображение для предосмотра из уже загруженного
$upload_dir.'preview/small_'.$_FILES['file']['name'],
120,
120
);

Вопрос:
С загрузкой изображения понятно, там скорость зависит от скорости передачи, а как быть с этой функцией, возможно ли оптимизировать её работу и скорость выполнения?



Спустя 23 минуты, 11 секунд (31.01.2011 - 11:10) linker написал(а):
На фоне
$icfunc = 'imagecreatefrom' . $format;
явный вызов
imagejpeg($idest, $dest, $quality);
смотрится нелогичным.

Спустя 4 минуты, 46 секунд (31.01.2011 - 11:15) Evilsoul написал(а):
linker
ты о том что своему формату свою функцию?

Спустя 2 минуты, 36 секунд (31.01.2011 - 11:17) linker написал(а):
Ну вообще да. imagecreatetruecolor() для gif'а как-то не катит.

Спустя 8 минут, 19 секунд (31.01.2011 - 11:26) Evilsoul написал(а):
ну в мануале ПШП юзают imagecreatetruecolor() для гиф
imagejpeg($idest, $dest, $quality);

эти можно было бы подкрутить на нужный формат, спасибо за совет

но вопрос остается, так как я использовал для теста в основном JPG

Спустя 10 часов, 15 минут, 6 секунд (31.01.2011 - 21:41) Evilsoul написал(а):
эй, знатоки, где вы? что всё, больше советов нет? (


_____________
Кто хочет, ищет возможности, кто не хочет - причины. /_ К. Маркс
Истенно велик тот человек который сумел овладеть своим временем. /_Гесиод VIII-VII вв. до Р. Х.
Медлительный непрерывно борится с бедами всю жизнь. /_Гесиод VIII-VII вв. до Р. Х.
Для того что бы увидеть радугу нужно пережить дождь.
Женщины: Хочется чего-то красного но синего.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.