php将图片保存为不同尺寸图片的图片类实例
本文实例讲述了php将图片保存为不同规格的图片类。分享给大家供大家参考。具体如下:
图片处理类.imagecls.php如下:
<?php
/**
图片处理类
*/
classimagecls
{
/**
*文件信息
*/
var$file=array();
/**
*保存目录
*/
var$dir='';
/**
*错误代码
*/
var$error_code=0;
/**
*文件上传最大KB
*/
var$max_size=-1;
functiones_imagecls()
{
}
privatefunctioncheckSize($size)
{
return!($size>$this->max_size)||(-1==$this->max_size);
}
/**
*处理上传文件
*@paramarray$file上传的文件
*@paramstring$dir保存的目录
*@returnbool
*/
functioninit($file,$dir='temp')
{
if(!is_array($file)||empty($file)||!$this->isUploadFile($file['tmp_name'])||trim($file['name'])==''||$file['size']==0)
{
$this->file=array();
$this->error_code=-1;
returnfalse;
}
else
{
$file['size']=intval($file['size']);
$file['name']=trim($file['name']);
$file['thumb']='';
$file['ext']=$this->fileExt($file['name']);
$file['name']=htmlspecialchars($file['name'],ENT_QUOTES);
$file['is_image']=$this->isImageExt($file['ext']);
$file['file_dir']=$this->getTargetDir($dir);
$file['prefix']=md5(microtime(true)).rand(10,99);
$file['target']="./public/".$file['file_dir'].'/'.$file['prefix'].'.jpg';//相对
$file['local_target']=APP_ROOT_PATH."public/".$file['file_dir'].'/'.$file['prefix'].'.jpg';//物理
$this->file=&$file;
$this->error_code=0;
returntrue;
}
}
/**
*保存文件
*@returnbool
*/
functionsave()
{
if(empty($this->file)||empty($this->file['tmp_name']))
$this->error_code=-101;
elseif(!$this->checkSize($this->file['size']))
$this->error_code=-105;
elseif(!$this->file['is_image'])
$this->error_code=-102;
elseif(!$this->saveFile($this->file['tmp_name'],$this->file['local_target']))
$this->error_code=-103;
elseif($this->file['is_image']&&(!$this->file['image_info']=$this->getImageInfo($this->file['local_target'],true)))
{
$this->error_code=-104;
@unlink($this->file['local_target']);
}
else
{
$this->error_code=0;
returntrue;
}
returnfalse;
}
/**
*获取错误代码
*@returnnumber
*/
functionerror()
{
return$this->error_code;
}
/**
*获取文件扩展名
*@returnstring
*/
functionfileExt($file_name)
{
returnaddslashes(strtolower(substr(strrchr($file_name,'.'),1,10)));
}
/**
*根据扩展名判断文件是否为图像
*@paramstring$ext扩展名
*@returnbool
*/
functionisImageExt($ext)
{
static$img_ext=array('jpg','jpeg','png','bmp','gif','giff');
returnin_array($ext,$img_ext)?1:0;
}
/**
*获取图像信息
*@paramstring$target文件路径
*@returnmixed
*/
functiongetImageInfo($target)
{
$ext=es_imagecls::fileExt($target);
$is_image=es_imagecls::isImageExt($ext);
if(!$is_image)
returnfalse;
elseif(!is_readable($target))
returnfalse;
elseif($image_info=@getimagesize($target))
{
list($width,$height,$type)=!empty($image_info)?$image_info:array('','','');
$size=$width*$height;
if($is_image&&!in_array($type,array(1,2,3,6,13)))
returnfalse;
$image_info['type']=strtolower(substr(image_type_to_extension($image_info[2]),1));
return$image_info;
}
else
returnfalse;
}
/**
*获取是否充许上传文件
*@paramstring$source文件路径
*@returnbool
*/
functionisUploadFile($source)
{
return$source&&($source!='none')&&(is_uploaded_file($source)||is_uploaded_file(str_replace('\\\\','\\',$source)));
}
/**
*获取保存的路径
*@paramstring$dir指定的保存目录
*@returnstring
*/
functiongetTargetDir($dir)
{
if(!is_dir(APP_ROOT_PATH."public/".$dir)){
@mkdir(APP_ROOT_PATH."public/".$dir);
@chmod(APP_ROOT_PATH."public/".$dir,0777);
}
return$dir;
}
/**
*保存文件
*@paramstring$source源文件路径
*@paramstring$target目录文件路径
*@returnbool
*/
privatefunctionsaveFile($source,$target)
{
if(!es_imagecls::isUploadFile($source))
$succeed=false;
elseif(@copy($source,$target))
$succeed=true;
elseif(function_exists('move_uploaded_file')&&@move_uploaded_file($source,$target))
$succeed=true;
elseif(@is_readable($source)&&(@$fp_s=fopen($source,'rb'))&&(@$fp_t=fopen($target,'wb')))
{
while(!feof($fp_s))
{
$s=@fread($fp_s,1024*512);
@fwrite($fp_t,$s);
}
fclose($fp_s);
fclose($fp_t);
$succeed=true;
}
if($succeed)
{
$this->error_code=0;
@chmod($target,0644);
@unlink($source);
}
else
{
$this->error_code=0;
}
return$succeed;
}
publicfunctionthumb($image,$maxWidth=200,$maxHeight=50,$gen=0,$interlace=true,$filepath='',$is_preview=true)
{
$info=es_imagecls::getImageInfo($image);
if($info!==false)
{
$srcWidth=$info[0];
$srcHeight=$info[1];
$type=$info['type'];
$interlace=$interlace?1:0;
unset($info);
if($maxWidth>0&&$maxHeight>0)
$scale=min($maxWidth/$srcWidth,$maxHeight/$srcHeight);//计算缩放比例
elseif($maxWidth==0)
$scale=$maxHeight/$srcHeight;
elseif($maxHeight==0)
$scale=$maxWidth/$srcWidth;
$paths=pathinfo($image);
$paths['filename']=trim(strtolower($paths['basename']),".".strtolower($paths['extension']));
$basefilename=explode("_",$paths['filename']);
$basefilename=$basefilename[0];
if(empty($filepath))
{
if($is_preview)
$thumbname=$paths['dirname'].'/'.$basefilename.'_'.$maxWidth.'x'.$maxHeight.'.jpg';
else
$thumbname=$paths['dirname'].'/'.$basefilename.'o_'.$maxWidth.'x'.$maxHeight.'.jpg';
}
else
$thumbname=$filepath;
$thumburl=str_replace(APP_ROOT_PATH,'./',$thumbname);
if($scale>=1)
{
//超过原图大小不再缩略
$width=$srcWidth;
$height=$srcHeight;
if(!$is_preview)
{
//非预览模式写入原图
file_put_contents($thumbname,file_get_contents($image));//用原图写入
returnarray('url'=>$thumburl,'path'=>$thumbname);
}
}
else
{
//缩略图尺寸
$width=(int)($srcWidth*$scale);
$height=(int)($srcHeight*$scale);
}
if($gen==1)
{
$width=$maxWidth;
$height=$maxHeight;
}
//载入原图
$createFun='imagecreatefrom'.($type=='jpg'?'jpeg':$type);
if(!function_exists($createFun))
$createFun='imagecreatefromjpeg';
$srcImg=$createFun($image);
//创建缩略图
if($type!='gif'&&function_exists('imagecreatetruecolor'))
$thumbImg=imagecreatetruecolor($width,$height);
else
$thumbImg=imagecreate($width,$height);
$x=0;
$y=0;
if($gen==1&&$maxWidth>0&&$maxHeight>0)
{
$resize_ratio=$maxWidth/$maxHeight;
$src_ratio=$srcWidth/$srcHeight;
if($src_ratio>=$resize_ratio)
{
$x=($srcWidth-($resize_ratio*$srcHeight))/2;
$width=($height*$srcWidth)/$srcHeight;
}
else
{
$y=($srcHeight-((1/$resize_ratio)*$srcWidth))/2;
$height=($width*$srcHeight)/$srcWidth;
}
}
//复制图片
if(function_exists("imagecopyresampled"))
imagecopyresampled($thumbImg,$srcImg,0,0,$x,$y,$width,$height,$srcWidth,$srcHeight);
else
imagecopyresized($thumbImg,$srcImg,0,0,$x,$y,$width,$height,$srcWidth,$srcHeight);
if('gif'==$type||'png'==$type){
$background_color=imagecolorallocate($thumbImg,0,255,0);//指派一个绿色
imagecolortransparent($thumbImg,$background_color);//设置为透明色,若注释掉该行则输出绿色的图
}
//对jpeg图形设置隔行扫描
if('jpg'==$type||'jpeg'==$type)
imageinterlace($thumbImg,$interlace);
//生成图片
imagejpeg($thumbImg,$thumbname,100);
imagedestroy($thumbImg);
imagedestroy($srcImg);
returnarray('url'=>$thumburl,'path'=>$thumbname);
}
returnfalse;
}
publicfunctionmake_thumb($srcImg,$srcWidth,$srcHeight,$type,$maxWidth=200,$maxHeight=50,$gen=0)
{
$interlace=$interlace?1:0;
if($maxWidth>0&&$maxHeight>0)
$scale=min($maxWidth/$srcWidth,$maxHeight/$srcHeight);//计算缩放比例
elseif($maxWidth==0)
$scale=$maxHeight/$srcHeight;
elseif($maxHeight==0)
$scale=$maxWidth/$srcWidth;
if($scale>=1)
{
//超过原图大小不再缩略
$width=$srcWidth;
$height=$srcHeight;
}
else
{
//缩略图尺寸
$width=(int)($srcWidth*$scale);
$height=(int)($srcHeight*$scale);
}
if($gen==1)
{
$width=$maxWidth;
$height=$maxHeight;
}
//创建缩略图
if($type!='gif'&&function_exists('imagecreatetruecolor'))
$thumbImg=imagecreatetruecolor($width,$height);
else
$thumbImg=imagecreatetruecolor($width,$height);
$x=0;
$y=0;
if($gen==1&&$maxWidth>0&&$maxHeight>0)
{
$resize_ratio=$maxWidth/$maxHeight;
$src_ratio=$srcWidth/$srcHeight;
if($src_ratio>=$resize_ratio)
{
$x=($srcWidth-($resize_ratio*$srcHeight))/2;
$width=($height*$srcWidth)/$srcHeight;
}
else
{
$y=($srcHeight-((1/$resize_ratio)*$srcWidth))/2;
$height=($width*$srcHeight)/$srcWidth;
}
}
//复制图片
if(function_exists("imagecopyresampled"))
imagecopyresampled($thumbImg,$srcImg,0,0,$x,$y,$width,$height,$srcWidth,$srcHeight);
else
imagecopyresized($thumbImg,$srcImg,0,0,$x,$y,$width,$height,$srcWidth,$srcHeight);
if('gif'==$type||'png'==$type){
$background_color=imagecolorallocate($thumbImg,255,255,255);//指派一个绿色
imagecolortransparent($thumbImg,$background_color);//设置为透明色,若注释掉该行则输出绿色的图
}
//对jpeg图形设置隔行扫描
if('jpg'==$type||'jpeg'==$type)
imageinterlace($thumbImg,$interlace);
return$thumbImg;
}
publicfunctionwater($source,$water,$alpha=80,$position="0")
{
//检查文件是否存在
if(!file_exists($source)||!file_exists($water))
returnfalse;
//图片信息
$sInfo=es_imagecls::getImageInfo($source);
$wInfo=es_imagecls::getImageInfo($water);
//如果图片小于水印图片,不生成图片
if($sInfo["0"]<$wInfo["0"]||$sInfo['1']<$wInfo['1'])
returnfalse;
if(is_animated_gif($source))
{
require_onceAPP_ROOT_PATH."system/utils/gif_encoder.php";
require_onceAPP_ROOT_PATH."system/utils/gif_reader.php";
$gif=newGIFReader();
$gif->load($source);
foreach($gif->IMGS['frames']as$k=>$img)
{
$im=imagecreatefromstring($gif->getgif($k));
//为im加水印
$sImage=$im;
$wCreateFun="imagecreatefrom".$wInfo['type'];
if(!function_exists($wCreateFun))
$wCreateFun='imagecreatefromjpeg';
$wImage=$wCreateFun($water);
//设定图像的混色模式
imagealphablending($wImage,true);
switch(intval($position))
{
case0:break;
//左上
case1:
$posY=0;
$posX=0;
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
//右上
case2:
$posY=0;
$posX=$sInfo[0]-$wInfo[0];
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
//左下
case3:
$posY=$sInfo[1]-$wInfo[1];
$posX=0;
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
//右下
case4:
$posY=$sInfo[1]-$wInfo[1];
$posX=$sInfo[0]-$wInfo[0];
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
//居中
case5:
$posY=$sInfo[1]/2-$wInfo[1]/2;
$posX=$sInfo[0]/2-$wInfo[0]/2;
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
}
//endim加水印
ob_start();
imagegif($sImage);
$content=ob_get_contents();
ob_end_clean();
$frames[]=$content;
$framed[]=$img['frameDelay'];
}
$gif_maker=newGIFEncoder(
$frames,
$framed,
0,
2,
0,0,0,
"bin"//bin为二进制url为地址
);
$image_rs=$gif_maker->GetAnimation();
//如果没有给出保存文件名,默认为原图像名
@unlink($source);
//保存图像
file_put_contents($source,$image_rs);
returntrue;
}
//建立图像
$sCreateFun="imagecreatefrom".$sInfo['type'];
if(!function_exists($sCreateFun))
$sCreateFun='imagecreatefromjpeg';
$sImage=$sCreateFun($source);
$wCreateFun="imagecreatefrom".$wInfo['type'];
if(!function_exists($wCreateFun))
$wCreateFun='imagecreatefromjpeg';
$wImage=$wCreateFun($water);
//设定图像的混色模式
imagealphablending($wImage,true);
switch(intval($position))
{
case0:break;
//左上
case1:
$posY=0;
$posX=0;
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
//右上
case2:
$posY=0;
$posX=$sInfo[0]-$wInfo[0];
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
//左下
case3:
$posY=$sInfo[1]-$wInfo[1];
$posX=0;
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
//右下
case4:
$posY=$sInfo[1]-$wInfo[1];
$posX=$sInfo[0]-$wInfo[0];
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
//居中
case5:
$posY=$sInfo[1]/2-$wInfo[1]/2;
$posX=$sInfo[0]/2-$wInfo[0]/2;
//生成混合图像
imagecopymerge($sImage,$wImage,$posX,$posY,0,0,$wInfo[0],$wInfo[1],$alpha);
break;
}
//如果没有给出保存文件名,默认为原图像名
@unlink($source);
//保存图像
imagejpeg($sImage,$source,100);
imagedestroy($sImage);
}
}
if(!function_exists('image_type_to_extension'))
{
functionimage_type_to_extension($imagetype)
{
if(empty($imagetype))
returnfalse;
switch($imagetype)
{
caseIMAGETYPE_GIF:return'.gif';
caseIMAGETYPE_JPEG:return'.jpeg';
caseIMAGETYPE_PNG:return'.png';
caseIMAGETYPE_SWF:return'.swf';
caseIMAGETYPE_PSD:return'.psd';
caseIMAGETYPE_BMP:return'.bmp';
caseIMAGETYPE_TIFF_II:return'.tiff';
caseIMAGETYPE_TIFF_MM:return'.tiff';
caseIMAGETYPE_JPC:return'.jpc';
caseIMAGETYPE_JP2:return'.jp2';
caseIMAGETYPE_JPX:return'.jpf';
caseIMAGETYPE_JB2:return'.jb2';
caseIMAGETYPE_SWC:return'.swc';
caseIMAGETYPE_IFF:return'.aiff';
caseIMAGETYPE_WBMP:return'.wbmp';
caseIMAGETYPE_XBM:return'.xbm';
default:returnfalse;
}
}
}
?>
2.get_spec_img()调用图片类,然后再用下面的方法保存不同规格的图片并返回图片连接
//获取相应规格的图片地址
//gen=0:保持比例缩放,不剪裁,如高为0,则保证宽度按比例缩放gen=1:保证长宽,剪裁
functionget_spec_image($img_path,$width=0,$height=0,$gen=0,$is_preview=true)
{
if($width==0)
$new_path=$img_path;
else
{
$img_name=substr($img_path,0,-4);
$img_ext=substr($img_path,-3);
if($is_preview)
$new_path=$img_name."_".$width."x".$height.".jpg";
else
$new_path=$img_name."o_".$width."x".$height.".jpg";
if(!file_exists($new_path))
{
require_once"imagecls.php";
$imagec=newimagecls();
$thumb=$imagec->thumb($img_path,$width,$height,$gen,true,"",$is_preview);
if(app_conf("PUBLIC_DOMAIN_ROOT")!='')
{
$paths=pathinfo($new_path);
$path=str_replace("./","",$paths['dirname']);
$filename=$paths['basename'];
$pathwithoupublic=str_replace("public/","",$path);
$file_data=@file_get_contents($path.$file);
$img=@imagecreatefromstring($file_data);
if($img!==false)
{
$save_path="public/".$path;
if(!is_dir($save_path))
{
@mk_dir($save_path);
}
@file_put_contents($save_path.$name,$file_data);
}
}
}
}
return$new_path;
}
3.使用方法:
//im:将店铺图片保存为3种规格:小图:48x48,中图120x120,大图200x200 $small_url=get_spec_image($data['image'],48,48,0); $<spanid="result_box"class="short_text"lang="en"><span>middle_url</span></span>=get_spec_image($data['image'],120,120,0); $big_url=get_spec_image($data['image'],200,200,0);
希望本文所述对大家的php程序设计有所帮助。