php之图片处理类缩略图加水印

用到两个image系统函数

imagecopymerge 拷贝并合并图像的一部分

imagecopyresampled 重采样拷贝部分图像并调整大小

/*
如何知道图片的大小和类型
无法确认调用函数:Imagecreatefrompng/jpeg……
可以独处图片的宽和高

相当于宽高是已知的
一个重要的函数getimagesize()
*/

/*
想操作图片
先把图片的大小,类型信息得到

水印:就是把指定的水印复制到目标上,并加透明效果

缩略图:就是把大图片复制到小尺寸画面上

*/



class ImageTool{

	//imageinfo	分析图片的信息
	//return array()
	public static function imageInfo($image){
		//判断图片是否存在
		if(!file_exists($image)){
			return false;
		
		}
		$info = getimagesize($image);
		if($info == false){
			return false;
		}
		
		//此时info分析出来是一个数组
		$img['width'] = $info[0];
		$img['height'] = $info[1];
		//分析图片的后缀
		$img['ext'] = substr($info['mime'],strpos($info['mime'],'/')+1);
		
		return $img;
	} 
	
	/*
	加水印
	string $dst 待操作图片
	       $water 水印小图
		   $save  不填,则默认替换原始图
		   $alpha  透明度
		   $pos    水印图放的位置1234,顺时针
	*/
	public static function water($dst,$water,$save=NULL,$pos=2,$alpha=50){
		//先保证两个图片存在
		if(!file_exists($dst) || !file_exists($water)){
			return false;
		}
		
		//1.保证水印不能比待操作图片还大
		$dinfo = self::imageInfo($dst);
		$winfo = self::imageInfo($water);
		
		//判断 
		if($winfo['height'] > $dinfo['height'] || $winfo['width'] > $dinfo['width']){
			return false;
		}
		
		//两张图,读到画布上,但是图片可能是png,可能是jpeg,用什么函数来读
		$dfunc = 'imagecreatefrom' .$dinfo['ext'];
		$wfunc = 'imagecreatefrom' .$winfo['ext'];
		
		if(!function_exists($dfunc) || !function_exists($wfunc)){
			return false;
		}
		
		//动态加载函数来创建画布
		$dim = $dfunc($dst); //创建待操作的画布
		$wim = $wfunc($water); //创建水印画布
		
		//根据水印的位置,计算粘贴的坐标
		switch($pos){
			case 0; //左上角
			$posx = 0;
			$posy = 0;
			break;
			
			case 1; //右上角
			$posx = $dinfo['width'] - $winfo['width'];
			$posy = 0;
			break;
			
			case 2; //左下角
			$posx = 0;
			$posy = $dinfo['height'] - $winfo['height'];
			break;
			
			default:   //默认右下角
			$posx = $dinfo['width'] - $winfo['width'];
			$posy = $dinfo['height'] - $winfo['height'];
			
		}
		
		//加水印 在什么位置?
		// imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )

		imagecopymerge($dim,$wim,$posx,$posy,0,0,$winfo['width'],$winfo['height'],$alpha);
		
		if(!$save){
		
			$save=$dst;
			unlink($dst); //删除原图
		}
		
		//保存图片
		$createfunc = 'image' . $dinfo['ext'];
		$createfunc($dim,$save);
		
		//销毁图片
		imagedestroy($dim);
		imagedestroy($wim);
		
		return true;
	}

	/*
		thumb 生成缩略图
		等比例缩放,两边留白
	*/
	public static function thumb($dst,$save=NULL,$width=200,$height=200){
		//首先判断待处理的图片是否存在
		$dinfo = self::imageInfo($dst);
		if($dinfo == false){
			return false;
		}
		
		//计算缩放比例
		$calc = min($width/$dinfo['width'],$height/$dinfo['height']);
		
		//创建原始图的画布
		$dfunc = 'imagecreatefrom'.$dinfo['ext'];
		$dim = $dfunc($dst);
		
		//创建缩略图画布
		$tim = imagecreatetruecolor($width,$height);
		
		//创建白色填充缩略图画布
		$white = imagecolorallocate($tim,255,255,255);
		
		//填充缩略画布
		imagefill($tim,0,0,$white);
		
		//复制并缩略
		$dwidth = (int)$dinfo['width']*$calc;
		$dheight = (int)$dinfo['height']*$calc;
		
		$paddingx = ($width - $dwidth) / 2;
		$paddingy = ($height - $dheight) /2;
		
		imagecopyresampled($tim,$dim,$paddingx,$paddingy,0,0,$dwidth,$dheight,$dinfo['width'],$dinfo['height']);
		
		//保存图片
		if(!$save){
			$save = $dst;
			unlink($dst);
		}
		$createfun = 'image'.$dinfo['ext'];
		$createfun($tim,$save);
		
		imagedestroy($dim);
		imagedestroy($tim);
		
		return true;
		
	}		

调用传参:

//调用传参  加水印
echo ImageTool::water('原图片地址','加水印图片地址','生成图片')?'ok':false;
//调用 缩略图
echo ImageTool::thumb('原图地址','生成图片地址',200,200)?'ok':false;



 

 

上一篇:php之文件上传简单介绍


下一篇:php之文件上传类代码