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在页面中调用fckeditor编辑器的方法
Jun 10 PHP
教你如何使用php session
Oct 28 PHP
PHP_NETWORK_GETADDRESSES: GETADDRINFO FAILED问题解决办法
May 04 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
Sep 27 PHP
PDO防注入原理分析以及注意事项
Feb 25 PHP
PHP常见的6个错误提示及解决方法
Jul 07 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
php用wangeditor3实现图片上传功能
Aug 22 PHP
PHP使用PDO实现mysql防注入功能详解
Dec 20 PHP
PHP pthreads v3下worker和pool的使用方法示例
Feb 21 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 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
用Flash图形化数据(二)
2006/10/09 PHP
Discuz! Passport 通行证整合
2008/03/27 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
注释PHP和html混合代码的小技巧(分享)
2016/11/03 PHP
Laravel Eloquent ORM 多条件查询的例子
2019/10/10 PHP
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
用表格输出1-1000之间的数字实现代码(附特效)
2013/04/21 Javascript
各浏览器对document.getElementById等方法的实现差异解析
2013/12/05 Javascript
jQuery 插件开发指南
2014/11/14 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
nodeJS代码实现计算交社保是否合适
2015/03/09 NodeJs
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
AngularJS 所有版本下载地址
2016/09/14 Javascript
JavaScript实现清空(重置)文件类型INPUT元素值的方法
2016/11/17 Javascript
flexslider.js实现移动端轮播
2017/02/05 Javascript
详解Angular2响应式表单
2017/06/14 Javascript
ionic 3.0+ 项目搭建运行环境的教程
2017/08/09 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
webpack4 从零学习常用配置(小结)
2019/05/28 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
关于Layui Table隐藏列问题
2019/09/16 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
2020/10/17 Javascript
python实现文本文件合并
2015/12/29 Python
python 重命名轴索引的方法
2018/11/10 Python
Python 3.x基于Xml数据的Http请求方法
2018/12/28 Python
详解Python二维数组与三维数组切片的方法
2019/07/18 Python
使用OpenCV对车道进行实时检测的实现示例代码
2020/06/19 Python
给老师的一封建议书
2014/03/13 职场文书
建筑工地大门标语
2014/06/18 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
2014年前台文员工作总结
2014/12/08 职场文书
初中学生操行评语
2014/12/26 职场文书
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python
Redis集群节点通信过程/原理流程分析
2022/03/18 Redis