Вот что получилось, но я думаю, что можно как-то короче и быстрее это сделать. Если что, я хочу сделать квадратную уменьшенную копию изображения
<?php
# Необходимая длина квадрата
$required_size = 64;
# Пути к исходному изображения
$src = 'root.jpg';
# Размеры исходного изображения
list($width, $height) = getimagesize($src);
# Определяем длину
$size = $width > $height ? $height : $width;
# Исходное изображение
$source = imagecreatefromjpeg($src);
# Пустое изображение с черным фоном
$image = imagecreatetruecolor($required_size, $required_size);
# Начальная точки для обрезки
$x = $width > $height ? (($width - $size) / 2) : 0;
$y = $height > $width ? (($height - $size) / 2) : 0;
# Обрезаем изображение
$crop = imagecrop($source, array('x' => $x, 'y' => $y, 'width' => $size, 'height' => $size));
# Уменьшаем до нужных размеров
imagecopyresampled($image, $crop, 0, 0, 0, 0, $required_size, $required_size, $size, $size);
# Указываем заголовок
header('Content-Type: image/png');
# Выводим изображение
imagepng($image);
# Очищаем память
imagedestroy($source);
imagedestroy($image);
imagedestroy($crop);
UPD.
Я еще не проверял с квадратным изображением, наверное нужно доработать.