Я использую ниже приведенный код для уменьшения картинки до определенных границ
с сохранением пропорций. С 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