用来给图片加水印的PHP类


Posted in PHP onApril 09, 2008
<?php     
/*    
* 功能:PHP图片水印 (水印支持图片或文字)    
* 参数:    
*     $groundImage   背景图片,即需要加水印的图片,暂只支持GIF,JPG,PNG格式;    
*     $waterPos     水印位置,有10种状态,0为随机位置;    
*                 1为顶端居左,2为顶端居中,3为顶端居右;    
*                 4为中部居左,5为中部居中,6为中部居右;    
*                 7为底端居左,8为底端居中,9为底端居右;    
*     $waterImage     图片水印,即作为水印的图片,暂只支持GIF,JPG,PNG格式;    
*     $waterText     文字水印,即把文字作为为水印,支持ASCII码,不支持中文;    
*     $textFont     文字大小,值为1、2、3、4或5,默认为5;    
*     $textColor     文字颜色,值为十六进制颜色值,默认为#FF0000(红色);    
*    
* 注意:Support GD 2.0,Support FreeType、GIF Read、GIF Create、JPG 、PNG    
*     $waterImage 和 $waterText 最好不要同时使用,选其中之一即可,优先使用 $waterImage。    
*     当$waterImage有效时,参数$waterString、$stringFont、$stringColor均不生效。    
*     加水印后的图片的文件名和 $groundImage 一样。    
* 作者:longware @ 2004-11-3 14:15:13    
*/    
function imageWaterMark($groundImage,$waterPos=0,$waterImage=”",$waterText=”",$textFont=5,$textColor=”#FF0000″)     
{     
  $isWaterImage = FALSE;     
  $formatMsg = “暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式。”;       //读取水印文件     
  if(!emptyempty($waterImage) && file_exists($waterImage))     
  {     
    $isWaterImage = TRUE;     
    $water_info = getimagesize($waterImage);     
    $water_w   = $water_info[0];//取得水印图片的宽     
    $water_h   = $water_info[1];//取得水印图片的高     
    switch($water_info[2])//取得水印图片的格式     
    {     
        case 1:$water_im = imagecreatefromgif($waterImage);break;     
        case 2:$water_im = imagecreatefromjpeg($waterImage);break;     
        case 3:$water_im = imagecreatefrompng($waterImage);break;     
        default:die($formatMsg);     
    }     
  }     
  //读取背景图片     
  if(!emptyempty($groundImage) && file_exists($groundImage))     
  {     
    $ground_info = getimagesize($groundImage);     
    $ground_w   = $ground_info[0];//取得背景图片的宽     
    $ground_h   = $ground_info[1];//取得背景图片的高     
    switch($ground_info[2])//取得背景图片的格式     
    {     
        case 1:$ground_im = imagecreatefromgif($groundImage);break;     
        case 2:$ground_im = imagecreatefromjpeg($groundImage);break;     
        case 3:$ground_im = imagecreatefrompng($groundImage);break;     
        default:die($formatMsg);     
    }     
  }     
  else    
  {     
    die(”需要加水印的图片不存在!”);     
  }     
  //水印位置     
  if($isWaterImage)//图片水印     
  {     
    $w = $water_w;     
    $h = $water_h;     
    $label = “图片的”;     
  }     
  else//文字水印     
  {     
    $temp = imagettfbbox(ceil($textFont*5),0,”./cour.ttf”,$waterText);//取得使用 TrueType 字体的文本的范围     
    $w = $temp[2] - $temp[6];     
    $h = $temp[3] - $temp[7];     
    unset($temp);     
    $label = “文字区域”;     
  }     
  if( ($ground_w<$w) || ($ground_h<$h) )     
  {     
    echo “需要加水印的图片的长度或宽度比水印”.$label.”还小,无法生成水印!”;     
    return;     
  }     
  switch($waterPos)     
  {     
    case 0://随机     
        $posX = rand(0,($ground_w - $w));     
        $posY = rand(0,($ground_h - $h));     
        break;     
    case 1://1为顶端居左     
        $posX = 0;     
        $posY = 0;     
        break;     
    case 2://2为顶端居中     
        $posX = ($ground_w - $w) / 2;     
        $posY = 0;     
        break;     
    case 3://3为顶端居右     
        $posX = $ground_w - $w;     
        $posY = 0;     
        break;     
    case 4://4为中部居左     
        $posX = 0;     
        $posY = ($ground_h - $h) / 2;     
        break;     
    case 5://5为中部居中     
        $posX = ($ground_w - $w) / 2;     
        $posY = ($ground_h - $h) / 2;     
        break;     
    case 6://6为中部居右     
        $posX = $ground_w - $w;     
        $posY = ($ground_h - $h) / 2;     
        break;     
    case 7://7为底端居左     
        $posX = 0;     
        $posY = $ground_h - $h;     
        break;     
    case 8://8为底端居中     
        $posX = ($ground_w - $w) / 2;     
        $posY = $ground_h - $h;     
        break;     
    case 9://9为底端居右     
        $posX = $ground_w - $w;     
        $posY = $ground_h - $h;     
        break;     
    default://随机     
        $posX = rand(0,($ground_w - $w));     
        $posY = rand(0,($ground_h - $h));     
        break;       
  }     
  //设定图像的混色模式     
  imagealphablending($ground_im, true);     
  if($isWaterImage)//图片水印     
  {     
    imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h);//拷贝水印到目标文件           
  }     
  else//文字水印     
  {     
    if( !emptyempty($textColor) && (strlen($textColor)==7) )     
    {     
        $R = hexdec(substr($textColor,1,2));     
        $G = hexdec(substr($textColor,3,2));     
        $B = hexdec(substr($textColor,5));     
    }     
    else    
    {     
        die(”水印文字颜色格式不正确!”);     
    }     
    imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocate($ground_im, $R, $G, $B));           
  }     
  //生成水印后的图片     
  @unlink($groundImage);     
  switch($ground_info[2])//取得背景图片的格式     
  {     
    case 1:imagegif($ground_im,$groundImage);break;     
    case 2:imagejpeg($ground_im,$groundImage);break;     
    case 3:imagepng($ground_im,$groundImage);break;     
    default:die($errorMsg);     
  }     
  //释放内存     
  if(isset($water_info)) unset($water_info);     
  if(isset($water_im)) imagedestroy($water_im);     
  unset($ground_info);     
  imagedestroy($ground_im);     
}     
//—————————————————————————————     
$id=$_REQUEST['id'];     
$num = count($_FILES['userfile']['name']);     
print_r($_FILES['userfile']);     
print_r($_FILES['userfile']['name']);     
echo $num;     
echo “<bR>”;     
if(isset($id)){     
 for($i=0;$i<$id;$i++){     
  if(isset($_FILES) && !emptyempty($_FILES['userfile']) && $_FILES['userfile']['size']>0)     
{     
  $uploadfile = “./”.time().”_”.$_FILES['userfile'][name][$i];     
  echo “<br>”;     
  echo $uploadfile;     
  if (copy($_FILES['userfile']['tmp_name'][$i], $uploadfile))     
  {     
    echo “OK<br>”;     
    //文字水印     
    //imageWaterMark($uploadfile,5,”",”HTTP://www.lvye.info”,5,”#cccccc“);     
    //图片水印     
    $waterImage=”logo_ok1.gif”;//水印图片路径     
    imageWaterMark($uploadfile,9,$waterImage);     
    echo “<img src=\”".$uploadfile.”\” border=\”0\”>”;     
  }     
  else    
  {     
    echo “Fail<br>”;     
  }     
}     
 }     
}     
?>     
<form enctype=”multipart/form-data” method=”POST”>     
<?php     
for($a=0;$a<$id;$a++){     
 echo “文件: <input name=\”userfile[]\” type=\”file\”><br>”;     
}     
?>     
<input type=”submit” value=”上传”>     
</form>    
PHP 相关文章推荐
模拟xcopy的函数
Oct 09 PHP
基于文本的访客签到簿
Oct 09 PHP
php 中文字符入库或显示乱码问题的解决方法
Apr 12 PHP
PHP随机字符串生成代码(包括大小写字母)
Jun 24 PHP
基于递归实现的php树形菜单代码
Nov 19 PHP
php使用ob_flush不能每隔一秒输出原理分析
Jun 02 PHP
PHP实现的蚂蚁爬杆路径算法代码
Dec 03 PHP
thinkPHP删除前弹出确认框的简单实现方法
May 16 PHP
php for 循环使用的简单实例
Jun 02 PHP
php 的反射详解及示例代码
Aug 25 PHP
PHP使用strrev翻转中文乱码问题的解决方法
Jan 13 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
在PHP中读取和写入WORD文档的代码
Apr 09 #PHP
生成php程序的php代码
Apr 07 #PHP
用php获取远程图片并把它保存到本地的代码
Apr 07 #PHP
在php MYSQL中插入当前时间
Apr 06 #PHP
php读取30天之内的根据算法排序的代码
Apr 06 #PHP
PHP实现Socket服务器的代码
Apr 03 #PHP
mysql+php分页类(已测)
Mar 31 #PHP
You might like
咖啡界又出新概念,无需咖啡豆的分子咖啡
2021/03/03 咖啡文化
php下载远程文件类(支持断点续传)
2008/11/14 PHP
深入PHP中的HashTable结构详解
2013/06/13 PHP
javascript:void(0)的真正含义实例分析
2008/08/20 Javascript
js二维数组定义和初始化的三种方法总结
2014/03/03 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
2014/08/10 Javascript
jQuery级联操作绑定事件实例
2014/09/02 Javascript
jQuery中odd选择器的定义和用法
2014/12/23 Javascript
ECMAScript6中Set/WeakSet详解
2015/06/12 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
vue+vue-router转场动画的实例代码
2018/09/01 Javascript
VUE基于NUXT的SSR 服务端渲染
2018/11/30 Javascript
如何使用electron-builder及electron-updater给项目配置自动更新
2018/12/24 Javascript
jquery中为什么能用$操作
2019/06/18 jQuery
利用H5api实现时钟的绘制(javascript)
2020/09/13 Javascript
[01:18:33]Secret vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
实例讲解Python设计模式编程之工厂方法模式的使用
2016/03/02 Python
Python中类的创建和实例化操作示例
2019/02/27 Python
Python中的asyncio代码详解
2019/06/10 Python
使用PyQt4 设置TextEdit背景的方法
2019/06/14 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
django中间键重定向实例方法
2019/11/10 Python
关于Python中定制类的比较运算实例
2019/12/19 Python
浅谈优化Django ORM中的性能问题
2020/07/09 Python
应聘收银员个人的求职信
2013/11/30 职场文书
学校庆元旦歌咏比赛主持词
2014/03/18 职场文书
网络编辑岗位职责
2014/03/18 职场文书
社会实践先进工作者事迹材料
2014/05/06 职场文书
模具专业自荐信
2014/05/29 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
音乐会主持人开场白
2015/05/28 职场文书
MongoDB使用场景总结
2022/02/24 MongoDB