首页 >后端开发 >php教程 >PHP实现图片水印类的封装代码分享

PHP实现图片水印类的封装代码分享

小云云
小云云原创
2018-02-10 09:20:481331浏览

本文主要为大家详细介绍了PHP图片水印类的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能帮助到大家。

封装PHP的图片水印的类,供大家参考,具体内容如下


<?php
header(&#39;Content-type:text/html;charset=utf8&#39;);
$img = new Image();
// $img->water(&#39;2a.jpg&#39;,&#39;logo.gif&#39;,0);
class Image{
  //路径
  protected $path;
  //是否启用随机名字
  protected $isRandName;
  //要保存的图像类型
  protected $type;
  
  //通过构造方法队成员属性进行初始化
  function __construct($path=&#39;./&#39;,$isRandName=true,$type=&#39;png&#39;){
    $this->path = $path;
    $this->isRandName = $isRandName;
    $this->type = $type;
  }
  //对外公开的水印方法
  
  /**
   * @param char $image  原图
   * @param char $water  水印图片
   * @param char $postion 位置
   * @param int $tmp   透明度
   * @param char $prefix 前缀
   */
  function water($image,$water,$postion,$tmp=100,$prefix=&#39;water_&#39;){
    //判断这两个图片是否存在
    if(!file_exists($image)||!file_exists($water)){
      die(&#39;图片资源不存在&#39;);
    }
    //得到原图和水印图片的宽高
    $imageInfo = self::getImageInfo($image);
    $waterInfo = self::getImageInfo($water);
    //判断水印图片是否能贴上来
    if (!$this->checkImage($imageInfo,$waterInfo)){
      die(&#39;水印图片太大&#39;);
    }
    //打开图片
    $imageRes = self::openAnyImage($image);
    $waterRes = self::openAnyImage($water);
    //根据水印图片的位置计算水印图片的坐标
    $pos = $this->getPosition($postion,$imageInfo,$waterInfo);
    //将水印图片贴过来
    imagecopymerge($imageRes, $waterRes, $pos[&#39;x&#39;], $pos[&#39;y&#39;], 0, 0, $waterInfo["width"], $waterInfo["height"], $tmp);
    //得到要保存图片的文件名
    $newName = $this->createNewName($image,$prefix);
    //得到保存图片的路径,也就是文件的全路径
    $newPath = rtrim($this->path,&#39;/&#39;).&#39;/&#39;.$newName;
    //保存图片
    $this->saveImage($imageRes,$newPath);
    //销毁资源
    imagedestroy($imageRes);
    imagedestroy($waterRes);
    
    //返回路径
    return $newPath;
  }
  //保存图像资源
  protected function saveImage($imageRes,$newPath){
    $func = &#39;image&#39;.$this->type;
    //通过变量函数进行保存
    $func($imageRes,$newPath);
  }
  //得到文件名函数
  protected function createNewName($imagePath,$prefix){
    if ($this->isRandName){
      $name = $prefix.uniqid().&#39;.&#39;.$this->type;
    }else {
      $name = $prefix.pathinfo($imagePath)[&#39;filename&#39;].&#39;.&#39;.$this->type;
    }
    return $name;
  }
  //根据位置计算水印图片的坐标
  protected function getPosition($postion,$imageInfo,$waterInfo){
    switch ($postion){
      case 1:
        $x = 0;
        $y = 0;
        break;
      case 2:
        $x = ($imageInfo[&#39;width&#39;]-$waterInfo["width"])/2;
        $y = 0;
        break;
      case 3:
        $x = $imageInfo["width"]- $waterInfo["width"];
        $y = 0;
        break;
      case 4:
        $x = 0;
        $y = ($imageInfo["height"]-$waterInfo["height"])/2;
        break;
      case 5:
        $x = ($imageInfo[&#39;width&#39;]-$waterInfo["width"])/2;
        $y = ($imageInfo["height"]-$waterInfo["height"])/2;
        break;
      case 6:
        $x = $imageInfo["width"]- $waterInfo["width"];
        $y = ($imageInfo["height"]-$waterInfo["height"])/2;
        break;
      case 7:
        $x = 0;
        $y = $imageInfo[&#39;height&#39;] - $waterInfo["height"];
        break;
      case 8:
        $x = ($imageInfo[&#39;width&#39;]-$waterInfo["width"])/2;
        $y = $imageInfo[&#39;height&#39;] - $waterInfo["height"];
        break;
      case 9:
        $x = $imageInfo["width"]- $waterInfo["width"];
        $y = $imageInfo[&#39;height&#39;] - $waterInfo["height"];
        break;
      case 0:
        $x = mt_rand(0, $imageInfo["width"]- $waterInfo["width"]);
        $y = mt_rand(0, $imageInfo[&#39;height&#39;] - $waterInfo["height"]);
        break;
    }
    return [&#39;x&#39;=>$x , &#39;y&#39;=>$y];
  }
  protected function checkImage($imageInfo,$waterInfo){
    if (($waterInfo[&#39;width&#39;] > $imageInfo[&#39;width&#39;])||($waterInfo[&#39;height&#39;] > $imageInfo[&#39;height&#39;])){
      return false;
    }
    return true;
  }
  //静态方法。根据图片的路径得到图片的信息,宽度,高度、mime类型
  static function getImageInfo($imagePath){
    $info = getimagesize($imagePath);
    $data[&#39;width&#39;]=$info[0];
    $data[&#39;height&#39;]=$info[1];
    $data[&#39;mime&#39;] = $info[&#39;mime&#39;];
    return $data;
  }
  static function openAnyImage($imagePath){
    //得到图像的mime类型
    $mime = self::getImageInfo($imagePath)[&#39;mime&#39;];
    //根据不同的mime类型打开不同的图像
    switch ($mime){
      case &#39;image/png&#39;:
          $image = imagecreatefrompng($imagePath);
          break;
      case &#39;image/gif&#39;:
          $image = imagecreatefromgif($imagePath);
          break;
      case &#39;image/jpeg&#39;:
          $image = imagecreatefromjpeg($imagePath);
          break;
      case &#39;image/wbmp&#39;:
          $image = imagecreatefromwbmp($imagePath);
          break;
    }
    return $image;
  }
  
}

补充:PHP如何实现根据图片色区位置加水印呢?

具体实现方法如下:

function add_wm($nmw_water, $src_file, $output_file, $x, $y) {   
    if(file_exists($output_file))   
      return;   
    $w1 = MagickGetImageWidth($nmw_water);   
    $h1 = MagickGetImageHeight($nmw_water);   
    $nmw =NewMagickWand();   
    MagickReadImage($nmw, $src_file);   
    // 默认的加水印位置调整   
    $lt_w = 50;   
    $lt_h = 50;   
    if($x == 0){   
      $w = MagickGetImageWidth($nmw);   
      $h = MagickGetImageHeight($nmw);   
      $x = $w;   
      $y = $h;   
    }else{   
      // 根据具体情况调整   
      $lt_w = 30;   
      $lt_h = 40;   
    }   
    MagickCompositeImage($nmw, $nmw_water, MW_OverCompositeOp, $x - $w1 - $lt_w, $y - $h1 - $lt_h);   
    MagickWriteImage($nmw, $output_file);   
    DestroyMagickWand($nmw);       
  }   
  // 还是groovy的eachFileRecurse好用啊   
  function add_wm_recurse($nmw_water, $to_dir, $output_dir, $arr) {
    $dp = dir($to_dir);   
    while($file=$dp->read()){   
      if($file != &#39;.&#39; && $file != &#39;..&#39;){   
        if(is_dir($to_dir . &#39;/&#39; . $file)){   
          mkdir($output_dir . &#39;/&#39; . $file);   
          add_wm_recurse($nmw_water, $to_dir . &#39;/&#39; . $file, $output_dir . &#39;/&#39; . $file, $arr);   
        }else{   
          if(!array_key_exists($to_dir . &#39;/&#39; . $file, $arr)){
            continue;   
          }   
          $sub_arr = $arr[$to_dir . &#39;/&#39; . $file];   
          if($sub_arr){   
            $x = intval($sub_arr[0]);   
            $y = intval($sub_arr[1]);   
            add_wm($nmw_water, $to_dir . &#39;/&#39; . $file, $output_dir . &#39;/&#39; . $file, $x, $y);   
          }   
        }   
      }   
    }   
    $dp->close();   
  }   
  $to_dir = &#39;./resized&#39;;   
  $output_dir = &#39;./output&#39;;   
  // 这个是我用java的ImageIO遍历图片像素获取的符合裤子颜色的区域的坐标array(posX, posY)   
  $arr = array(   
    array(50, 50)   
  );   
  $water = &#39;./water.png&#39;;   
  $nmw_water =NewMagickWand();   
  MagickReadImage($nmw_water, $water);   
  add_wm_recurse($nmw_water, $to_dir, $output_dir, $arr);   
  DestroyMagickWand($nmw_water);

相关推荐

php使用imagecopymerge()函数创建半透明水印实例教程

PHP实现可添加水印与生成缩略图处理工具

PHP根据图片色区位置加水印

以上是PHP实现图片水印类的封装代码分享的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn