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

2019-06-21  本文已影响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;
  }
}
上一篇下一篇

猜你喜欢

热点阅读