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

简介: 用到两个image系统函数 imagecopymerge — 拷贝并合并图像的一部分 imagecopyresampled — 重采样拷贝部分图像并调整大小 /* 如何知道图片的大小和类型 无法确认调用函数:Imagecreatefrompng/jpeg…… 可以独处图片的宽和高 相当于宽高是已知的 一个重要的函数getimagesize() */ /*

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



 

 

目录
相关文章
|
7月前
|
Java 程序员 PHP
PHP对象和类
PHP对象和类
59 0
|
小程序 PHP 数据安全/隐私保护
php图片加水印函数
这里分享下php给图片加水印的几个自定义函数 给图片加水印首先需要开启GD库。 用到的php函数是imagecopymerge () 和 imagecopy () imagecopymerge 函数可以支持两个图像叠加时,设置叠加的透明度
87 0
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
3月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
49 2
|
3月前
|
PHP
PHP中的面向对象编程:理解类与对象
本文将深入探讨PHP中面向对象编程的核心概念——类与对象。通过实例讲解,帮助读者更好地理解如何在PHP中运用OOP编写更高效、可维护的代码。
54 9
|
4月前
|
PHP 开发者
PHP中的面向对象编程:掌握类与对象的精髓
探索PHP的面向对象编程世界,本文将带你了解如何通过创建和操作类来实例化对象。我们将深入讲解类的声明、构造函数的使用以及继承和多态性的概念。准备好,让我们一起在代码的海洋中航行,揭开PHP对象编程的神秘面纱!
|
5月前
|
PHP
如何在PHP中创建一个自定义的观察者类?
【7月更文挑战第2天】如何在PHP中创建一个自定义的观察者类?
30 0
|
5月前
|
PHP
PHP中,你可以使用class关键字来定义一个类
【7月更文挑战第2天】PHP中,你可以使用class关键字来定义一个类
31 0
|
6月前
|
Web App开发 Linux PHP
PHP 实现抖音视频去水印播放
该内容主要介绍了如何获取无水印的抖音视频播放地址。原理是通过替换播放地址中的参数来去除水印,首先提供了一个带水印和无水印的播放地址示例。接着,展示了一段PHP代码,该代码通过解析分享链接,获取视频ID,然后利用这些信息通过cURL发送请求,最终得到无水印的播放地址。需要注意的是,由于抖音对PC端的限制,可能需要模拟手机请求来实现。
177 0
|
7月前
|
存储 监控 安全
PHP医院安全(不良)事件报告系统源码 vue2+element支持11大类不良事件上报、审核处理、分析改进
医院安全(不良)事件管理系统采用无责的、自愿的填报不良事件方式,有效地减轻医护人员的思想压力,实现以事件为主要对象,可以自动、及时、实际地反应医院的安全、不良、近失事件的情况,更好地掌握不良事件的发生趋势,为及时采取适当的管理措施和流程、制度改进提供了良好的量化依据。系统通过汇集不同类型事件的报告,从中分析出医院内部潜在的问题和风险,将发生的事故降到最低,从而保证病人安全和医护人员安全。
58 0