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 相关文章推荐
PHP静态新闻列表自动生成代码
Jun 14 PHP
mysql 性能的检查和优化方法
Jun 21 PHP
php中static静态变量的使用方法详解
Jun 04 PHP
php判断正常访问和外部访问的示例
Feb 10 PHP
PHP命名空间(Namespace)简明教程
Jun 11 PHP
php文件上传的两种实现方法
Apr 04 PHP
PHP引用的调用方法分析
Apr 25 PHP
通过php动态传数据到highcharts
Apr 05 PHP
PHP面向对象之事务脚本模式(详解)
Jun 07 PHP
PHP+Mysql+Ajax实现淘宝客服或阿里旺旺聊天功能(前台页面)
Jun 16 PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 PHP
详解PHP 二维数组排序保持键名不变
Mar 06 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
全国FM电台频率大全 - 6 辽宁省
2020/03/11 无线电
CentOS 7.2 下编译安装PHP7.0.10+MySQL5.7.14+Nginx1.10.1的方法详解(mini版本)
2016/09/01 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP实现的杨辉三角求解算法分析
2019/03/11 PHP
PHP获取远程http或ftp文件的md5值的方法
2019/04/15 PHP
EXTjs4.0的store的findRecord的BUG演示代码
2013/06/08 Javascript
利用CSS、JavaScript及Ajax实现高效的图片预加载
2013/10/16 Javascript
JQuery 两种方法解决刚创建的元素遍历不到的问题
2016/04/13 Javascript
js字符串截取函数slice、substring和substr的比较
2016/05/17 Javascript
封装获取dom元素的简单实例
2016/07/08 Javascript
jquery计算出left和top,让一个div水平垂直居中的简单实例
2016/07/13 Javascript
BootStrap实现邮件列表的分页和模态框添加邮件的功能
2016/10/13 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
JS正则匹配中文的方法示例
2017/01/06 Javascript
Angularjs单选改为多选的开发过程及问题解析
2017/02/17 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
2017/08/17 Javascript
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
[05:02][DOTA2]DOTA进化论 第一期
2013/09/27 DOTA
[42:52]IG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python3.4实现从HTTP代理网站批量获取代理并筛选的方法示例
2017/09/26 Python
python中实现精确的浮点数运算详解
2017/11/02 Python
pandas 根据列的值选取所有行的示例
2018/11/07 Python
Django中ORM外键和表的关系详解
2019/05/20 Python
美国在线艺术商店:HandmadePiece
2020/11/06 全球购物
室内设计实习自我鉴定
2013/09/25 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
商场拾金不昧表扬信
2014/01/13 职场文书
店面销售职位的职责
2014/03/09 职场文书
销售会计岗位职责
2014/03/15 职场文书
女生抽烟检讨书
2014/10/05 职场文书
学生检讨书范文
2015/01/27 职场文书
2015年学生资助工作总结
2015/05/25 职场文书
劳动仲裁代理词范文
2015/05/25 职场文书
高中政治教师教学反思
2016/02/23 职场文书
Python OpenCV 图像平移的实现示例
2021/06/04 Python