php裁剪和缩放
1 <?php 2 3 /** 4 * @remark:将历史图片切成750x500尺寸 5 * 6 */ 7 class Cutimage{ 8 private $file_name; 9 private $file_path; 10 private $pwidth; 11 private $pheight; 12 public function __construct($file_name,$file_path,$width,$height){ 13 $this->file_name=$file_name; 14 $this->file_path=$file_path; 15 $this->pwidth=$width; 16 $this->pheight=$height; 17 } 18 public function index(){ 19 $name=$this->file_name; 20 $file_path=$this->file_path; 21 $local_img=$file_path.$name; 22 $new_img= self::zoom($local_img,$this->pwidth,$this->pheight);///切成750x500的 23 if($new_img!=null){ 24 $sf_path=$file_path.$new_img; 25 self::zoomimg($sf_path,$sf_path,$this->pwidth,$this->pheight); //缩放图片 26 } 27 } 28 /** 29 * 裁剪函数:原图/目标图 这种比例 以小的比例为准 30 */ 31 public function zoom($back,$target_width,$target_height){ 32 try{ 33 $info = getimagesize($back); 34 }catch(Exception $e){ 35 return null; 36 } 37 if(!$info) return null; 38 $str =$info['mime']; 39 $arr =explode('/',$str); 40 $ext = $arr[1]; 41 $create = 'imagecreatefrom'.$ext; 42 $save = 'image'.$ext; 43 ini_set("memory_limit", "600M"); 44 $img = $create($back); 45 $source_width=$info[0]; 46 $source_height=$info[1]; 47 $width_ratio=$info[0]/$target_width; 48 $height_ratio=$info[1]/$target_height; 49 if($width_ratio<$height_ratio){ 50 if($info[0]<=$target_width){ 51 $cropped_width=$info[0]; 52 $source_x=0; 53 $cropped_height=$target_height*$width_ratio; 54 if($cropped_height<$info[1]){$source_y=($info[1]-$cropped_height)/2;} 55 else{$source_y=0;} 56 }else{ 57 // $cropped_width=$target_width; 如果按原图宽>目标宽 不裁剪宽 58 $cropped_width=$info[0]; 59 // $source_x = ($source_width - $cropped_width) / 2; 60 $source_x=0; 61 $cropped_height=$target_height*$width_ratio; 62 if($cropped_height<$info[1]){$source_y=($info[1]-$cropped_height)/2;} 63 else{$source_y=0;} 64 } 65 66 }elseif($width_ratio>$height_ratio){ 67 if($info[1]<$target_height){ 68 $cropped_height=$info[1]; 69 $source_y=0; 70 $cropped_width=$height_ratio*$target_width; 71 if($cropped_width<$info[0]){$source_x = ($source_width - $cropped_width) / 2;} 72 else{$source_x=0;} 73 }else{ 74 $cropped_height=$info[1]; 75 // $source_y = ($source_height - $cropped_height) / 2; 76 $source_y =0; 77 $cropped_width=$height_ratio*$target_width; 78 if($cropped_width<$info[0]){$source_x = ($source_width - $cropped_width) / 2;} 79 else{$source_x=0;} 80 } 81 } 82 else{ // 源图适中 83 $cropped_width = $source_width; 84 $cropped_height = $source_height; 85 $source_x = 0; 86 $source_y = 0; 87 } 88 $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height); 89 imagecopy($cropped_image, $img, 0, 0, $source_x, $source_y, $cropped_width,$cropped_height); 90 $name = basename($back); 91 $pre=$target_width.'x'.$target_height.'_'; 92 $filename=$pre.$name; 93 $save($cropped_image,'./'.$filename); 94 imagedestroy($img); 95 imagedestroy($cropped_image); 96 return $filename; 97 } 98 /* 99 @param $inf 待缩放图片路径 100 @param $outf 缩放后图片存放路径 101 @param $ow 目标缩放宽度 102 @param $oh 目标缩放高度 103 @param $force 若原图长宽都比目标图片小,是否强制放大,0为输出原图,1为强制放大 104 */ 105 public function zoomimg($inf, $outf, $ow, $oh, $q=80, $force=0){ 106 if(file_exists($inf)){ 107 $ow = intval($ow); 108 $oh = intval($oh); 109 $q = intval($q); 110 //取得源图片的宽度和高度 111 $size_src=getimagesize($inf); 112 $iw=$size_src['0']; 113 $ih=$size_src['1']; 114 $str =$size_src['mime']; 115 $arr =explode('/',$str); 116 $ext = $arr[1]; 117 $create = 'imagecreatefrom'.$ext; 118 $save = 'image'.$ext; 119 if($ext == 'png'){ 120 $q = 9; 121 }else{ 122 $q = 80; 123 } 124 //图片的等比缩放 125 $src=$create($inf); 126 //根据最大值为300,算出另一个边的长度,得到缩放后的图片宽度和高度 127 if(($ow > $iw && $oh > $ih) || ($ow == 0 && $oh == 0) || ($ow == 0 && $oh >$ih) || ($ow > $iw && $oh == 0)){ 128 $ow = $iw; 129 $oh = $ih; 130 }elseif($ow == 0){ 131 $ow = $iw*($oh/$ih); 132 }elseif($oh == 0){ 133 $oh = $ih*($ow/$iw); 134 }elseif($iw/$ow > $ih/$oh){ 135 $oh = $ih*($ow/$iw); 136 }else{ 137 $ow = $iw*($oh/$ih); 138 } 139 //声明一个$w宽,$h高的真彩图片资源 140 $image=imagecreatetruecolor($ow, $oh); 141 //关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h) 142 imagecopyresampled($image, $src, 0, 0, 0, 0, $ow, $oh, $iw, $ih); 143 $save($image,$outf,$q); 144 //销毁资源 145 imagedestroy($image); 146 return true; 147 }else{ 148 return false; 149 } 150 } 151 }