Я только что создал эту функцию, и она работает для моих нужд, создавая центрированное и обрезанное уменьшенное изображение. Он оптимизирован и не требует нескольких вызовов фотокопии, как показано в ответе webGautam.
Укажите путь к изображению, окончательную ширину и высоту, а также, при необходимости, качество изображения. Я сделал это для создания миниатюр, так что все изображения сохраняются в формате JPG, вы можете отредактировать его для размещения других типов изображений, если они вам нужны. Основным моментом здесь является математика и метод использования imagecopyresampled для создания эскиза. Изображения сохраняются под тем же именем и размером изображения.
function resize_crop_image($image_path, $end_width, $end_height, $quality = '') {
if ($end_width < 1) $end_width = 100;
if ($end_height < 1) $end_height = 100;
if ($quality < 1 || $quality > 100) $quality = 60;
$image = false;
$dot = strrpos($image_path,'.');
$file = substr($image_path,0,$dot).'-'.$end_width.'x'.$end_height.'.jpg';
$ext = substr($image_path,$dot+1);
if ($ext == 'jpg' || $ext == 'jpeg') $image = @imagecreatefromjpeg($image_path);
elseif($ext == 'gif') $image = @imagecreatefromgif($image_path);
elseif($ext == 'png') $image = @imagecreatefrompng($image_path);
if ($image) {
$width = imagesx($image);
$height = imagesy($image);
$scale = max($end_width/$width, $end_height/$height);
$new_width = floor($scale*$width);
$new_height = floor($scale*$height);
$x = ($new_width != $end_width ? ($width - $end_width) / 2 : 0);
$y = ($new_height != $end_height ? ($height - $end_height) / 2 : 0);
$new_image = @imagecreatetruecolor($new_width, $new_height);
imagecopyresampled($new_image,$image,0,0,$x,$y,$new_width,$new_height,$width - $x,$height - $y);
imagedestroy($image);
imagejpeg($new_image,$file,$quality);
imagedestroy($new_image);
return $file;
}
return false;
}