PHP 图片水印类代码


Posted in PHP onAugust 27, 2012

支持文字水印、图片水印
支持水印的位置随机或固定(九宫格)
水印透明度设置(图片水印和文字水印都支持)
文字水印的字体、颜色、大小设置
图片水印的背景透明

<?php 
/** 
* 加水印类,支持文字图片水印的透明度设置、水印图片背景透明。 
* 日期:2011-09-27 
* 作者:3water.com 
* 使用: 
* $obj = new WaterMask($imgFileName); //实例化对象 
* $obj->$waterType = 1; //类型:0为文字水印、1为图片水印 
* $obj->$transparent = 45; //水印透明度 
* $obj->$waterStr = '3water.com'; //水印文字 
* $obj->$fontSize = 16; //文字字体大小 
* $obj->$fontColor = array(255,0255); //水印文字颜色(RGB) 
* $obj->$fontFile = = 'AHGBold.ttf'; //字体文件 
* $obj->output(); //输出水印图片文件覆盖到输入的图片文件 
*/ 
class WaterMask{ 
public $waterType = 1; //水印类型:0为文字水印、1为图片水印 
public $pos = 0; //水印位置 
public $transparent = 45; //水印透明度 public $waterStr = '3water.com'; //水印文字 
public $fontSize = 16; //文字字体大小 
public $fontColor = array(255,0,255); //水印文字颜色(RGB) 
public $fontFile = 'AHGBold.ttf'; //字体文件 
public $waterImg = 'logo.png'; //水印图片 
private $srcImg = ''; //需要添加水印的图片 
private $im = ''; //图片句柄 
private $water_im = ''; //水印图片句柄 
private $srcImg_info = ''; //图片信息 
private $waterImg_info = ''; //水印图片信息 
private $str_w = ''; //水印文字宽度 
private $str_h = ''; //水印文字高度 
private $x = ''; //水印X坐标 
private $y = ''; //水印y坐标 
function __construct($img) { //析构函数 
$this->srcImg = file_exists($img) ? $img : die('"'.$img.'" 源文件不存在!'); 
} 
private function imginfo() { //获取需要添加水印的图片的信息,并载入图片。 
$this->srcImg_info = getimagesize($this->srcImg); 
switch ($this->srcImg_info[2]) { 
case 3: 
$this->im = imagecreatefrompng($this->srcImg); 
break 1; 
case 2: 
$this->im = imagecreatefromjpeg($this->srcImg); 
break 1; 
case 1: 
$this->im = imagecreatefromgif($this->srcImg); 
break 1; 
default: 
die('原图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。'); 
} 
} 
private function waterimginfo() { //获取水印图片的信息,并载入图片。 
$this->waterImg_info = getimagesize($this->waterImg); 
switch ($this->waterImg_info[2]) { 
case 3: 
$this->water_im = imagecreatefrompng($this->waterImg); 
break 1; 
case 2: 
$this->water_im = imagecreatefromjpeg($this->waterImg); 
break 1; 
case 1: 
$this->water_im = imagecreatefromgif($this->waterImg); 
break 1; 
default: 
die('水印图片('.$this->srcImg.')格式不对,只支持PNG、JPEG、GIF。'); 
} 
} 
private function waterpos() { //水印位置算法 
switch ($this->pos) { 
case 0: //随机位置 
$this->x = rand(0,$this->srcImg_info[0]-$this->waterImg_info[0]); 
$this->y = rand(0,$this->srcImg_info[1]-$this->waterImg_info[1]); 
break 1; 
case 1: //上左 
$this->x = 0; 
$this->y = 0; 
break 1; 
case 2: //上中 
$this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2; 
$this->y = 0; 
break 1; 
case 3: //上右 
$this->x = $this->srcImg_info[0]-$this->waterImg_info[0]; 
$this->y = 0; 
break 1; 
case 4: //中左 
$this->x = 0; 
$this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2; 
break 1; 
case 5: //中中 
$this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2; 
$this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2; 
break 1; 
case 6: //中右 
$this->x = $this->srcImg_info[0]-$this->waterImg_info[0]; 
$this->y = ($this->srcImg_info[1]-$this->waterImg_info[1])/2; 
break 1; 
case 7: //下左 
$this->x = 0; 
$this->y = $this->srcImg_info[1]-$this->waterImg_info[1]; 
break 1; 
case 8: //下中 
$this->x = ($this->srcImg_info[0]-$this->waterImg_info[0])/2; 
$this->y = $this->srcImg_info[1]-$this->waterImg_info[1]; 
break 1; 
default: //下右 
$this->x = $this->srcImg_info[0]-$this->waterImg_info[0]; 
$this->y = $this->srcImg_info[1]-$this->waterImg_info[1]; 
break 1; 
} 
} 
private function waterimg() { 
if ($this->srcImg_info[0] <= $this->waterImg_info[0] || $this->srcImg_info[1] <= $this->waterImg_info[1]){ 
die('水印比原图大!'); 
} 
$this->waterpos(); 
$cut = imagecreatetruecolor($this->waterImg_info[0],$this->waterImg_info[1]); 
imagecopy($cut,$this->im,0,0,$this->x,$this->y,$this->waterImg_info[0],$this->waterImg_info[1]); 
$pct = $this->transparent; 
imagecopy($cut,$this->water_im,0,0,0,0,$this->waterImg_info[0],$this->waterImg_info[1]); 
imagecopymerge($this->im,$cut,$this->x,$this->y,0,0,$this->waterImg_info[0],$this->waterImg_info[1],$pct); 
} 
private function waterstr() { 
$rect = imagettfbbox($this->fontSize,0,$this->fontFile,$this->waterStr); 
$w = abs($rect[2]-$rect[6]); 
$h = abs($rect[3]-$rect[7]); 
$fontHeight = $this->fontSize; 
$this->water_im = imagecreatetruecolor($w, $h); 
imagealphablending($this->water_im,false); 
imagesavealpha($this->water_im,true); 
$white_alpha = imagecolorallocatealpha($this->water_im,255,255,255,127); 
imagefill($this->water_im,0,0,$white_alpha); 
$color = imagecolorallocate($this->water_im,$this->fontColor[0],$this->fontColor[1],$this->fontColor[2]); 
imagettftext($this->water_im,$this->fontSize,0,0,$this->fontSize,$color,$this->fontFile,$this->waterStr); 
$this->waterImg_info = array(0=>$w,1=>$h); 
$this->waterimg(); 
} 
function output() { 
$this->imginfo(); 
if ($this->waterType == 0) { 
$this->waterstr(); 
}else { 
$this->waterimginfo(); 
$this->waterimg(); 
} 
switch ($this->srcImg_info[2]) { 
case 3: 
imagepng($this->im,$this->srcImg); 
break 1; 
case 2: 
imagejpeg($this->im,$this->srcImg); 
break 1; 
case 1: 
imagegif($this->im,$this->srcImg); 
break 1; 
default: 
die('添加水印失败!'); 
break; 
} 
imagedestroy($this->im); 
imagedestroy($this->water_im); 
} 
} 
?>
PHP 相关文章推荐
Oracle 常见问题解答
Oct 09 PHP
使用PHP批量生成随机用户名
Jul 10 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
Jun 06 PHP
Zend Framework中的简单工厂模式 图文
Jul 10 PHP
php动态生成函数示例
Mar 21 PHP
php支持中文字符串分割的函数
May 28 PHP
详解PHP5.6.30与Apache2.4.x配置
Jun 02 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 PHP
django中的ajax组件教程详解
Oct 18 PHP
Laravel框架查询构造器简单示例
May 08 PHP
Laravel 框架控制器 Controller原理与用法实例分析
Apr 14 PHP
Yii框架应用组件用法实例分析
May 15 PHP
PHP setTime 设置当前时间的代码
Aug 27 #PHP
PHP 透明水印生成代码
Aug 27 #PHP
无JS,完全php面向过程数据分页实现代码
Aug 27 #PHP
php实现快速排序法函数代码
Aug 27 #PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 #PHP
简单的方法让你的后台登录更加安全(php中加session验证)
Aug 22 #PHP
PHP写的获取各搜索蜘蛛爬行记录代码
Aug 21 #PHP
You might like
PHP中实现图片的锐化
2006/10/09 PHP
php实现邮件发送并带有附件
2014/01/24 PHP
php随机获取金山词霸每日一句的方法
2015/07/09 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
PHP微信开发之查询微信精选文章
2016/06/23 PHP
浅谈PHP定义命令空间的几个注意点(推荐)
2016/10/29 PHP
PHP中功能强大却很少使用的函数实例小结
2016/11/10 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
贴一个在Mozilla中常用的Javascript代码
2007/01/09 Javascript
javascript在一段文字中的光标处插入其他文字
2007/08/26 Javascript
myeclipse安装jQuery插件的方法
2011/03/29 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
2014/06/09 Javascript
创建、调用JavaScript对象的方法集锦
2014/12/24 Javascript
javascript实现校验文件上传控件实例
2015/04/20 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
详解Node.Js如何处理post数据
2016/09/19 Javascript
canvas实现图像截取功能
2017/02/06 Javascript
vue实现Excel文件的上传与下载功能的两种方式
2019/06/28 Javascript
layui扩展上传组件模拟进度条的方法
2019/09/23 Javascript
精读《Vue3.0 Function API》
2020/05/20 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
使用PyV8在Python爬虫中执行js代码
2017/02/16 Python
浅析Python数据处理
2018/05/02 Python
MADE荷兰:提供原创设计师家具
2018/04/03 全球购物
售后服务承诺书怎么写
2014/05/21 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
查摆剖析材料范文
2014/09/30 职场文书
成都人事代理协议书
2014/10/25 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
团队合作精神学习心得体会
2016/01/19 职场文书
一条慢SQL语句引发的改造之路
2022/03/16 MySQL