php图像处理类实例
本文实例讲述了php图像处理类。分享给大家供大家参考。具体如下:
<?php
/**
*Image类
*/
classImage{
/**
*@varstring$fileName文件名
*@accessprivate
*/
private$fileName='';
/**
*@vargdresource$imageResource原图像
*@accessprivate
*/
private$imageResource=NULL;
/**
*@varint$imageWidth原图像宽
*@accessprivate
*/
private$imageWidth=NULL;
/**
*@varint$imageHeight原图像高
*@accessprivate
*/
private$imageHeight=NULL;
/**
*@varint$imageType原图像类型
*@accessprivate
*/
private$imageType=NULL;
/**
*@varint$imageWidth原图像宽
*@accessprivate
*/
public$width=NULL;
/**
*@varint$imageHeight原图像高
*@accessprivate
*/
public$height=NULL;
/**
*@varint$imageType原图像类型
*@accessprivate
*/
public$type=NULL;
/**
*@varint$newResource新图像
*@accessprivate
*/
private$newResource=NULL;
/**
*@varint$newResType新图像类型
*@accessprivate
*/
private$newResType=NULL;
/**
*构造函数
*@paramstring$fileName文件名
*/
publicfunction__construct($fileName=NULL){
$this->fileName=$fileName;
if($this->fileName){
$this->getSrcImageInfo();
}
}
/**
*取源图像信息
*@accessprivate
*@returnvoid
*/
privatefunctiongetSrcImageInfo(){
$info=$this->getImageInfo();
$this->imageWidth=$info[0];
$this->imageHeight=$info[1];
$this->imageType=$info[2];
$this->width=$info[0];
$this->height=$info[1];
$this->type=$info[2];
}
/**
*取图像信息
*@paramstring$fileName文件名
*@accessprivate
*@returnarray
*/
privatefunctiongetImageInfo($fileName=NULL){
if($fileName==NULL){
$fileName=$this->fileName;
}
$info=getimagesize($fileName);
return$info;
}
/**
*创建源图像GD资源
*@accessprivate
*@returnvoid
*/
privatefunctioncreateSrcImage(){
$this->imageResource=$this->createImageFromFile();
}
/**
*跟据文件创建图像GD资源
*@paramstring$fileName文件名
*@returngdresource
*/
publicfunctioncreateImageFromFile($fileName=NULL)
{
if(!$fileName){
$fileName=$this->fileName;
$imgType=$this->imageType;
}
if(!is_readable($fileName)||!file_exists($fileName)){
thrownewException('Unabletoopenfile"'.$fileName.'"');
}
if(!$imgType){
$imageInfo=$this->getImageInfo($fileName);
$imgType=$imageInfo[2];
}
switch($imgType){
caseIMAGETYPE_GIF:
$tempResource=imagecreatefromgif($fileName);
break;
caseIMAGETYPE_JPEG:
$tempResource=imagecreatefromjpeg($fileName);
break;
caseIMAGETYPE_PNG:
$tempResource=imagecreatefrompng($fileName);
break;
caseIMAGETYPE_WBMP:
$tempResource=imagecreatefromwbmp($fileName);
break;
caseIMAGETYPE_XBM:
$tempResource=imagecreatefromxbm($fileName);
break;
default:
thrownewException('Unsupportimagetype');
}
return$tempResource;
}
/**
*改变图像大小
*@paramint$width宽
*@paramint$height高
*@paramstring$flag一般而言,允许截图则用4,不允许截图则用1;假设要求一个为4:3比例的图像,则:4=如果太长则自动刪除一部分0=长宽转换成参数指定的1=按比例缩放,自动判断太长还是太宽,长宽约束在参数指定内2=以宽为约束缩放3=以高为约束缩放
*@paramstring$bgcolor如果不为null,则用这个参数指定的颜色作为背景色,并且图像扩充到指定高宽,该参数应该是一个数组;
*@returnstring
*/
publicfunctionresizeImage($width,$height,$flag=1,$bgcolor=null){
$widthRatio=$width/$this->imageWidth;
$heightRatio=$height/$this->imageHeight;
switch($flag){
case1:
if($this->imageHeight<$height&&$this->imageWidth<$width){
$endWidth=$this->imageWidth;
$endHeight=$this->imageHeight;
//return;
}elseif(($this->imageHeight*$widthRatio)>$height){
$endWidth=ceil($this->imageWidth*$heightRatio);
$endHeight=$height;
}else{
$endWidth=$width;
$endHeight=ceil($this->imageHeight*$widthRatio);
}
break;
case2:
$endWidth=$width;
$endHeight=ceil($this->imageHeight*$widthRatio);
break;
case3:
$endWidth=ceil($this->imageWidth*$heightRatio);
$endHeight=$height;
break;
case4:
$endWidth2=$width;
$endHeight2=$height;
if($this->imageHeight<$height&&$this->imageWidth<$width){
$endWidth=$this->imageWidth;
$endHeight=$this->imageHeight;
//return;
}elseif(($this->imageHeight*$widthRatio)<$height){
$endWidth=ceil($this->imageWidth*$heightRatio);
$endHeight=$height;
}else{
$endWidth=$width;
$endHeight=ceil($this->imageHeight*$widthRatio);
}
break;
default:
$endWidth=$width;
$endHeight=$height;
break;
}
if($this->imageResource==NULL){
$this->createSrcImage();
}
if($bgcolor){
$this->newResource=imagecreatetruecolor($width,$height);
$bg=ImageColorAllocate($this->newResource,$bgcolor[0],$bgcolor[1],$bgcolor[2]);
ImageFilledRectangle($this->newResource,0,0,$width,$height,$bg);
$tox=ceil(($width-$endWidth)/2);
$toy=ceil(($height-$endHeight)/2);
if($tox<0)$tox=0;
if($toy<0)$toy=0;
}elseif($flag==4){
$this->newResource=imagecreatetruecolor($endWidth2,$endHeight2);
}else{
$this->newResource=imagecreatetruecolor($endWidth,$endHeight);
}
$this->newResType=$this->imageType;
imagecopyresampled($this->newResource,$this->imageResource,$tox,$toy,0,0,$endWidth,$endHeight,$this->imageWidth,$this->imageHeight);
}
/**
*给图像加水印
*@paramstring$waterContent水印内容可以是图像文件名,也可以是文字
*@paramint$pos位置0-9可以是数组
*@paramint$textFont字体大字,当水印内容是文字时有效
*@paramstring$textColor文字颜色,当水印内容是文字时有效
*@returnstring
*/
publicfunctionwaterMark($waterContent,$pos=0,$textFont=5,$textColor="#ffffff"){
$isWaterImage=file_exists($waterContent);
if($isWaterImage){
$waterImgRes=$this->createImageFromFile($waterContent);
$waterImgInfo=$this->getImageInfo($waterContent);
$waterWidth=$waterImgInfo[0];
$waterHeight=$waterImgInfo[1];
}else{
$waterText=$waterContent;
//$temp=@imagettfbbox(ceil($textFont*2.5),0,"./cour.ttf",$waterContent);
if($temp){
$waterWidth=$temp[2]-$temp[6];
$waterHeight=$temp[3]-$temp[7];
}else{
$waterWidth=100;
$waterHeight=12;
}
}
if($this->imageResource==NULL){
$this->createSrcImage();
}
switch($pos)
{
case0://随机
$posX=rand(0,($this->imageWidth-$waterWidth));
$posY=rand(0,($this->imageHeight-$waterHeight));
break;
case1://1为顶端居左
$posX=0;
$posY=0;
break;
case2://2为顶端居中
$posX=($this->imageWidth-$waterWidth)/2;
$posY=0;
break;
case3://3为顶端居右
$posX=$this->imageWidth-$waterWidth;
$posY=0;
break;
case4://4为中部居左
$posX=0;
$posY=($this->imageHeight-$waterHeight)/2;
break;
case5://5为中部居中
$posX=($this->imageWidth-$waterWidth)/2;
$posY=($this->imageHeight-$waterHeight)/2;
break;
case6://6为中部居右
$posX=$this->imageWidth-$waterWidth;
$posY=($this->imageHeight-$waterHeight)/2;
break;
case7://7为底端居左
$posX=0;
$posY=$this->imageHeight-$waterHeight;
break;
case8://8为底端居中
$posX=($this->imageWidth-$waterWidth)/2;
$posY=$this->imageHeight-$waterHeight;
break;
case9://9为底端居右
$posX=$this->imageWidth-$waterWidth-20;
$posY=$this->imageHeight-$waterHeight-10;
break;
default://随机
$posX=rand(0,($this->imageWidth-$waterWidth));
$posY=rand(0,($this->imageHeight-$waterHeight));
break;
}
imagealphablending($this->imageResource,true);
if($isWaterImage){
imagecopy($this->imageResource,$waterImgRes,$posX,$posY,0,0,$waterWidth,$waterHeight);
}else{
$R=hexdec(substr($textColor,1,2));
$G=hexdec(substr($textColor,3,2));
$B=hexdec(substr($textColor,5));
$textColor=imagecolorallocate($this->imageResource,$R,$G,$B);
imagestring($this->imageResource,$textFont,$posX,$posY,$waterText,$textColor);
}
$this->newResource=$this->imageResource;
$this->newResType=$this->imageType;
}
/**
*生成验证码图片
*@paramint$width宽
*@paramstring$height高
*@paramint$length长度
*@paramint$validType0=数字,1=字母,2=数字加字母
*@paramstring$textColor文字颜色
*@paramstring$backgroundColor背景颜色
*@returnvoid
*/
publicfunctionimageValidate($width,$height,$length=4,$validType=1,$textColor='#000000',$backgroundColor='#ffffff'){
if($validType==1){
$validString='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$validLength=52;
}elseif($validType==2){
$validString='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$validLength=62;
}else{
$validString='123456789';
$validLength=9;
}
srand((int)time());
$valid='';
for($i=0;$i<$length;$i++){
$valid.=$validString{rand(0,$validLength-1)};
}
$this->newResource=imagecreate($width,$height);
$bgR=hexdec(substr($backgroundColor,1,2));
$bgG=hexdec(substr($backgroundColor,3,2));
$bgB=hexdec(substr($backgroundColor,5,2));
$backgroundColor=imagecolorallocate($this->newResource,$bgR,$bgG,$bgB);
$tR=hexdec(substr($textColor,1,2));
$tG=hexdec(substr($textColor,3,2));
$tB=hexdec(substr($textColor,5,2));
$textColor=imagecolorallocate($this->newResource,$tR,$tG,$tB);
for($i=0;$i<strlen($valid);$i++){
imagestring($this->newResource,5,$i*$width/$length+3,2,$valid[$i],$textColor);
}
$this->newResType=IMAGETYPE_JPEG;
return$valid;
}
/**
*显示输出图像
*@returnvoid
*/
publicfunctiondisplay($fileName='',$quality=100){
$imgType=$this->newResType;
$imageSrc=$this->newResource;
switch($imgType){
caseIMAGETYPE_GIF:
if($fileName==''){
header('Content-type:image/gif');
}
imagegif($imageSrc,$fileName,$quality);
break;
caseIMAGETYPE_JPEG:
if($fileName==''){
header('Content-type:image/jpeg');
}
imagejpeg($imageSrc,$fileName,$quality);
break;
caseIMAGETYPE_PNG:
if($fileName==''){
header('Content-type:image/png');
imagepng($imageSrc);
}else{
imagepng($imageSrc,$fileName);
}
break;
caseIMAGETYPE_WBMP:
if($fileName==''){
header('Content-type:image/wbmp');
}
imagewbmp($imageSrc,$fileName,$quality);
break;
caseIMAGETYPE_XBM:
if($fileName==''){
header('Content-type:image/xbm');
}
imagexbm($imageSrc,$fileName,$quality);
break;
default:
thrownewException('Unsupportimagetype');
}
imagedestroy($imageSrc);
}
/**
*保存图像
*@paramint$fileNameType文件名类型0使用原文件名,1使用指定的文件名,2在原文件名加上后缀,3产生随机文件名
*@paramstring$folder文件夹路径为空为与原文件相同
*@paramstring$param参数$fileNameType为1时为文件名2时为后缀
*@returnvoid
*/
publicfunctionsave($fileNameType=0,$folder=NULL,$param='_miniature'){
if($folder==NULL){
$folder=dirname($this->fileName).DIRECTORY_SEPARATOR;
}
$fileExtName=FileSystem::fileExt($this->fileName,true);
$fileBesicName=FileSystem::getBasicName($this->fileName,false);
switch($fileNameType){
case1:
$newFileName=$folder.$param;
break;
case2:
$newFileName=$folder.$fileBesicName.$param.$fileExtName;
break;
case3:
$tmp=date('YmdHis');
$fileBesicName=$tmp;
$i=0;
while(file_exists($folder.$fileBesicName.$fileExtName)){
$fileBesicName=$tmp.$i;
$i++;
}
$newFileName=$folder.$fileBesicName.$fileExtName;
break;
default:
$newFileName=$this->fileName;
break;
}
$this->display($newFileName);
return$newFileName;
}
}
?>
希望本文所述对大家的php程序设计有所帮助。