给你一个我写的函数 
里面有解释
//////////////////////////////////////////////////////////////////////////////////////
/*
 * 此函数将对一个图片惊醒缩小处理,小于限定大小的图片将保持原状,缩放按照比例进行,不会对原图片进行拉伸/
 * 注意在使用时必须在使用前限制图片的类型,只支持 gif jpg png
 * 此函数将返回一个处理后的图片资源
 * $type_after='png';//输出图片的格式类型
 * $width_after=800;//处理后的最大长度
 * $height_after=600;//处理后的最大高度,二者按比例缩放,并不强制执行
 * $upfile来源图片的路径,此参数不可省略
 */ public function compressImg($upfile,$width_after=800,$height_after=600)
{
$image=$upfile; if(!$width_after) $width_after=800;//如果不存在,就默认800*600
  if(!$height_after) $height_after=600;
///////////////////////////////////////对图片进行缩放处理////////////////////////////////////// $size=GetImageSize($image);//获得图片的原始大小数据
//1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
switch ($size[2]) {//注意在使用时必须在使用前限制图片的类型
case 1:{$image_type='gif';$image_source=imagecreatefromgif($image);break;}
case 2:{$image_type='jpg';$image_source=imagecreatefromjpeg($image);break;}
case 3:{$image_type='png';$image_source=imagecreatefrompng($image);break;} default:$image_type='jpg';break;
}   $width=$size[0];
$height=$size[1];
$x_scale=$width_after/$width;//得到缩放倍数
$y_scale=$height_after/$height;
//////////////////////////对图片的缩放具体长度进行具体计算,保持图片不失真///////////////
if($width>800||$height>600)
{ if(ceil($x_scale*$height)<$height_after)
      {
  $tn_height=ceil($x_scale*$height);
  $tn_width=$width_after;
 }  else{
       $tn_height=$height_after;
   $tn_width=ceil($y_scale*$width);
   }
     }
     else {
 $tn_width=$width;
         $tn_height=$height;
    }   ///////////////////////////////////////////////////////////////////////////////////////////////
$image_source=imagecreatefromjpeg($image);
$image_after=ImageCreateTrueColor($tn_width,$tn_height);//修改后的image资源
ImageCopyResized($image_after,$image_source,0,0,0,0,$tn_width,$tn_height,$width,$height);//imagecopyresized() 将一幅图像中的一块正方形区域拷贝到另一个图像中。
//dst_im 和 src_im 分别是目标图像和源图像的标识符。如果源和目标的宽度和高度不同,则会进行相应的图像收缩和拉伸。
//坐标指的是左上角。本函数可用来在同一幅图内部拷贝(如果 dst_im 和 src_im 相同的话)区域,但如果区域交迭的话则结果不可预知。
return $image_after;
}