一个经典实用的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;
}
}