欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-12 13:44:28
...

用到两个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;