1. png图片作为水印加到其他类型图片后,背景变黑色 
      原因: imagecopy函数拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝。 
      然后直接上代码:

      /*
      * 功能: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 一样. */
      public static function FoximageWaterMark($groundImage,$waterPos=0,$waterImage="",$waterText="",$textFont=5,$textColor="#595959")
      {
      $isWaterImage = FALSE;
      $formatMsg = "暂不支持该文件格式,请用图片处理软件将图片转换为GIF、JPG、PNG格式.";
      //读取水印文件
      if(!empty($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(!empty($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.5),0,"0",$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函数拷贝时可以保留png图像的原透明信息,而imagecopymerge却不支持图片的本身的透明拷贝
      imagecopy($ground_im, $water_im, $posX, $posY, 0, 0, $water_w, $water_h);
      // imagecopymerge($ground_im, $water_im, $posX, $posY, 0, 0, $water_w,$water_h,20);//拷贝水印到目标文件
      }
      else//文字水印
      {
      if( !empty($textColor) && (strlen($textColor)==7) )
      {
      $R = hexdec(substr($textColor,1,2));
      $G = hexdec(substr($textColor,3,2));
      $B = hexdec(substr($textColor,5));
      }
      else
      {
      die("水印文字颜色格式不正确!");
      } // imagettftext ($ground_im, 20,0, 20, 30, imagecolorallocate($ground_im, $R, $G, $B),base_url()."/water.ttf","麦言社区");
      imagestring ( $ground_im, $textFont, $posX, $posY, $waterText, imagecolorallocatealpha($ground_im, $R, $G, $B,100));
      }
      //生成水印后的图片
      @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);
      }

        

        

使用GD库做图片水印的更多相关文章

  1. PHP面向对象——GD库实现图片水印和缩略图

    今天的实现目标就是使用GD库完成对图片加水印和图 片缩略图两个功能 动身前逻辑准备 属性: 路径 功能: 构造方法 生成水印的方法 获取 图片信息 获取位置信息(123 456 789) 创建图片资源 ...

  2. php使用GD库实现图片水印和缩略图——封装成类

    学完了如何使用GD库来实现对图片的各种处理,那么我们可以发现,不管哪种方法,都有相似之处,如果我们把这些相似的地方和不相似的地方都封装成类,这样就可以提升代码的速度,而且节省了很多时间,废话不多说,来 ...

  3. php使用GD库实现图片水印和缩略图——生成图片缩略图

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

  4. php使用GD库实现图片水印和缩略图——给图片添加图片水印

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

  5. php使用GD库实现图片水印和缩略图——给图片添加文字水印

    今天呢,就来学习一下在php中使用PD库来实现对图片水印的文字水印方法,不需要PS哦! 首先,准备素材 (1)准备一张图片 (2)准备一张水印(最好是透明的,即背景是白色底) (3)准备一中字体(在电 ...

  6. php用GD库给图片添加水印

    php用GD库给图片添加文字水印,整个代码比较简单,DEMO如下: <?php /*打开图片*/ //1.配置图片路径 $src = "aeroplane.jpg"; //2 ...

  7. php课程 8-32 如何使用gd库进行图片裁剪和缩放

    php课程 8-32 如何使用gd库进行图片裁剪和缩放 一.总结 一句话总结:图片缩放到图片裁剪就是改变原图截取的位置以及截取的宽高. 1.电商网站那么多的图片,如果全部加载卡得慢的很,所以他们是怎么 ...

  8. php 简单的学习GD库绘制图片并传回给前端实现方式

    1.基本的GD库绘制图片汇总 2.后台实现小案例 <?php // $img = imagecreatetruecolor(200,40); // var_dump($img); // 利用GD ...

  9. php 使用GD库压缩图片,添加文字图片水印

    先上一个工具类,提供了压缩,添加文字.图片水印等方法: image.class.php <?php class Image { private $info; private $image; pu ...

随机推荐

  1. render函数和redirect函数的区别+反向解析

    render函数和redirect函数的区别+反向解析 1.视图函数:一定是要包含两个对象的(render源码里面有HttpResponse对象)   request对象:----->所有的请求 ...

  2. 074 Search a 2D Matrix 搜索二维矩阵

    编写一个高效的算法来搜索 m x n 矩阵中的一个目标值.该矩阵具有以下特性:    每行中的整数从左到右排序.    每行的第一个整数大于前一行的最后一个整数.例如,以下矩阵:[  [1,   3, ...

  3. scp 可以在 2个 linux 主机间复制文件

    Linux scp命令用于Linux之间复制文件和目录,具体如何使用这里好好介绍一下,从本地复制到远程.从远程复制到本地是两种使用方式.这里有具体举例: ================== Linu ...

  4. JAVA基础之转换流和缓冲流

    个人理解: 在理解的字符流和字节流的区别后.要是想读取指定的编码格式的文件时,特别是不是默认的格式时,就需要转换流了,需要注意的是字符流是需要清除缓冲区的:当需要快速的进行读取时,则需要缓冲流.存在即 ...

  5. Java基础:(三)运算

    一.参数传递 Java的参数是以值传递的形式传入方法中,而不是引用传递. 二.隐式类型转换 Java不能隐式执行向下转型,因为这会使精度降低:但是使用 += 运算符可以执行隐式类型转换. float ...

  6. ServletContext--HttpServletResponse--web项目执行流程

    一.ServletContext 接口(javax.servlet) 定义:public interface ServletContext 原理:     Tomcat启动的时候,需要识别webapp ...

  7. arcgis jsapi接口入门系列(9):可以同时显示多个的地图popup

    jsapi有提供popup功能,但缺点很多,例如地图上只能同时显示一个popup,popup内容有限制等 本文提供另一个方法,原理不用jsapi,在地图外用一个普通的div放在地图上面,再监听地图的鼠 ...

  8. get_user

    Name get_user --    Get a simple variable from user space. Synopsis get_user ( x, ptr); Arguments x ...

  9. <转>Spring 知识点提炼

    Spring 知识点提炼 1. Spring框架的作用 轻量:Spring是轻量级的,基本的版本大小为2MB 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依 ...

  10. SIGGRAPH 2017:深度学习与计算机图形学的碰撞

    每年由美国计算机协会(Association of Computing Machinery,简称ACM)计算机图形专业组举办的年会SIGGRAPH,是全球最负盛名的图形学和交互技术盛会.今年已经是这场 ...