PHP中面向对象的图片处理类
我们对图片的处理主要是添加水印和等比缩放,在PHP中,封装一个类来实现两个功能。
源代码如下:
<?php/***图片处理*/classImage{//路径private$path='./upload/';//随机文件名private$isRandName;//初始化成员方法publicfunction__construct($path=null,$r=true){if(!is_null($path)){$this->path=rtrim($path,'/').'/';}$this->isRandName=$r;}//water水印的方法//源(图片$dst)目标(水印$src)位置(9宫格)前缀($prefix)透明度($tmd)publicfunctionwater($dst,$src,$pos=9,$prefix='wa_',$tmd=100){//判断文件路径是否存在$src=$this->path.$src;if(!file_exists($dst)||!file_exists($src)){exit('图片或者水印不存在');}//获取图像(图片和水印)的相关信息$dstInfo=self::getImageInfo($dst);$srcInfo=self::getImageInfo($src);//var_dump($dstInfo);//判断宽高是否超过了目标图片的宽高if(!$this->_checkSize($dstInfo,$srcInfo)){exit('水印图片的宽、高不合法');}//摆放位置123456789九宫格(3行3列)$postion=self::getPostion($dstInfo,$srcInfo,$pos);//打开图片$dstRes=self::openImage($dst,$dstInfo);$srcRes=self::openImage($src,$srcInfo);//将两个图片合并在一起通过两张图片信息将图片合并在一起需要自定义一个方法$newRes=$this->_mergeImage($dstRes,$srcRes,$postion,$dstInfo,$srcInfo,$tmd);//判断是否允许随机命名【保存之前】if($this->isRandName){//路径前缀产生id.后缀//uniqid()获取一个带前缀、基于当前时间微秒数的唯一ID$path=$this->path.$prefix.uniqid().'.'.$dstInfo['subfix'];}else{//路径前缀文件原名$path=$this->path.$prefix.$dstInfo['basename'];}//保存图片self::saveImage($newRes,$path,$dstInfo);//销毁资源p_w_picpathdestroy($dstRes);p_w_picpathdestroy($srcRes);//返回路径}//等比缩放//源图片宽高前缀publicfunctionthump($dst,$width,$height,$prefix='thump_'){//判断文件是否存在if(!file_exists($dst)){exit('文件路径不存在');}//获取图像的信息没有信息就退出$info=self::getImageInfo($dst);//得到一个新的尺寸$newSize=self::getNewSize($width,$height,$info);//打开资源$res=self::openImage($dst,$info);//等比缩放这个资源处理gif背景变黑的问题$newRes=self::kidOfImage($res,$newSize,$info);//保存$path=$this->path.$prefix.$info['basename'];self::saveImage($newRes,$path,$info);//销毁资源p_w_picpathdestroy($newRes);//返回路径return$path;}//等比缩放处理privatestaticfunctionkidOfImage($srcImg,$size,$imgInfo){$newImg=p_w_picpathcreatetruecolor($size["width"],$size["height"]);$otsc=p_w_picpathcolortransparent($srcImg);if($otsc>=0&&$otsc<p_w_picpathcolorstotal($srcImg)){$transparentcolor=p_w_picpathcolorsforindex($srcImg,$otsc);$newtransparentcolor=p_w_picpathcolorallocate($newImg,$transparentcolor['red'],$transparentcolor['green'],$transparentcolor['blue']);p_w_picpathfill($newImg,0,0,$newtransparentcolor);p_w_picpathcolortransparent($newImg,$newtransparentcolor);}p_w_picpathcopyresized($newImg,$srcImg,0,0,0,0,$size["width"],$size["height"],$imgInfo["width"],$imgInfo["height"]);p_w_picpathdestroy($srcImg);return$newImg;}//得到一个新的尺寸privatestaticfunctiongetNewSize($width,$height,$imgInfo){$size["width"]=$imgInfo["width"];//将原图片的宽度给数组中的$size["width"]$size["height"]=$imgInfo["height"];//将原图片的高度给数组中的$size["height"]if($width<$imgInfo["width"]){$size["width"]=$width;//缩放的宽度如果比原图小才重新设置宽度}if($width<$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;}//获取图片的相关信息publicstaticfunctiongetImageInfo($path){$data=[];//获取图片大小$info=getp_w_picpathsize($path);//var_dump($info);//根据打印出来的信息将键所对应的值(文件的大小)赋值给data的数组中$data['width']=$info[0];$data['height']=$info[1];$data['mime']=$info['mime'];//获取路径后缀文件名信息$path=pathinfo($path);//var_dump($path);die;//根据打印出来的信息将将键所对应的值(路径和文件名)赋值给data的数组中$data['basename']=$path['basename'];$data['subfix']=$path['extension'];return$data;}//检查图片和水印的宽高//将图片的宽高和水印的宽高进行比较privatefunction_checkSize($dstInfo,$srcInfo){//水印的宽应该小于图片的宽度或者水印的高度应该小于图片的高度,只要其中一个不满足就不能继续if($dstInfo['width']<$srcInfo['width']||$dstInfo['height']<$srcInfo['height']){returnfalse;}returntrue;}//位置处理publicstaticfunctiongetPostion($dstInfo,$srcInfo,$pos){switch($pos){case1:$x=0;$y=0;break;case2:$x=ceil(($dstInfo['width']-$srcInfo['width'])/2);$y=0;break;case3:$x=$dstInfo['width']-$srcInfo['width'];$y=0;break;case4:$x=0;$y=ceil(($dstInfo['height']-$srcInfo['height'])/2);break;case5:$x=ceil(($dstInfo['width']-$srcInfo['width'])/2);$y=ceil(($dstInfo['height']-$srcInfo['height'])/2);break;case6:$x=$dstInfo['width']-$srcInfo['width'];$y=ceil(($dstInfo['height']-$srcInfo['height'])/2);break;case7:$x=0;$y=$dstInfo['height']-$srcInfo['height'];break;case8:$x=ceil(($dstInfo['width']-$srcInfo['width'])/2);$y=$dstInfo['height']-$srcInfo['height'];break;case9:$x=$dstInfo['width']-$srcInfo['width'];$y=$dstInfo['height']-$srcInfo['height'];break;}return['x'=>$x,'y'=>$y];}//打开图片//根据图片的类型打开相应的图片资源privatefunctionopenImage($path,$info){switch($info['mime']){case'p_w_picpath/png':case'p_w_picpath/x-png':$res=p_w_picpathcreatefrompng($path);break;case'p_w_picpath/jpeg':case'p_w_picpath/jpg':case'p_w_picpath/pjpeg':$res=p_w_picpathcreatefromjpeg($path);break;case'p_w_picpath/gif':$res=p_w_picpathcreatefromgif($path);break;case'p_w_picpath/wbmp':case'p_w_picpath/bmp':$res=p_w_picpathcreatefromwbmp($path);break;}//var_dump($res);die;return$res;}//合并图片p_w_picpathcopymerge(图片,水印,图片坐标x,图片坐标y,水印坐标x,水印坐标y,透明度)privatefunction_mergeImage($dstRes,$srcRes,$postion,$dstInfo,$srcInfo,$tmd){p_w_picpathcopymerge($dstRes,$srcRes,$postion['x'],$postion['y'],0,0,$srcInfo['width'],$srcInfo['height'],$tmd);return$dstRes;}//保存图片处理方法//参数:需要保存的图片资源,保存的路径,保存的信息publicstaticfunctionsaveImage($res,$path,$info){//根据不同的图片类型选择不同的函数进行保存switch($info['mime']){case'p_w_picpath/png':case'p_w_picpath/x-png':p_w_picpathpng($res,$path);break;case'p_w_picpath/jpeg':case'p_w_picpath/jpg':case'p_w_picpath/pjpeg':p_w_picpathjpeg($res,$path);break;case'p_w_picpath/gif':p_w_picpathgif($res,$path);break;case'p_w_picpath/wbmp':case'p_w_picpath/bmp':p_w_picpathwbmp($res,$path);break;}}}
测试代码:
$img=newImage();/*$img->water('ly.png','logo.gif',3);$img->water('ly.png','logo.gif',4);*/$img->thump('ly.png',100,100,'l1_');
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。