PHP全功能无变形图片裁剪操作类与用法示例
本文实例讲述了PHP全功能无变形图片裁剪操作类与用法。分享给大家供大家参考,具体如下:
如果需要图片裁剪,或生成缩略图,这个基本上没有问题,全部需要的功能都在里面,全部都是无变形的。
这里我们划分为四种模式:
1.任意图片裁剪到指定大小,超过的,剧中裁剪,并且最大化缩放,不够的拉伸,
2.超过的剧中裁剪,而不足的,不拉伸,即只缩小,不放大裁剪,会产生补白,可以用png透明度来消除
3.保留全部图片信息。不裁剪,只缩放,不足的补白。
4.保留全部图片信息。不裁剪,只缩放,不足的不补白,产生的图片为实际有效像素大小,例如有个图片是600X600现在要生成120X100那么缩放后的实际有效像素为100X100,所以只生成100X100的图片,而第三种模式则生成120X100的大小,并且有补白
代码如下(此处代码通过本站在线工具http://tools.jb51.net/code/jb51_php_format做了格式化处理):
<?php /** *Author:smallchicken *mode1:强制裁剪,生成图片严格按照需要,不足放大,超过裁剪,图片始终铺满 *mode2:和1类似,但不足的时候不放大会产生补白,可以用png消除。 *mode3:只缩放,不裁剪,保留全部图片信息,会产生补白, *mode4:只缩放,不裁剪,保留全部图片信息,生成图片大小为最终缩放后的图片有效信息的实际大小,不产生补白 *默认补白为白色,如果要使补白成透明像素,请使用SaveAlpha()方法代替SaveImage()方法 * *调用方法: * *$ic=newImageCrop('old.jpg','afterCrop.jpg'); *$ic->Crop(120,80,2); *$ic->SaveImage(); *//$ic->SaveAlpha();将补白变成透明像素保存 *$ic->destory(); * * */ classImageCrop{ var$sImage; var$dImage; var$src_file; var$dst_file; var$src_width; var$src_height; var$src_ext; var$src_type; functionImageCrop($src_file,$dst_file=''){ $this->src_file=$src_file; $this->dst_file=$dst_file; $this->LoadImage(); } functionSetSrcFile($src_file){ $this->src_file=$src_file; } functionSetDstFile($dst_file){ $this->dst_file=$dst_file; } functionLoadImage(){ list($this->src_width,$this->src_height,$this->src_type)=getimagesize($this->src_file); switch($this->src_type){ caseIMAGETYPE_JPEG: $this->sImage=imagecreatefromjpeg($this->src_file); $this->ext='jpg'; break; caseIMAGETYPE_PNG: $this->sImage=imagecreatefrompng($this->src_file); $this->ext='png'; break; caseIMAGETYPE_GIF: $this->sImage=imagecreatefromgif($this->src_file); $this->ext='gif'; break; default: exit(); } } functionSaveImage($fileName=''){ $this->dst_file=$fileName?$fileName:$this->dst_file; switch($this->src_type){ caseIMAGETYPE_JPEG: imagejpeg($this->dImage,$this->dst_file,100); break; caseIMAGETYPE_PNG: imagepng($this->dImage,$this->dst_file); break; caseIMAGETYPE_GIF: imagegif($this->dImage,$this->dst_file); break; default: break; } } functionOutImage(){ switch($this->src_type){ caseIMAGETYPE_JPEG: header('Content-type:image/jpeg'); imagejpeg($this->dImage); break; caseIMAGETYPE_PNG: header('Content-type:image/png'); imagepng($this->dImage); break; caseIMAGETYPE_GIF: header('Content-type:image/gif'); imagegif($this->dImage); break; default: break; } } functionSaveAlpha($fileName=''){ $this->dst_file=$fileName?$fileName.'.png':$this->dst_file.'.png'; imagesavealpha($this->dImage,true); imagepng($this->dImage,$this->dst_file); } functionOutAlpha(){ imagesavealpha($this->dImage,true); header('Content-type:image/png'); imagepng($this->dImage); } functiondestory(){ imagedestroy($this->sImage); imagedestroy($this->dImage); } functionCrop($dst_width,$dst_height,$mode=1,$dst_file=''){ if($dst_file)$this->dst_file=$dst_file; $this->dImage=imagecreatetruecolor($dst_width,$dst_height); $bg=imagecolorallocatealpha($this->dImage,255,255,255,127); imagefill($this->dImage,0,0,$bg); imagecolortransparent($this->dImage,$bg); $ratio_w=1.0*$dst_width/$this->src_width; $ratio_h=1.0*$dst_height/$this->src_height; $ratio=1.0; switch($mode){ case1://alwayscrop if(($ratio_w<1&&$ratio_h<1)||($ratio_w>1&&$ratio_h>1)){ $ratio=$ratio_w<$ratio_h?$ratio_h:$ratio_w; $tmp_w=(int)($dst_width/$ratio); $tmp_h=(int)($dst_height/$ratio); $tmp_img=imagecreatetruecolor($tmp_w,$tmp_h); $src_x=(int)(($this->src_width-$tmp_w)/2); $src_y=(int)(($this->src_height-$tmp_h)/2); imagecopy($tmp_img,$this->sImage,0,0,$src_x,$src_y,$tmp_w,$tmp_h); imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h); imagedestroy($tmp_img); }else{ $ratio=$ratio_w<$ratio_h?$ratio_h:$ratio_w; $tmp_w=(int)($this->src_width*$ratio); $tmp_h=(int)($this->src_height*$ratio); $tmp_img=imagecreatetruecolor($tmp_w,$tmp_h); imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height); $src_x=(int)($tmp_w-$dst_width)/2; $src_y=(int)($tmp_h-$dst_height)/2; imagecopy($this->dImage,$tmp_img,0,0,$src_x,$src_y,$dst_width,$dst_height); imagedestroy($tmp_img); } break; case2://onlysmall if($ratio_w<1&&$ratio_h<1){ $ratio=$ratio_w<$ratio_h?$ratio_h:$ratio_w; $tmp_w=(int)($dst_width/$ratio); $tmp_h=(int)($dst_height/$ratio); $tmp_img=imagecreatetruecolor($tmp_w,$tmp_h); $src_x=(int)($this->src_width-$tmp_w)/2; $src_y=(int)($this->src_height-$tmp_h)/2; imagecopy($tmp_img,$this->sImage,0,0,$src_x,$src_y,$tmp_w,$tmp_h); imagecopyresampled($this->dImage,$tmp_img,0,0,0,0,$dst_width,$dst_height,$tmp_w,$tmp_h); imagedestroy($tmp_img); }elseif($ratio_w>1&&$ratio_h>1){ $dst_x=(int)abs($dst_width-$this->src_width)/2; $dst_y=(int)abs($dst_height-$this->src_height)/2; imagecopy($this->dImage,$this->sImage,$dst_x,$dst_y,0,0,$this->src_width,$this->src_height); }else{ $src_x=0; $dst_x=0; $src_y=0; $dst_y=0; if(($dst_width-$this->src_width)<0){ $src_x=(int)($this->src_width-$dst_width)/2; $dst_x=0; }else{ $src_x=0; $dst_x=(int)($dst_width-$this->src_width)/2; } if(($dst_height-$this->src_height)<0){ $src_y=(int)($this->src_height-$dst_height)/2; $dst_y=0; }else{ $src_y=0; $dst_y=(int)($dst_height-$this->src_height)/2; } imagecopy($this->dImage,$this->sImage,$dst_x,$dst_y,$src_x,$src_y,$this->src_width,$this->src_height); } break; case3://keepallimagesizeandcreateneedsize if($ratio_w>1&&$ratio_h>1){ $dst_x=(int)(abs($dst_width-$this->src_width)/2); $dst_y=(int)(abs($dst_height-$this->src_height)/2); imagecopy($this->dImage,$this->sImage,$dst_x,$dst_y,0,0,$this->src_width,$this->src_height); }else{ $ratio=$ratio_w>$ratio_h?$ratio_h:$ratio_w; $tmp_w=(int)($this->src_width*$ratio); $tmp_h=(int)($this->src_height*$ratio); $tmp_img=imagecreatetruecolor($tmp_w,$tmp_h); imagecopyresampled($tmp_img,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height); $dst_x=(int)(abs($tmp_w-$dst_width)/2); $dst_y=(int)(abs($tmp_h-$dst_height)/2); imagecopy($this->dImage,$tmp_img,$dst_x,$dst_y,0,0,$tmp_w,$tmp_h); imagedestroy($tmp_img); } break; case4://keepallimagebutcreateactuallysize if($ratio_w>1&&$ratio_h>1){ $this->dImage=imagecreatetruecolor($this->src_width,$this->src_height); imagecopy($this->dImage,$this->sImage,0,0,0,0,$this->src_width,$this->src_height); }else{ $ratio=$ratio_w>$ratio_h?$ratio_h:$ratio_w; $tmp_w=(int)($this->src_width*$ratio); $tmp_h=(int)($this->src_height*$ratio); $this->dImage=imagecreatetruecolor($tmp_w,$tmp_h); imagecopyresampled($this->dImage,$this->sImage,0,0,0,0,$tmp_w,$tmp_h,$this->src_width,$this->src_height); } break; } } //endCrop } ?>
PS:这里再为大家推荐几款比较实用的图片处理工具供大家参考使用:
在线图片转换BASE64工具:
http://tools.jb51.net/transcoding/img2base64
ICO图标在线生成工具:
http://tools.jb51.net/aideddesign/ico_img
在线Email邮箱图标制作工具:
http://tools.jb51.net/email/emaillogo
在线图片格式转换(jpg/bmp/gif/png)工具:
http://tools.jb51.net/aideddesign/picext
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。