zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    .net 下比较蛋疼的word 表格转excel表格
    c# 使用oracle表、列备注信息实现高级 查询
    心理学习
    图片 照片 批量 压缩 格式转换 缩略图 旋转 复用办公助手
    人力资源系统技术标准
    年会 司庆 主体活动 婚庆 拓展 复用抽奖软件
    实施组合测试
    maven入门总结
    Apache FtpServer 的使用研究
    2022年Vivado HLS导出IP报错
  • 原文地址:https://www.cnblogs.com/wang1204/p/5570017.html
Copyright © 2011-2022 走看看