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 如何向 MySQL 发送数据
Oct 09 PHP
用PHP和Shell写Hadoop的MapReduce程序
Apr 15 PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 PHP
WIN8.1下搭建PHP5.6环境
Apr 29 PHP
PHP判断上传文件类型的解决办法
Oct 20 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
zend framework重定向方法小结
May 28 PHP
PHP基于自定义类随机生成姓名的方法示例
Aug 05 PHP
Mac系统下安装PHP Xdebug
Mar 30 PHP
详解php命令注入攻击
Apr 06 PHP
php中关于换行的实例写法
Sep 26 PHP
laravel-admin 实现给grid的列添加行数序号的方法
Oct 08 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安装攻略:常见问题解答(三)
2006/10/09 PHP
可以在线执行PHP代码包装修正版
2008/03/15 PHP
PHP 快速排序算法详解
2014/11/10 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
PHP文件下载实例代码浅析
2016/08/17 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
2019/09/16 PHP
Jquery EasyUI的添加,修改,删除,查询等基本操作介绍
2013/10/11 Javascript
分享JavaScript获取网页关闭与取消关闭的事件
2013/12/13 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
JavaScript中apply方法的应用技巧小结
2016/09/29 Javascript
Js动态设置rem来实现移动端字体的自适应代码
2016/10/14 Javascript
JQuery用$.ajax或$.getJSON跨域获取JSON数据的实现代码
2017/09/23 jQuery
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
vue如何解决循环引用组件报错的问题
2018/09/22 Javascript
Angular6 发送手机验证码按钮倒计时效果实现方法
2019/01/08 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
JS document form表单元素操作完整示例
2020/01/13 Javascript
jQuery+Ajax+js实现请求json格式数据并渲染到html页面操作示例
2020/06/02 jQuery
Vue.js桌面端自定义滚动条组件之美化滚动条VScroll
2020/12/01 Vue.js
[02:09]EHOME夺得首届辉夜杯冠军—现场颁奖仪式
2015/12/28 DOTA
Python合并字符串的3种方法
2015/05/21 Python
Python实现截屏的函数
2015/07/26 Python
Python装饰器基础详解
2016/03/09 Python
Python实现八大排序算法
2016/08/13 Python
Python面向对象类的继承实例详解
2018/06/27 Python
Django如何实现上传图片功能
2019/08/16 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
初中国旗下的演讲稿
2014/08/28 职场文书
党员教师群众路线思想汇报范文
2014/10/28 职场文书
2014年教育实习工作总结
2014/11/22 职场文书
2014年精神文明工作总结
2014/12/23 职场文书
公积金具结保证书
2015/05/11 职场文书
python 通过使用Yolact训练数据集
2021/04/06 Python
Golang二维数组的使用方式
2021/05/28 Golang