Что и говорить, придумал это не я, но так получилось что пришлось слегка доделать данный метод ибо у меня он не работал. Все основано на PHP функции которую предложил aidsoid с небезызвестного хабра. Данная функция создает миниатюру изображения сохраняя ее пропорции!
Вот эта функция:
// функция создаёт "миниатюру" изображения сохраняя пропорции
// и обрамляет неиспользуемое пространство в стиле Philips Ambilight
// Входные параметры:
// $image_from - имя файла исходного изображения
// $image_to - имя файла результирующего изображения
// $width - желаемая ширина результирующей "миниатюры"
// $height - желаемая высота результирующей "миниатюры"
// $padding - минимальная рамка в пикселях (по умолчанию = 5)
// $dest_image_type - тип изображения для сохранения (по умолчанию JPG):
// 2 - JPG
// 3 - PNG
// Возвращает:
// TRUE - в случае успеха
// FALSE - в случае неудачи
function aidsoid_resize_image($image_from, $image_to, $width=200, $height=200, $padding=5, $dest_image_type=2) {
$image_vars = getimagesize($image_from);
if (!$image_vars) {
return FALSE;
}
$src_width = $image_vars[ 0];
$src_height = $image_vars[1];
$src_type = $image_vars[2];
if (($src_type != IMAGETYPE_JPEG) and ($src_type != IMAGETYPE_PNG)) {
return FALSE;
}
switch ($src_type) {
case IMAGETYPE_JPEG:
$src_image = imagecreatefromjpeg($image_from);
break;
case IMAGETYPE_PNG:
$src_image = imagecreatefrompng($image_from);
break;
default:
return FALSE;
break;
}
if (!$src_image) return FALSE;
// создаем задний фон для нового изображения
$dest_image = imagecreatetruecolor($width, $height);
// копируем из исходного изображения в фон и растягиваем без соблюдения пропорций
$result = imagecopyresized($dest_image, $src_image, 0, 0, 0, 0, $width, $height, $src_width, $src_height);
if (!$result) return FALSE;
// применяем к фону размытие
for ($i= 0; $i<=100; $i++) {
$result = imagefilter($dest_image, IMG_FILTER_SMOOTH, 6);
if (!$result) return FALSE;
}
// деление на ноль - плохая идея
if ( ($src_width == 0) or ($src_height == 0) ) {
return FALSE;
}
// вычисляем масштабный коэффициент
$ratio = min( ($width-2*$padding)/$src_width , ($height-2*$padding)/$src_height );
// вычисляем новые размеры изображения
$new_width = $ratio * $src_width;
$new_height = $ratio * $src_height;
// если новая высота или новая длина больше оригинальных,
// то это значит, что изображение будет растянуто, не нужно допускать этого,
// в этом случае оставим оригинальное изображение без изменения размеров
if ( ($new_width >= $src_width) or ($new_height >= $src_height) ) {
$new_width = $src_width;
$new_height = $src_height;
}
// скопируем поверх фона получившееся изображение
$result = imagecopyresampled($dest_image, $src_image, round(($width-$new_width)/2), round(($height-$new_height)/2), 0, 0, $new_width, $new_height, $src_width, $src_height);
if (!$result) return FALSE;
// сохраняем на носитель
switch ($dest_image_type) {
case IMAGETYPE_JPEG: // качество изображения 100
$result = imagejpeg($dest_image, $image_to, 100);
break;
case IMAGETYPE_PNG: // максимальный уровень сжатия 9
$result = imagepng($dest_image, $image_to, 9);
break;
default:
return FALSE;
break;
}
if (!$result) return FALSE;
chmod($image_to, 0777);
return TRUE;
}
А вызываем мы ее вот так:
// данная строка делает изображение и сохраняет его на сервер
aidsoid_resize_image($image_from, $image_to, 200, 200, 5, 2);
Самое интересное что она может не сработать по неадекватной как кажется причине: при вызове функции imagefilter библиотеки GD. Пришлось искать решение… Вот что было найдено на просторах интернета: http://mgccl.com/2007/03/02/imagefilter-function-for-php-user-without-bundled-gd . Это очередная PHP функция которая позволяет использовать imagefilter без обращения к GD, ее надо вставить до вызова нашей функции aidsoid_resize_image. Но есть у нее и минусы — она заметно снижает производительность скрипта.
Добавить комментарий