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 相关文章推荐
?繁体转换的class
Oct 09 PHP
PHP调用MySQL的存储过程的实现代码
Aug 12 PHP
PHP,ASP.JAVA,JAVA代码格式化工具整理
Jun 15 PHP
Thinkphp使用mongodb数据库实现多条件查询方法
Jun 26 PHP
PHP使用GIFEncoder类生成的GIF动态图片验证码
Jul 01 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
php解析url并得到url中的参数及获取url参数的四种方式
Oct 26 PHP
PHP下 Mongodb 连接远程数据库的实例代码
Aug 30 PHP
Yii2语言国际化自动配置详解
Aug 22 PHP
php json转换相关知识(小结)
Dec 21 PHP
php更新cookie内容的详细方法
Sep 30 PHP
关于laravel 数据库迁移中integer类型是无法指定长度的问题
Oct 09 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
PL-880隐藏功能
2021/03/01 无线电
php5新改动之短标记启用方法
2008/09/11 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
php Ubb代码编辑器函数代码
2012/07/05 PHP
php文件下载处理方法分析
2015/04/22 PHP
Yii2中关联查询简单用法示例
2016/08/10 PHP
PHP使用正则表达式实现过滤非法字符串功能示例
2018/06/04 PHP
DHTML 中的绝对定位
2006/11/26 Javascript
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
Js动态添加复选框Checkbox的实例方法
2013/04/08 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
js弹出div并显示遮罩层
2014/02/12 Javascript
JavaScript中判断整数的多种方法总结
2014/11/08 Javascript
一张Web前端的思维导图分享
2015/07/03 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
AngularJS路由切换实现方法分析
2017/03/17 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
vue.js实现的幻灯片功能示例
2019/01/18 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
2019/03/06 Javascript
微信小程序实现下拉框功能
2019/07/16 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
python实现巡检系统(solaris)示例
2014/04/02 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
python不同版本的_new_不同点总结
2020/12/09 Python
一款基于css3的列表toggle特效实例教程
2015/01/04 HTML / CSS
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
军训的自我鉴定
2013/12/10 职场文书
工厂会计员职责
2014/02/06 职场文书
德育标兵事迹材料
2014/08/24 职场文书
2015年预备党员自我评价
2015/03/04 职场文书
2015年行政部工作总结
2015/04/28 职场文书
基于go interface{}==nil 的几种坑及原理分析
2021/04/24 Golang