Изменение размера картинок.
Не так давно, мне понадобилось функция, которая смогла бы корректно уменьшать картинки. Потратив на поиски готового решения в интернете несколько часов, я решил написать функцию сам. Сложностей тут особо нет, главное это правильно обработать картинку, чтобы она не растянулась и не сжалась, не потеряла свои пропорции. Например, если исходная картинка 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); }