用来给图片加水印的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 相关文章推荐
PHP初学入门
Nov 19 PHP
PHP删除特定数组内容并且重建数组索引的方法.
Mar 25 PHP
使用PHP计算两个路径的相对路径
Jun 14 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
php递归获取目录内文件(包含子目录)封装类分享
Dec 25 PHP
PHP数字和字符串ID互转函数(类似优酷ID)
Jun 30 PHP
php使用gettimeofday函数返回当前时间并存放在关联数组里
Mar 19 PHP
php实现随机显示图片方法汇总
May 21 PHP
ThinkPHP静态缓存简单配置和使用方法详解
Mar 23 PHP
Linux下快速搭建php开发环境
Mar 13 PHP
Mac系统下安装PHP Xdebug
Mar 30 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
Mar 29 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
PHP 函数call_user_func和call_user_func_array用法详解
2014/03/02 PHP
JS 强制设为首页的代码
2009/01/31 Javascript
JQuery slideshow的一个小问题(如何发现及解决过程)
2013/02/06 Javascript
js中关于一个分号的崩溃示例
2013/11/11 Javascript
Jqgrid表格随窗口大小改变而改变的简单实例
2013/12/28 Javascript
jQuery跨域问题解决方案
2015/08/03 Javascript
利用jQuery和CSS将背景图片拉伸
2015/10/16 Javascript
javascript常用经典算法详解
2017/01/11 Javascript
详解node单线程实现高并发原理与node异步I/O
2017/09/21 Javascript
Popup弹出框添加数据实现方法
2017/10/27 Javascript
Angular父组件调用子组件的方法
2018/04/02 Javascript
d3.js实现自定义多y轴折线图的示例代码
2018/05/30 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
vue打包之后生成一个配置文件修改接口的方法
2018/12/09 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
浅析微信小程序modal弹窗关闭默认会执行cancel问题
2019/10/14 Javascript
vue指令v-html使用过滤器filters功能实例
2019/10/25 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
微信小程序 this.triggerEvent()的具体使用
2019/12/10 Javascript
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
详解python字节码
2018/02/07 Python
深入分析python数据挖掘 Json结构分析
2018/04/21 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
python GUI库图形界面开发之PyQt5浏览器控件QWebEngineView详细使用方法
2020/02/26 Python
python中def是做什么的
2020/06/10 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
什么是类的返射机制
2016/02/06 面试题
国庆65周年演讲稿:回首往昔,展望未来
2014/09/21 职场文书
民主评议党员自我评议范文2014
2014/09/26 职场文书
研究生简历自我评
2015/03/11 职场文书
大学生志愿者心得体会
2016/01/15 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
Java中try catch处理异常示例
2021/12/06 Java/Android