Изменение размера картинок

Изменение размера картинок
Изменение размера картинок.

Не так давно, мне понадобилось функция, которая смогла бы корректно уменьшать картинки.  Потратив на поиски готового решения в интернете несколько часов, я решил написать функцию сам. Сложностей тут особо нет, главное это правильно обработать картинку, чтобы она не растянулась и не сжалась, не потеряла свои пропорции. Например, если исходная картинка 500х400, а из нее нужно сделать  400Х400, простым сжатием тут не отделаться. Решение простое: сделать белый фон (или любой другой, как кому нравится) и на этот фон нанести, корректно сжатую картинку, сжимать нужно пропорционально по большей стороне.  Вот собственно весь смысл функции, теперь непосредственно код функции.

/*
* $source – исходное изображение
* $path – путь для сохранения новой картинки
* $height – новая высота
* $width – новая ширина
*/
function resizePhoto($source, $path, $height, $width)
{
$rgb = 0xffffff; //цвет заливки фона
$size = getimagesize($source);//узнаем размеры исходной картинки
//определяем тип (расширение) картинки
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$icfunc = "imagecreatefrom" . $format;   //определение функции для расшерения файла
//если нет такой функции, то прекращаем работу скрипта
if (!function_exists($icfunc)) return false;
$x_ratio = $width / $size[0]; //пропорция ширины
$y_ratio = $height / $size[1]; //пропорция высоты
$ratio = min($x_ratio, $y_ratio);
$use_x_ratio = ($x_ratio == $ratio); //соотношения ширины к высоте
$new_width   = $use_x_ratio  ? $width  : floor($size[0] * $ratio); //ширина превью
$new_height  = !$use_x_ratio ? $height : floor($size[1] * $ratio); //высота превью
//расхождение с заданными параметрами по ширине
$new_left    = $use_x_ratio  ? 0 : floor(($width - $new_width) / 2);
//расхождение с заданными параметрами по высоте
$new_top     = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
//создаем вспомогательное изображение пропорциональное превью
$img = imagecreatetruecolor($width,$height);
imagefill($img, 0, 0, $rgb); //заливаем его…
$photo = $icfunc($source); //достаем наш исходник
imagecopyresampled($img, $photo, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]); //копируем на него превью с учетом расхождений
$func = 'image'.$format;
$func($img, $path); //сохраняем результат (превью картинки)
// Очищаем память после выполнения скрипта
imagedestroy($img);
imagedestroy($photo);
}
Рассказать друзьям:


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*