imagecopyresampled()
или imagecopyresized()
должны делать именно то, что вы хотите.
(Несмотря на свое название, imagecopyresampled также изменяет размер.)
Они берут часть или все исходное изображение, изменяют его размер и копируют в конечное изображение.
Если исходное изображение не квадратное, вы можете обрезать или исказить его при копировании.