PHP图片裁剪类

  1 <?php 
  2 
  3 class ImageTool {
  4     
  5     //以宽为标准,如果小于宽,则不剪裁
  6     public static function thumb_img_by_width($src_path, $dest_path,$width,$height){
  7 
  8         $info_arr = getimagesize($src_path);
  9         $src_width = $info_arr[0];
 10         $src_height = $info_arr[1];
 11         
 12         switch( $info_arr['mime'] ) {
 13             case 'image/gif':
 14                 $src_img = imagecreatefromgif( $src_path );
 15                 break;
 16             case 'image/jpeg':
 17                 $src_img = imagecreatefromjpeg( $src_path );
 18                 break;
 19             case 'image/png':
 20                 $src_img = imagecreatefrompng( $src_path ); 
 21                 break;
 22         }
 23         
 24         if($src_width > $width){
 25             //裁剪
 26             // 改变后的图象的比例
 27             $resize_ratio = ($width) / ($height); 
 28             // 实际图象的比例
 29             $ratio = ($src_width) / ($src_height);
 30             
 31             if ($ratio >= $resize_ratio) {
 32                 // 高度优先
 33                 //截取图片中间那一段
 34                 $img_center_x = intval(($src_width-($src_height * $resize_ratio))/2);
 35                 //如果不需要只截取中间那一段,而是从图片x=0的地方截取,则$img_center_x=0
 36                 $newimg = @imagecreatetruecolor($width, $height);
 37                 $color = imagecolorallocate($newimg,255,255,255); 
 38                 imagecolortransparent($newimg,$color); 
 39                 imagefill($newimg,0,0,$color); 
 40                 @imagecopyresampled($newimg, $src_img, 0, 0, $img_center_x, 0, $width, $height, (($src_height) * $resize_ratio), $src_height);
 41                 // ImageJpeg($newimg);
 42             }else{
 43                 // 宽度优先
 44                 //截取图片中间那一段
 45                 $img_center_y = intval(($src_height-($src_width / $resize_ratio))/2);
 46                 //如果不需要只截取中间那一段,而是从图片y=0的地方截取,则$img_center_y=0
 47                 $newimg = @imagecreatetruecolor($width, $height);
 48                 $color = imagecolorallocate($newimg,255,255,255); 
 49                 imagecolortransparent($newimg,$color); 
 50                 imagefill($newimg,0,0,$color); 
 51                 @imagecopyresampled($newimg, $src_img, 0, 0, 0, $img_center_y, $width, $height, $src_width, (($src_width) / $resize_ratio));
 52             }
 53         }else{
 54             //不裁剪
 55             $newimg = @imagecreatetruecolor($src_width, $src_height);
 56             $color = imagecolorallocate($newimg,255,255,255); 
 57             imagecolortransparent($newimg,$color); 
 58             imagefill($newimg,0,0,$color); 
 59             @imagecopyresampled($newimg, $src_img, 0, 0, 0, 0, $src_width, $src_height, $src_width, $src_height);
 60         }
 61         
 62         //统一保存为png格式
 63         imagepng($newimg, $dest_path);
 64         
 65         //gc
 66         imagedestroy($src_img);
 67         imagedestroy($newimg);
 68     }
 69     
 70     public static function thumb_img($src_path, $dest_path,$width,$height){
 71 
 72         $info_arr = getimagesize($src_path);
 73         $src_width = $info_arr[0];
 74         $src_height = $info_arr[1];
 75         
 76         switch( $info_arr['mime'] ) {
 77             case 'image/gif':
 78                 $src_img = imagecreatefromgif( $src_path );
 79                 break;
 80             case 'image/jpeg':
 81                 $src_img = imagecreatefromjpeg( $src_path );
 82                 break;
 83             case 'image/png':
 84                 $src_img = imagecreatefrompng( $src_path ); 
 85                 break;
 86         }
 87         
 88          // 改变后的图象的比例
 89         $resize_ratio = ($width) / ($height); 
 90         // 实际图象的比例
 91         $ratio = ($src_width) / ($src_height);
 92         
 93         if ($ratio >= $resize_ratio) {
 94             // 高度优先
 95             //截取图片中间那一段
 96             $img_center_x = intval(($src_width-($src_height * $resize_ratio))/2);
 97             //如果不需要只截取中间那一段,而是从图片x=0的地方截取,则$img_center_x=0
 98             $newimg = @imagecreatetruecolor($width, $height);
 99             $color = imagecolorallocate($newimg,255,255,255); 
100             imagecolortransparent($newimg,$color); 
101             imagefill($newimg,0,0,$color); 
102             @imagecopyresampled($newimg, $src_img, 0, 0, $img_center_x, 0, $width, $height, (($src_height) * $resize_ratio), $src_height);
103             // ImageJpeg($newimg);
104         }else{
105             // 宽度优先
106             //截取图片中间那一段
107             $img_center_y = intval(($src_height-($src_width / $resize_ratio))/2);
108             //如果不需要只截取中间那一段,而是从图片y=0的地方截取,则$img_center_y=0
109             $newimg = @imagecreatetruecolor($width, $height);
110             $color = imagecolorallocate($newimg,255,255,255); 
111             imagecolortransparent($newimg,$color); 
112             imagefill($newimg,0,0,$color); 
113             @imagecopyresampled($newimg, $src_img, 0, 0, 0, $img_center_y, $width, $height, $src_width, (($src_width) / $resize_ratio));
114         }
115         
116         //统一保存为png格式
117         imagepng($newimg, $dest_path);
118         
119         //gc
120         imagedestroy($src_img);
121         imagedestroy($newimg);
122     }
123     
124     /*
125     * 按比例缩放图片,然后居中裁剪
126     * $src_path 源文件路劲
127     * $dest_path 裁剪图片存放位置
128     * $width 裁剪图片宽带
129     * $height 裁剪图片高度
130     */
131     public static function clip_img($src_path, $dest_path, $width, $height) {
132         if( file_exists($src_path) ) {
133             $info_arr = getimagesize($src_path);
134             $src_width = $info_arr[0];
135             $src_height = $info_arr[1];
136             $src_ratio = $src_height / $src_width;
137             $dest_ratio = $height / $width;
138             
139             if( $src_ratio < $dest_ratio ) {
140                 $ratio_width = $width;
141                 $ratio_height = ( $height * $src_height ) / $src_width;
142             }else if( $src_ratio > $dest_ratio ) {
143                 $ratio_height = $height;
144                 $ratio_width = ( $width * $src_width ) / $src_height;
145             }else {
146                 $ratio_height = $height;
147                 $ratio_width = $width;
148             }
149             
150             switch( $info_arr['mime'] ) {
151                 case 'image/gif':
152                     $src_img = imagecreatefromgif( $src_path );
153                     break;
154                 case 'image/jpeg':
155                     $src_img = imagecreatefromjpeg( $src_path );
156                     break;
157                 case 'image/png':
158                     $src_img = imagecreatefrompng( $src_path );
159                     break;
160                 case 'image/bmp':
161                     //待处理
162                     break;
163             }
164             
165             //等比例缩放图片
166             $thumb_img = imagecreatetruecolor( intval($ratio_width), intval($ratio_height) ) ;
167             $color = imagecolorallocate($thumb_img,255,255,255); 
168             imagecolortransparent($thumb_img,$color); 
169             imagefill($thumb_img,0,0,$color); 
170             imagecopyresampled( $thumb_img, $src_img, 0, 0, 0, 0, $ratio_width, $ratio_height, $src_width, $src_height);
171             
172             //剪裁
173             $clip_img = imagecreatetruecolor( intval($width), intval($height) );
174             imagecopy( $clip_img, $thumb_img, 0, 0, ( $ratio_width - $width ) / 2, ( $ratio_height - $height ) / 2, $width, $height );
175             
176             //统一保存为png格式
177             imagepng($clip_img, $dest_path);
178             
179             //gc
180             imagedestroy($src_img);
181             imagedestroy($thumb_img);
182             imagedestroy($clip_img);
183         }    
184     }
185     
186     /*
187     * 按比例缩放图片
188     * type = 1 按宽为标准缩放 2 按高为标准缩放 
189     */
190     public static function scale_img($src_path,$dest_path,$type,$len){
191         if( file_exists($src_path) ){
192             $info_arr = getimagesize($src_path);
193             $src_width = $info_arr[0];
194             $src_height = $info_arr[1];
195             if($type == 1){
196                 $des_width = $len;
197                 $des_height = ( $src_height * $des_width ) / $src_width;
198             }else{
199                 $des_height = $len;
200                 $des_width = ( $src_width * $des_height ) / $src_height;
201             }
202             
203             switch( $info_arr['mime'] ) {
204                 case 'image/gif':
205                     $src_img = imagecreatefromgif( $src_path );
206                     break;
207                 case 'image/jpeg':
208                     $src_img = imagecreatefromjpeg( $src_path );
209                     break;
210                 case 'image/png':
211                     $src_img = imagecreatefrompng( $src_path );
212                     break;
213                 case 'image/bmp':
214                     //待处理
215                     break;
216             }
217             
218             $thumb_img = imagecreatetruecolor( intval($des_width), intval($des_height) );
219             $color = imagecolorallocate($thumb_img,255,255,255); 
220             imagecolortransparent($thumb_img,$color); 
221             imagefill($thumb_img,0,0,$color); 
222             imagecopyresampled( $thumb_img, $src_img, 0, 0, 0, 0, $des_width, $des_height, $src_width, $src_height);
223         
224             
225             //统一保存为png格式
226             imagepng($thumb_img, $dest_path);
227             
228             //gc
229             imagedestroy($src_img);
230             imagedestroy($thumb_img);
231         }
232     }
233 
234 }