public function resize($w, $h)
{
if ( isset($this->source) )
{
$set_width = $width = imagesx($this->source);
$set_height = $height = imagesy($this->source);
if ( $h > $height )
$h = $height;
if ( $w > $width )
$w = $width;
if ( $w > 0 && $h > 0 )
{
if ( $width / $height > $w / $h )
$h = 0;
else
$w = 0;
}
if ( $w > 0 )
{
$set_width = $w;
$set_height = $height * $w / $width;
}
if ( $h > 0 )
{
$set_height = $h;
$set_width = $width * $h / $height;
}
$tmp = imagecreatetruecolor($set_width, $set_height);
imagealphablending($tmp, false);
imagesavealpha($tmp, true);
imagecopyresampled($tmp, $this->source, 0, 0, 0, 0, $set_width, $set_height, $width, $height);
return $tmp;
}
}
где $this->source это ид ресурса картинки, созданного, например, так
$this->source = imagecreatefromjpeg($image_file_path);
если передана только $w, картинка на выходе будет подогнана по ширине, заданной $w. то же самое если только $h передана ($w при этом = 0), будет подогнана по высоте. Если заданы и $w и $h, то картинка будет вписана в прямоугольник $w*$h. во всех случаях пропорции сохраняются
правда в вашем вопросе не уменьшение, а вырезание нарисовано