美文网首页
phpGD库函数之缩略图、文字水印和图片水印类验证

phpGD库函数之缩略图、文字水印和图片水印类验证

作者: 咸鱼前端 | 来源:发表于2019-06-21 10:10 被阅读0次
    <?php
    class Image
    {
      private function _getImageInfo($filename)
      {
        $imageInfo = getimagesize($filename);
        $mime = $imageInfo['mime'];
        $info = array(
          "width" => $imageInfo[0],
          "height" => $imageInfo[1],
          "mime" => $mime,
          "createFun" => str_replace('/', 'createfrom', $mime),
          "outFun" => str_replace('/', '', $mime),
          "ext" => image_type_to_extension(
            $imageInfo[2]
          )
        );
        return $info;
      }
      /**
       * 返回缩略图的保存路径及文件名
       *
       * @param [type] $filename    文件名
       * @param string $dest        文件存放的目录
       * @param string $pre         文件名的前缀
       * @param [type] $dst_w       缩略图的最大宽度
       * @param [type] $dst_h       缩略图的最大高度
       * @param float $scale        缩放比例
       * @param boolean $delSource  是否删除源文件的标志
       * @return void   文件存放的路径和文件名
       */
      public function thumb($filename, $dest = 'thumb', $pre = 'thumb_',  $dst_w = null, $dst_h = null, $scale = 0.5, $delSource = false)
      {
        //1.获取图片的信息
        $info = $this->_getImageInfo($filename);
        //2.得到源图片的宽高
        $src_w = $info['width'];
        $src_h = $info['height'];
        //如果设置了宽和高,则算出源图片的宽高比例,
        //通过小算法得知目标尺寸的比例是否大于源图片的比例,
        //通过源图片的比例求出最大的图片缩放尺寸
        if (is_numeric($dst_w) && is_numeric($dst_h)) {
          $prop = $src_w / $src_h;
          if ($dst_w / $dst_h > $prop) { // 目标文件比例大于源文件比例
            $dst_w = $dst_h * $prop;  // 宽=高*比例
          } else { // 目标文件比例小于源文件比例
            $dst_h = $dst_w / $prop;  // 高 = 宽 / 比例
          }
        } else { // 如果没有设置宽和高,则按照事先固定好的缩放比例缩放
          $dst_w = $src_w * $scale;
          $dst_h = $src_h * $scale;
        }
        //3.创建图片资源
        $src_image = $info['createFun']($filename);
        $dst_image = imagecreatetruecolor($dst_w, $dst_h);
        //4.进行缩放
        imagecopyresampled($dst_image, $src_image, 0, 0, 0, 0, $dst_w, $dst_h, $src_w, $src_h);
        if ($dest && !file_exists($dest)) {
          mkdir($dest, 0777, true);
        }
        $randNum = mt_rand(100000, 999999);
        $dstName = "{$pre}{$randNum}" . $info['ext'];
        $destination = $dest ? $dest . '/' . $dstName : $dstName;
        //5.保存图片
        $info['outFun']($dst_image, $destination);
        //6.销毁资源
        imagedestroy($dst_image);
        imagedestroy($src_image);
        // 如果$relSource 为真,则删除源文件
        if ($delSource) {
          unlink($filename);
        }
        // 返回文件存放的路径和文件名
        return $destination;
      }
      /**
       * 生成文字水印函数
       *
       * @param [string] $filename   文件名
       * @param [string] $fontfile   字体文件名
       * @param [string] $text       写的文字内容
       * @param integer $size        字体大小
       * @param integer $x           x轴位置
       * @param integer $y           y轴位置
       * @param integer $r           red的数值  默认为255
       * @param integer $g           green的数值  默认为0
       * @param integer $b           blue的数值  默认为0
       * @param integer $alpha       透明契合度    默认50
       * @param [string] $dest       目录名称
       * @param [string] $pre        文件前缀
       * @param integer $angle       文字旋转角度
       * @return void     文件存放路径及文件名
       */
      public function water_text($filename, $fontfile, $text = '慕课网', $size = 28, $x = 0, $y = 30, $r = 255, $g = 0, $b = 0, $alpha = 60, $dest = 'waterText', $pre = 'waterText_', $angle = 0)
      {
        //获取图片信息
        $info = $this->_getImageInfo($filename);
        $image = $info['createFun']($filename);
        //创建文字颜色
        $color = imagecolorallocatealpha($image, $r, $g, $b, $alpha);
        //写文字
        imagettftext($image, $size, $angle, $x, $y, $color, $fontfile, $text);
        //如果设置了目录且目录不存在则创建
        if ($dest && !file_exists($dest)) {
          mkdir($dest, 0777, true);
        }
        $randNum = mt_rand(100000, 999999);
        $dstName = "{$pre}{$randNum}" . $info['ext'];
        $destination = $dest ? $dest . '/' . $dstName : $dstName;
        //保存图片
        $info['outFun']($image, $destination);
        //销毁资源
        imagedestroy($image);
        // 返回文件存放的路径和文件名
        return $destination;
      }
      /**
       * 图片水印制作函数
       *
       * @param [string] $dstName    目标图片文件名
       * @param [string] $srcName    源图片文件名
       * @param integer $pos         水印位置的标志  0--左上角 8--右下角
       * @param integer $pct         两张图片的契合度数值
       * @param string $dest         文件存放目录
       * @param string $pre          文件前缀
       * @param boolean $delSource   是否删除源文件的标志
       * @return void    文件存放的路径及文件名
       */
      public function water_pic($dstName, $srcName, $pos = 0, $pct = 50, $dest = 'waterPic', $pre = 'waterPic_', $delSource = false)
      {
        //得到源文件和目标文件的信息和创建资源
        $dstInfo = $this->_getImageInfo($dstName);
        $srcInfo = $this->_getImageInfo($srcName);
        $dst_image = $dstInfo['createFun']($dstName);
        $src_image = $srcInfo['createFun']($srcName);
        $dst_w = $dstInfo['width'];
        $dst_h = $dstInfo['height'];
        $src_w = $srcInfo['width'];
        $src_h = $srcInfo['height'];
        $randNum = mt_rand(100000, 999999);
        $destName = $pre . $randNum . $dstInfo['ext'];
        $destination = $dest ? $dest . '/' . $destName : $destName;
        //如果目录设置了且不存在则创建
        if ($dest && !file_exists($dest)) {
          mkdir($dest, 0777, true);
        }
        switch ($pos) {
          case 0:
            $x = 0;
            $y = 0;
            break;
          case 1:
            $x = ($dst_w - $src_w) / 2;
            $y = 0;
            break;
          case 2:
            $x = $dst_w - $src_w;
            $y = 0;
            break;
          case 3:
            $x = 0;
            $y = ($dst_h - $src_h) / 2;
            break;
          case 4:
            $x = ($dst_w - $src_w) / 2;
            $y = ($dst_h - $src_h) / 2;
            break;
          case 5:
            $x = $dst_w - $src_w;
            $y = ($dst_h - $src_h) / 2;
            break;
          case 6:
            $x = 0;
            $y = $dst_h - $src_h;
            break;
          case 7:
            $x = ($dst_w - $src_w) / 2;
            $y = $dst_h - $src_h;
            break;
          case 8:
            $x = $dst_w - $src_w;
            $y = $dst_h - $src_h;
            break;
          default:
            $x = 0;
            $y = 0;
            break;
        }
        //两张图片合并
        imagecopymerge($dst_image, $src_image, $x, $y, 0, 0, $src_w, $src_h, $pct);
        //保存图片
        $dstInfo['outFun']($dst_image, $destination);
        //销毁资源
        imagedestroy($dst_image);
        imagedestroy($src_image);
        if ($delSource) {
          unlink($dstName);
        }
        //返回保存路径及文件名
        return $destination;
      }
    }
    

    相关文章

      网友评论

          本文标题:phpGD库函数之缩略图、文字水印和图片水印类验证

          本文链接:https://www.haomeiwen.com/subject/ktieqctx.html