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程序设计有所帮助。