Я использую ниже приведенный код для уменьшения картинки до определенных границ
с сохранением пропорций. С png не баловался, но jpg изменяется без проблем.
 header ("Content-type: image/jpeg");
 $imgname="file.jpg"; //имя файла
 $src = @imagecreatefromjpeg ($imgname); /* попытка открыть */
 if(!$src) die ("Not open img ".$imgname);
 $sw=imagesx($src);
 $sh=imagesy($src);
 //задаем размер прямоугольника в который вписывается исходное изображение
 $iw=400; $ih=200;
 if(isset($_GET['h'])) $ih=$_GET['h'];
 if(isset($_GET['w'])) $iw=$_GET['w'];
 $dw=$iw/$sw;
 $dh=$ih/$sh;
 if(($sh*$dw) > $ih) { $nh=$ih; $nw=$dh*$sw; }
 else { $nh=$dw*$sh; $nw=$iw; }
 $dist = imagecreatetruecolor($nw,$nh); // создать пустое изображение
 imagecopyresampled($dist,$src,0,0,0,0,$nw,$nh,$sw,$sh);
 imagedestroy($src);
 imagejpeg($dist,null,60);
 imagedestroy($dist);
Вот демонстрация: 
http://www.cultangar.info/getaimg.php?id=327&h=200&w=400 - размер задается параметрами h=200&w=400
Реальный файл (размер 470х650): 
http://www.cultangar.info/img/paintings/asya_alisa0002.jpg