常用的php图片处理类(水印、等比缩放、固定高宽)分享
常用的php图片处理类(水印、等比缩放、固定高宽)分享
<?php
//PHP添加水印&比例缩略图&固定高度&固定宽度类。
classImage_process{
public$source;//原图
public$source_width;//原图宽度
public$source_height;//原图高度
public$source_type_id;
public$orign_name;
public$orign_dirname;
//传入原图路径
publicfunction__construct($source){
$this->typeList=array(1=>'gif',2=>'jpg',3=>'png');
$ginfo=getimagesize($source);
$this->source_width=$ginfo[0];
$this->source_height=$ginfo[1];
$this->source_type_id=$ginfo[2];
$this->orign_url=$source;
$this->orign_name=basename($source);
$this->orign_dirname=dirname($source);
}
//判断图片的文件的格式,返回PHP可识别的编码
publicfunctionjudgeType($type,$source){
if($type==1){
returnimagecreatefromgif($source);//gif
}elseif($type==2){
returnimagecreatefromjpeg($source);//jpg
}elseif($type==3){
returnimagecreatefrompng($source);//png
}else{
returnfalse;
}
}
//生成水印图片
publicfunctionwaterMakeImage($logo){
$linfo=getimagesize($logo);
$logo_width=$linfo[0];
$logo_height=$linfo[1];
$logo_type_id=$linfo[2];
$sourceHandle=$this->judgeType($this->source_type_id,$this->orign_url);
$logoHandle=$this->judgeType($logo_type_id,$logo);
if(!$sourceHandle||!$logoHandle){
returnfalse;
}
$x=($this->source_width-$logo_width)/2;
$y=($this->source_height-$logo_height)/2;
imagecopy($sourceHandle,$logoHandle,$x,$y,0,0,$logo_width,$logo_height);
$newPic=$this->orign_dirname.'\water_'.time().'.'.$this->typeList[$this->source_type_id];
if($this->saveImage($sourceHandle,$newPic)){
imagedestroy($sourceHandle);
imagedestroy($logoHandle);
}
}
//固定高度宽度
publicfunctionfixSizeImage($width,$height){
if($width>$this->source_width)$this->source_width;
if($height>$this->source_height)$this->source_height;
if($width===false){
$width=floor($this->source_width/($this->source_height/$height));
}
if($height===false){
$height=floor($this->source_height/($this->source_width/$width));
}
$this->tinyImage($width,$height);
}
//等比例缩放图片
publicfunctionscaleImage($scale){
$width=floor($this->source_width*$scale);
$height=floor($this->source_height*$scale);
$this->tinyImage($width,$height);
}
//创建缩略图
publicfunctiontinyImage($width,$height){
$tinyImage=imagecreatetruecolor($width,$height);
$handle=$this->judgeType($this->source_type_id,$this->orign_url);
if(function_exists('imagecopyresampled')){
imagecopyresampled($tinyImage,$handle,0,0,0,0,$width,$height,$this->source_width,$this->source_height);
}else{
imagecopyresized($tinyImage,$handle,0,0,0,0,$width,$height,$this->source_width,$this->source_height);
}
$newPic=$this->orign_dirname.'\thumb_'.time().'_'.$width."_".$height.".".$this->typeList[$this->source_type_id];
if($this->saveImage($tinyImage,$newPic)){
imagedestroy($tinyImage);
imagedestroy($handle);
}
}
//保存图片
privatefunctionsaveImage($image,$url){
if(imagejpeg($image,$url)){
returntrue;
}
}
}
$imgHandle=newImage_process('D:\AppServ\www\test\getimg\14061907445601.jpg');
//$imgHandle->waterMakeImage('D:\AppServ\www\test\getimg\shougongke.png');//生成水印图片
//$imgHandle->fixSizeImage(200,150);//固定长度图片
$imgHandle->scaleImage(0.2);//等比例缩放
?>
示例二:
<?php
/**
*
*图像处理类
*@authorFC_LAMP
*@internal功能包含:水印,缩略图
*/
classImg
{
//图片格式
private$exts=array('jpg','jpeg','gif','bmp','png');
/**
*
*
*@throwsException
*/
publicfunction__construct()
{
if(!function_exists('gd_info'))
{
thrownewException('加载GD库失败!');
}
}
/**
*
*裁剪压缩
*@param$src_img图片
*@param$save_img生成后的图片
*@param$option参数选项,包括:$maxwidth宽$maxheight高
*array('width'=>xx,'height'=>xxx)
*@internal
*我们一般的压缩图片方法,在图片过长或过宽时生成的图片
*都会被“压扁”,针对这个应采用先裁剪后按比例压缩的方法
*/
publicfunctionthumb_img($src_img,$save_img='',$option)
{
if(empty($option['width'])orempty($option['height']))
{
returnarray('flag'=>False,'msg'=>'原图长度与宽度不能小于0');
}
$org_ext=$this->is_img($src_img);
if(!$org_ext['flag'])
{
return$org_ext;
}
//如果有保存路径,则确定路径是否正确
if(!empty($save_img))
{
$f=$this->check_dir($save_img);
if(!$f['flag'])
{
return$f;
}
}
//获取出相应的方法
$org_funcs=$this->get_img_funcs($org_ext['msg']);
//获取原大小
$source=$org_funcs['create_func']($src_img);
$src_w=imagesx($source);
$src_h=imagesy($source);
//调整原始图像(保持图片原形状裁剪图像)
$dst_scale=$option['height']/$option['width'];//目标图像长宽比
$src_scale=$src_h/$src_w;//原图长宽比
if($src_scale>=$dst_scale)
{//过高
$w=intval($src_w);
$h=intval($dst_scale*$w);
$x=0;
$y=($src_h-$h)/3;
}else
{//过宽
$h=intval($src_h);
$w=intval($h/$dst_scale);
$x=($src_w-$w)/2;
$y=0;
}
//剪裁
$croped=imagecreatetruecolor($w,$h);
imagecopy($croped,$source,0,0,$x,$y,$src_w,$src_h);
//缩放
$scale=$option['width']/$w;
$target=imagecreatetruecolor($option['width'],$option['height']);
$final_w=intval($w*$scale);
$final_h=intval($h*$scale);
imagecopyresampled($target,$croped,0,0,0,0,$final_w,$final_h,$w,$h);
imagedestroy($croped);
//输出(保存)图片
if(!empty($save_img))
{
$org_funcs['save_func']($target,$save_img);
}else
{
header($org_funcs['header']);
$org_funcs['save_func']($target);
}
imagedestroy($target);
returnarray('flag'=>True,'msg'=>'');
}
/**
*
*等比例缩放图像
*@param$src_img原图片
*@param$save_img需要保存的地方
*@param$option参数设置array('width'=>xx,'height'=>xxx)
*
*/
functionresize_image($src_img,$save_img='',$option)
{
$org_ext=$this->is_img($src_img);
if(!$org_ext['flag'])
{
return$org_ext;
}
//如果有保存路径,则确定路径是否正确
if(!empty($save_img))
{
$f=$this->check_dir($save_img);
if(!$f['flag'])
{
return$f;
}
}
//获取出相应的方法
$org_funcs=$this->get_img_funcs($org_ext['msg']);
//获取原大小
$source=$org_funcs['create_func']($src_img);
$src_w=imagesx($source);
$src_h=imagesy($source);
if(($option['width']&&$src_w>$option['width'])||($option['height']&&$src_h>$option['height']))
{
if($option['width']&&$src_w>$option['width'])
{
$widthratio=$option['width']/$src_w;
$resizewidth_tag=true;
}
if($option['height']&&$src_h>$option['height'])
{
$heightratio=$option['height']/$src_h;
$resizeheight_tag=true;
}
if($resizewidth_tag&&$resizeheight_tag)
{
if($widthratio<$heightratio)
$ratio=$widthratio;
else
$ratio=$heightratio;
}
if($resizewidth_tag&&!$resizeheight_tag)
$ratio=$widthratio;
if($resizeheight_tag&&!$resizewidth_tag)
$ratio=$heightratio;
$newwidth=$src_w*$ratio;
$newheight=$src_h*$ratio;
if(function_exists("imagecopyresampled"))
{
$newim=imagecreatetruecolor($newwidth,$newheight);
imagecopyresampled($newim,$source,0,0,0,0,$newwidth,$newheight,$src_w,$src_h);
}else
{
$newim=imagecreate($newwidth,$newheight);
imagecopyresized($newim,$source,0,0,0,0,$newwidth,$newheight,$src_w,$src_h);
}
}
//输出(保存)图片
if(!empty($save_img))
{
$org_funcs['save_func']($newim,$save_img);
}else
{
header($org_funcs['header']);
$org_funcs['save_func']($newim);
}
imagedestroy($newim);
returnarray('flag'=>True,'msg'=>'');
}
/**
*
*生成水印图片
*@param$org_img原图像
*@param$mark_img水印标记图像
*@param$save_img当其目录不存在时,会试着创建目录
*@paramarray$option为水印的一些基本设置包含:
*x:水印的水平位置,默认为减去水印图宽度后的值
*y:水印的垂直位置,默认为减去水印图高度后的值
*alpha:alpha值(控制透明度),默认为50
*/
publicfunctionwater_mark($org_img,$mark_img,$save_img='',$option=array())
{
//检查图片
$org_ext=$this->is_img($org_img);
if(!$org_ext['flag'])
{
return$org_ext;
}
$mark_ext=$this->is_img($mark_img);
if(!$mark_ext['flag'])
{
return$mark_ext;
}
//如果有保存路径,则确定路径是否正确
if(!empty($save_img))
{
$f=$this->check_dir($save_img);
if(!$f['flag'])
{
return$f;
}
}
//获取相应画布
$org_funcs=$this->get_img_funcs($org_ext['msg']);
$org_img_im=$org_funcs['create_func']($org_img);
$mark_funcs=$this->get_img_funcs($mark_ext['msg']);
$mark_img_im=$mark_funcs['create_func']($mark_img);
//拷贝水印图片坐标
$mark_img_im_x=0;
$mark_img_im_y=0;
//拷贝水印图片高宽
$mark_img_w=imagesx($mark_img_im);
$mark_img_h=imagesy($mark_img_im);
$org_img_w=imagesx($org_img_im);
$org_img_h=imagesx($org_img_im);
//合成生成点坐标
$x=$org_img_w-$mark_img_w;
$org_img_im_x=isset($option['x'])?$option['x']:$x;
$org_img_im_x=($org_img_im_x>$org_img_wor$org_img_im_x<0)?$x:$org_img_im_x;
$y=$org_img_h-$mark_img_h;
$org_img_im_y=isset($option['y'])?$option['y']:$y;
$org_img_im_y=($org_img_im_y>$org_img_hor$org_img_im_y<0)?$y:$org_img_im_y;
//alpha
$alpha=isset($option['alpha'])?$option['alpha']:50;
$alpha=($alpha>100or$alpha<0)?50:$alpha;
//合并图片
imagecopymerge($org_img_im,$mark_img_im,$org_img_im_x,$org_img_im_y,$mark_img_im_x,$mark_img_im_y,$mark_img_w,$mark_img_h,$alpha);
//输出(保存)图片
if(!empty($save_img))
{
$org_funcs['save_func']($org_img_im,$save_img);
}else
{
header($org_funcs['header']);
$org_funcs['save_func']($org_img_im);
}
//销毁画布
imagedestroy($org_img_im);
imagedestroy($mark_img_im);
returnarray('flag'=>True,'msg'=>'');
}
/**
*
*检查图片
*@paramunknown_type$img_path
*@returnarray('flag'=>true/false,'msg'=>ext/错误信息)
*/
privatefunctionis_img($img_path)
{
if(!file_exists($img_path))
{
returnarray('flag'=>False,'msg'=>"加载图片$img_path失败!");
}
$ext=explode('.',$img_path);
$ext=strtolower(end($ext));
if(!in_array($ext,$this->exts))
{
returnarray('flag'=>False,'msg'=>"图片$img_path格式不正确!");
}
returnarray('flag'=>True,'msg'=>$ext);
}
/**
*
*返回正确的图片函数
*@paramunknown_type$ext
*/
privatefunctionget_img_funcs($ext)
{
//选择
switch($ext)
{
case'jpg':
$header='Content-Type:image/jpeg';
$createfunc='imagecreatefromjpeg';
$savefunc='imagejpeg';
break;
case'jpeg':
$header='Content-Type:image/jpeg';
$createfunc='imagecreatefromjpeg';
$savefunc='imagejpeg';
break;
case'gif':
$header='Content-Type:image/gif';
$createfunc='imagecreatefromgif';
$savefunc='imagegif';
break;
case'bmp':
$header='Content-Type:image/bmp';
$createfunc='imagecreatefrombmp';
$savefunc='imagebmp';
break;
default:
$header='Content-Type:image/png';
$createfunc='imagecreatefrompng';
$savefunc='imagepng';
}
returnarray('save_func'=>$savefunc,'create_func'=>$createfunc,'header'=>$header);
}
/**
*
*检查并试着创建目录
*@param$save_img
*/
privatefunctioncheck_dir($save_img)
{
$dir=dirname($save_img);
if(!is_dir($dir))
{
if(!mkdir($dir,0777,true))
{
returnarray('flag'=>False,'msg'=>"图片保存目录$dir无法创建!");
}
}
returnarray('flag'=>True,'msg'=>'');
}
}
if(!empty($_FILES['test']['tmp_name']))
{
//例子
$img=newImg();
//原图
$name=explode('.',$_FILES['test']['name']);
$org_img='D:/test.'.end($name);
move_uploaded_file($_FILES['test']['tmp_name'],$org_img);
$option=array('width'=>$_POST['width'],'height'=>$_POST['height']);
if($_POST['type']==1)
{
$s=$img->resize_image($org_img,'',$option);
}else
{
$img->thumb_img($org_img,'',$option);
}
unlink($org_img);
}
以上所述就是本文的全部内容了,希望大家能够喜欢。