一个经典实用的PHP图像处理类分享
本图像处理类可以完成对图片的缩放、加水印和裁剪的功能,支持多种图片类型的处理,缩放时进行优化等。
<?php /** file:image.class.php类名为Image 图像处理类,可以完成对各种类型的图像进行缩放、加图片水印和剪裁的操作。 */ classImage{ /*图片保存的路径*/ private$path; /** *实例图像对象时传递图像的一个路径,默认值是当前目录 *@paramstring$path可以指定处理图片的路径 */ function__construct($path="./"){ $this->path=rtrim($path,"/")."/"; } /** *对指定的图像进行缩放 *@paramstring$name是需要处理的图片名称 *@paramint$width缩放后的宽度 *@paramint$height缩放后的高度 *@paramstring$qz是新图片的前缀 *@returnmixed是缩放后的图片名称,失败返回false; */ functionthumb($name,$width,$height,$qz="th_"){ /*获取图片宽度、高度、及类型信息*/ $imgInfo=$this->getInfo($name); /*获取背景图片的资源*/ $srcImg=$this->getImg($name,$imgInfo); /*获取新图片尺寸*/ $size=$this->getNewSize($name,$width,$height,$imgInfo); /*获取新的图片资源*/ $newImg=$this->kidOfImage($srcImg,$size,$imgInfo); /*通过本类的私有方法,保存缩略图并返回新缩略图的名称,以"th_"为前缀*/ return$this->createNewImage($newImg,$qz.$name,$imgInfo); } /** *为图片添加水印 *@paramstring$groundName背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式 *@paramstring$waterName图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式 *@paramint$waterPos水印位置,有10种状态,0为随机位置; *1为顶端居左,2为顶端居中,3为顶端居右; *4为中部居左,5为中部居中,6为中部居右; *7为底端居左,8为底端居中,9为底端居右; *@paramstring$qz加水印后的图片的文件名在原文件名前面加上这个前缀 *@returnmixed是生成水印后的图片名称,失败返回false */ functionwaterMark($groundName,$waterName,$waterPos=0,$qz="wa_"){ /*获取水印图片是当前路径,还是指定了路径*/ $curpath=rtrim($this->path,"/")."/"; $dir=dirname($waterName); if($dir=="."){ $wpath=$curpath; }else{ $wpath=$dir."/"; $waterName=basename($waterName); } /*水印图片和背景图片必须都要存在*/ if(file_exists($curpath.$groundName)&&file_exists($wpath.$waterName)){ $groundInfo=$this->getInfo($groundName);//获取背景信息 $waterInfo=$this->getInfo($waterName,$dir);//获取水印图片信息 /*如果背景比水印图片还小,就会被水印全部盖住*/ if(!$pos=$this->position($groundInfo,$waterInfo,$waterPos)){ echo'水印不应该比背景图片小!'; returnfalse; } $groundImg=$this->getImg($groundName,$groundInfo);//获取背景图像资源 $waterImg=$this->getImg($waterName,$waterInfo,$dir);//获取水印图片资源 /*调用私有方法将水印图像按指定位置复制到背景图片中*/ $groundImg=$this->copyImage($groundImg,$waterImg,$pos,$waterInfo); /*通过本类的私有方法,保存加水图片并返回新图片的名称,默认以"wa_"为前缀*/ return$this->createNewImage($groundImg,$qz.$groundName,$groundInfo); }else{ echo'图片或水印图片不存在!'; returnfalse; } } /** *在一个大的背景图片中剪裁出指定区域的图片 *@paramstring$name需要剪切的背景图片 *@paramint$x剪切图片左边开始的位置 *@paramint$y剪切图片顶部开始的位置 *@paramint$width图片剪裁的宽度 *@paramint$height图片剪裁的高度 *@paramstring$qz新图片的名称前缀 *@returnmixed裁剪后的图片名称,失败返回false; */ functioncut($name,$x,$y,$width,$height,$qz="cu_"){ $imgInfo=$this->getInfo($name);//获取图片信息 /*裁剪的位置不能超出背景图片范围*/ if((($x+$width)>$imgInfo['width'])||(($y+$height)>$imgInfo['height'])){ echo"裁剪的位置超出了背景图片范围!"; returnfalse; } $back=$this->getImg($name,$imgInfo);//获取图片资源 /*创建一个可以保存裁剪后图片的资源*/ $cutimg=imagecreatetruecolor($width,$height); /*使用imagecopyresampled()函数对图片进行裁剪*/ imagecopyresampled($cutimg,$back,0,0,$x,$y,$width,$height,$width,$height); imagedestroy($back); /*通过本类的私有方法,保存剪切图并返回新图片的名称,默认以"cu_"为前缀*/ return$this->createNewImage($cutimg,$qz.$name,$imgInfo); } /*内部使用的私有方法,用来确定水印图片的位置*/ privatefunctionposition($groundInfo,$waterInfo,$waterPos){ /*需要加水印的图片的长度或宽度比水印还小,无法生成水印*/ if(($groundInfo["width"]<$waterInfo["width"])||($groundInfo["height"]<$waterInfo["height"])){ returnfalse; } switch($waterPos){ case1://1为顶端居左 $posX=0; $posY=0; break; case2://2为顶端居中 $posX=($groundInfo["width"]-$waterInfo["width"])/2; $posY=0; break; case3://3为顶端居右 $posX=$groundInfo["width"]-$waterInfo["width"]; $posY=0; break; case4://4为中部居左 $posX=0; $posY=($groundInfo["height"]-$waterInfo["height"])/2; break; case5://5为中部居中 $posX=($groundInfo["width"]-$waterInfo["width"])/2; $posY=($groundInfo["height"]-$waterInfo["height"])/2; break; case6://6为中部居右 $posX=$groundInfo["width"]-$waterInfo["width"]; $posY=($groundInfo["height"]-$waterInfo["height"])/2; break; case7://7为底端居左 $posX=0; $posY=$groundInfo["height"]-$waterInfo["height"]; break; case8://8为底端居中 $posX=($groundInfo["width"]-$waterInfo["width"])/2; $posY=$groundInfo["height"]-$waterInfo["height"]; break; case9://9为底端居右 $posX=$groundInfo["width"]-$waterInfo["width"]; $posY=$groundInfo["height"]-$waterInfo["height"]; break; case0: default://随机 $posX=rand(0,($groundInfo["width"]-$waterInfo["width"])); $posY=rand(0,($groundInfo["height"]-$waterInfo["height"])); break; } returnarray("posX"=>$posX,"posY"=>$posY); } /*内部使用的私有方法,用于获取图片的属性信息(宽度、高度和类型)*/ privatefunctiongetInfo($name,$path="."){ $spath=$path=="."?rtrim($this->path,"/")."/":$path.'/'; $data=getimagesize($spath.$name); $imgInfo["width"]=$data[0]; $imgInfo["height"]=$data[1]; $imgInfo["type"]=$data[2]; return$imgInfo; } /*内部使用的私有方法,用于创建支持各种图片格式(jpg,gif,png三种)资源*/ privatefunctiongetImg($name,$imgInfo,$path='.'){ $spath=$path=="."?rtrim($this->path,"/")."/":$path.'/'; $srcPic=$spath.$name; switch($imgInfo["type"]){ case1://gif $img=imagecreatefromgif($srcPic); break; case2://jpg $img=imagecreatefromjpeg($srcPic); break; case3://png $img=imagecreatefrompng($srcPic); break; default: returnfalse; break; } return$img; } /*内部使用的私有方法,返回等比例缩放的图片宽度和高度,如果原图比缩放后的还小保持不变*/ privatefunctiongetNewSize($name,$width,$height,$imgInfo){ $size["width"]=$imgInfo["width"];//原图片的宽度 $size["height"]=$imgInfo["height"];//原图片的高度 if($width<$imgInfo["width"]){ $size["width"]=$width;//缩放的宽度如果比原图小才重新设置宽度 } if($height<$imgInfo["height"]){ $size["height"]=$height;//缩放的高度如果比原图小才重新设置高度 } /*等比例缩放的算法*/ if($imgInfo["width"]*$size["width"]>$imgInfo["height"]*$size["height"]){ $size["height"]=round($imgInfo["height"]*$size["width"]/$imgInfo["width"]); }else{ $size["width"]=round($imgInfo["width"]*$size["height"]/$imgInfo["height"]); } return$size; } /*内部使用的私有方法,用于保存图像,并保留原有图片格式*/ privatefunctioncreateNewImage($newImg,$newName,$imgInfo){ $this->path=rtrim($this->path,"/")."/"; switch($imgInfo["type"]){ case1://gif $result=imageGIF($newImg,$this->path.$newName); break; case2://jpg $result=imageJPEG($newImg,$this->path.$newName); break; case3://png $result=imagePng($newImg,$this->path.$newName); break; } imagedestroy($newImg); return$newName; } /*内部使用的私有方法,用于加水印时复制图像*/ privatefunctioncopyImage($groundImg,$waterImg,$pos,$waterInfo){ imagecopy($groundImg,$waterImg,$pos["posX"],$pos["posY"],0,0,$waterInfo["width"],$waterInfo["height"]); imagedestroy($waterImg); return$groundImg; } /*内部使用的私有方法,处理带有透明度的图片保持原样*/ privatefunctionkidOfImage($srcImg,$size,$imgInfo){ $newImg=imagecreatetruecolor($size["width"],$size["height"]); $otsc=imagecolortransparent($srcImg); if($otsc>=0&&$otsc<imagecolorstotal($srcImg)){ $transparentcolor=imagecolorsforindex($srcImg,$otsc); $newtransparentcolor=imagecolorallocate( $newImg, $transparentcolor['red'], $transparentcolor['green'], $transparentcolor['blue'] ); imagefill($newImg,0,0,$newtransparentcolor); imagecolortransparent($newImg,$newtransparentcolor); } imagecopyresized($newImg,$srcImg,0,0,0,0,$size["width"],$size["height"],$imgInfo["width"],$imgInfo["height"]); imagedestroy($srcImg); return$newImg; } }