Спасибо Александру за предложение WideImage.
Я просто использовал это:
require_once('WideImage/WideImage.php');
$image = WideImage::load($_FILES['image']['tmp_name']);
$resized = $image->resize(150,150,'outside','up');
$resized->saveToFile($target_file);
Он работал отлично, и с помощью опции «вверх» он масштабирует только изображения меньше, чемразмеры установлены, а все остальное оставляет.