常用的php图片处理类(水印、等比缩放、固定高宽)分享

5年以前  |  阅读数:182 次  |  编程语言:PHP 

常用的php图片处理类(水印、等比缩放、固定高宽)分享


    <?php  
    //PHP 添加水印 & 比例缩略图 & 固定高度 & 固定宽度 类。 
    class Image_process{ 
      public $source; //原图 
      public $source_width;  //原图宽度 
      public $source_height; //原图高度 
      public $source_type_id; 
      public $orign_name; 
      public $orign_dirname; 

      //传入原图路径 
      public function __construct($source){ 
        $this->typeList = array(1=>'gif',2=>'jpg',3=>'png'); 
        $ginfo = getimagesize($source); 
        $this->source_width = $ginfo[0]; 
        $this->source_height = $ginfo[1]; 
        $this->source_type_id = $ginfo[2]; 
        $this->orign_url = $source; 
        $this->orign_name = basename($source); 
        $this->orign_dirname = dirname($source); 
      } 

      //判断图片的文件的格式,返回PHP可识别的编码 
      public function judgeType($type,$source){ 
        if($type == 1){ 
          return imagecreatefromgif($source); //gif 
        }else if($type == 2){ 
          return imagecreatefromjpeg($source); //jpg 
        }else if($type == 3){ 
          return imagecreatefrompng($source); //png 
        }else{ 
          return false; 
        } 
      } 

      //生成水印图片 
      public function waterMakeImage($logo){ 
        $linfo = getimagesize($logo); 
        $logo_width = $linfo[0]; 
        $logo_height = $linfo[1]; 
        $logo_type_id = $linfo[2]; 
        $sourceHandle = $this->judgeType($this->source_type_id,$this->orign_url); 
        $logoHandle = $this->judgeType($logo_type_id,$logo); 
        if(!$sourceHandle || !$logoHandle){ 
          return false; 
        } 
        $x = ($this->source_width - $logo_width)/2; 
        $y = ($this->source_height - $logo_height)/2; 
        imagecopy($sourceHandle,$logoHandle,$x,$y,0,0,$logo_width,$logo_height); 
        $newPic = $this->orign_dirname.'\water_'.time().'.'.$this->typeList[$this->source_type_id]; 
        if($this->saveImage($sourceHandle,$newPic)){ 
          imagedestroy($sourceHandle); 
          imagedestroy($logoHandle); 
        } 
      } 

      //固定高度宽度 
      public function fixSizeImage($width,$height){ 
        if($width > $this->source_width) $this->source_width; 
        if($height > $this->source_height) $this->source_height; 
        if($width === false){ 
          $width = floor($this->source_width / ($this->source_height / $height)); 
        } 
        if($height === false){ 
          $height = floor($this->source_height / ($this->source_width / $width)); 
        } 
        $this->tinyImage($width,$height); 
      } 

      //等比例缩放图片 
      public function scaleImage($scale){ 
        $width = floor($this->source_width * $scale); 
        $height = floor($this->source_height * $scale); 
        $this->tinyImage($width, $height); 
      } 

      //创建缩略图 
      public function tinyImage($width,$height){ 
        $tinyImage = imagecreatetruecolor($width,$height); 
        $handle = $this->judgeType($this->source_type_id,$this->orign_url); 
        if(function_exists('imagecopyresampled')){ 
          imagecopyresampled($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height); 
        }else{ 
          imagecopyresized($tinyImage, $handle, 0, 0, 0, 0, $width, $height, $this->source_width, $this->source_height); 
        } 
        $newPic = $this->orign_dirname.'\thumb_'.time().'_'.$width."_".$height.".".$this->typeList[$this->source_type_id]; 
        if($this->saveImage($tinyImage,$newPic)){ 
          imagedestroy($tinyImage); 
          imagedestroy($handle); 
        } 
      } 
      //保存图片 
      private function saveImage($image,$url){ 
        if(imagejpeg($image,$url)){ 
          return true; 
        } 
      } 
    } 
    $imgHandle = new Image_process('D:\AppServ\www\test\getimg\14061907445601.jpg'); 
    //$imgHandle->waterMakeImage('D:\AppServ\www\test\getimg\shougongke.png');  //生成水印图片 
    //$imgHandle->fixSizeImage(200,150); //固定长度图片 
    $imgHandle->scaleImage(0.2); //等比例缩放 
    ?>

示例二:


    <?php
    /**
     * 
     * 图像处理类
     * @author FC_LAMP
     * @internal功能包含:水印,缩略图
     */
    class Img
    {
     //图片格式
     private $exts = array ('jpg', 'jpeg', 'gif', 'bmp', 'png' );

     /**
     * 
     * 
     * @throws Exception
     */
     public function __construct()
     {
     if (! function_exists ( 'gd_info' ))
     {
      throw new Exception ( '加载GD库失败!' );
     }
     }

     /**
     * 
     * 裁剪压缩
     * @param $src_img 图片
     * @param $save_img 生成后的图片
     * @param $option 参数选项,包括: $maxwidth 宽 $maxheight 高
     * array('width'=>xx,'height'=>xxx)
     * @internal
     * 我们一般的压缩图片方法,在图片过长或过宽时生成的图片
     * 都会被"压扁",针对这个应采用先裁剪后按比例压缩的方法
     */
     public function thumb_img($src_img, $save_img = '', $option)
     {

     if (empty ( $option ['width'] ) or empty ( $option ['height'] ))
     {
      return array ('flag' => False, 'msg' => '原图长度与宽度不能小于0' );
     }
     $org_ext = $this->is_img ( $src_img );
     if (! $org_ext ['flag'])
     {
      return $org_ext;
     }

     //如果有保存路径,则确定路径是否正确
     if (! empty ( $save_img ))
     {
      $f = $this->check_dir ( $save_img );
      if (! $f ['flag'])
      {
      return $f;
      }
     }

     //获取出相应的方法
     $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );

     //获取原大小
     $source = $org_funcs ['create_func'] ( $src_img );
     $src_w = imagesx ( $source );
     $src_h = imagesy ( $source );

     //调整原始图像(保持图片原形状裁剪图像)
     $dst_scale = $option ['height'] / $option ['width']; //目标图像长宽比
     $src_scale = $src_h / $src_w; // 原图长宽比
     if ($src_scale >= $dst_scale)
     { // 过高
      $w = intval ( $src_w );
      $h = intval ( $dst_scale * $w );

      $x = 0;
      $y = ($src_h - $h) / 3;
     } else
     { // 过宽
      $h = intval ( $src_h );
      $w = intval ( $h / $dst_scale );

      $x = ($src_w - $w) / 2;
      $y = 0;
     }
     // 剪裁
     $croped = imagecreatetruecolor ( $w, $h );
     imagecopy ( $croped, $source, 0, 0, $x, $y, $src_w, $src_h );
     // 缩放
     $scale = $option ['width'] / $w;
     $target = imagecreatetruecolor ( $option ['width'], $option ['height'] );
     $final_w = intval ( $w * $scale );
     $final_h = intval ( $h * $scale );
     imagecopyresampled ( $target, $croped, 0, 0, 0, 0, $final_w, $final_h, $w, $h );
     imagedestroy ( $croped );

     //输出(保存)图片
     if (! empty ( $save_img ))
     {

      $org_funcs ['save_func'] ( $target, $save_img );
     } else
     {
      header ( $org_funcs ['header'] );
      $org_funcs ['save_func'] ( $target );
     }
     imagedestroy ( $target );
     return array ('flag' => True, 'msg' => '' );
     }

     /**
     * 
     * 等比例缩放图像
     * @param $src_img 原图片
     * @param $save_img 需要保存的地方
     * @param $option 参数设置 array('width'=>xx,'height'=>xxx)
     * 
     */
     function resize_image($src_img, $save_img = '', $option)
     {
     $org_ext = $this->is_img ( $src_img );
     if (! $org_ext ['flag'])
     {
      return $org_ext;
     }

     //如果有保存路径,则确定路径是否正确
     if (! empty ( $save_img ))
     {
      $f = $this->check_dir ( $save_img );
      if (! $f ['flag'])
      {
      return $f;
      }
     }

     //获取出相应的方法
     $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );

     //获取原大小
     $source = $org_funcs ['create_func'] ( $src_img );
     $src_w = imagesx ( $source );
     $src_h = imagesy ( $source );

     if (($option ['width'] && $src_w > $option ['width']) || ($option ['height'] && $src_h > $option ['height']))
     {
      if ($option ['width'] && $src_w > $option ['width'])
      {
      $widthratio = $option ['width'] / $src_w;
      $resizewidth_tag = true;
      }

      if ($option ['height'] && $src_h > $option ['height'])
      {
      $heightratio = $option ['height'] / $src_h;
      $resizeheight_tag = true;
      }

      if ($resizewidth_tag && $resizeheight_tag)
      {
      if ($widthratio < $heightratio)
       $ratio = $widthratio;
      else
       $ratio = $heightratio;
      }

      if ($resizewidth_tag && ! $resizeheight_tag)
      $ratio = $widthratio;
      if ($resizeheight_tag && ! $resizewidth_tag)
      $ratio = $heightratio;

      $newwidth = $src_w * $ratio;
      $newheight = $src_h * $ratio;

      if (function_exists ( "imagecopyresampled" ))
      {
      $newim = imagecreatetruecolor ( $newwidth, $newheight );
      imagecopyresampled ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
      } else
      {
      $newim = imagecreate ( $newwidth, $newheight );
      imagecopyresized ( $newim, $source, 0, 0, 0, 0, $newwidth, $newheight, $src_w, $src_h );
      }
     }
     //输出(保存)图片
     if (! empty ( $save_img ))
     {

      $org_funcs ['save_func'] ( $newim, $save_img );
     } else
     {
      header ( $org_funcs ['header'] );
      $org_funcs ['save_func'] ( $newim );
     }
     imagedestroy ( $newim );
     return array ('flag' => True, 'msg' => '' );
     }

     /**
     * 
     * 生成水印图片
     * @param $org_img 原图像
     * @param $mark_img 水印标记图像
     * @param $save_img 当其目录不存在时,会试着创建目录
     * @param array $option 为水印的一些基本设置包含:
     * x:水印的水平位置,默认为减去水印图宽度后的值
     * y:水印的垂直位置,默认为减去水印图高度后的值
     * alpha:alpha值(控制透明度),默认为50
     */
     public function water_mark($org_img, $mark_img, $save_img = '', $option = array())
     {
     //检查图片
     $org_ext = $this->is_img ( $org_img );
     if (! $org_ext ['flag'])
     {
      return $org_ext;
     }
     $mark_ext = $this->is_img ( $mark_img );
     if (! $mark_ext ['flag'])
     {
      return $mark_ext;
     }
     //如果有保存路径,则确定路径是否正确
     if (! empty ( $save_img ))
     {
      $f = $this->check_dir ( $save_img );
      if (! $f ['flag'])
      {
      return $f;
      }
     }

     //获取相应画布
     $org_funcs = $this->get_img_funcs ( $org_ext ['msg'] );
     $org_img_im = $org_funcs ['create_func'] ( $org_img );

     $mark_funcs = $this->get_img_funcs ( $mark_ext ['msg'] );
     $mark_img_im = $mark_funcs ['create_func'] ( $mark_img );

     //拷贝水印图片坐标
     $mark_img_im_x = 0;
     $mark_img_im_y = 0;
     //拷贝水印图片高宽
     $mark_img_w = imagesx ( $mark_img_im );
     $mark_img_h = imagesy ( $mark_img_im );

     $org_img_w = imagesx ( $org_img_im );
     $org_img_h = imagesx ( $org_img_im );

     //合成生成点坐标
     $x = $org_img_w - $mark_img_w;
     $org_img_im_x = isset ( $option ['x'] ) ? $option ['x'] : $x;
     $org_img_im_x = ($org_img_im_x > $org_img_w or $org_img_im_x < 0) ? $x : $org_img_im_x;
     $y = $org_img_h - $mark_img_h;
     $org_img_im_y = isset ( $option ['y'] ) ? $option ['y'] : $y;
     $org_img_im_y = ($org_img_im_y > $org_img_h or $org_img_im_y < 0) ? $y : $org_img_im_y;

     //alpha
     $alpha = isset ( $option ['alpha'] ) ? $option ['alpha'] : 50;
     $alpha = ($alpha > 100 or $alpha < 0) ? 50 : $alpha;

     //合并图片
     imagecopymerge ( $org_img_im, $mark_img_im, $org_img_im_x, $org_img_im_y, $mark_img_im_x, $mark_img_im_y, $mark_img_w, $mark_img_h, $alpha );

     //输出(保存)图片
     if (! empty ( $save_img ))
     {

      $org_funcs ['save_func'] ( $org_img_im, $save_img );
     } else
     {
      header ( $org_funcs ['header'] );
      $org_funcs ['save_func'] ( $org_img_im );
     }
     //销毁画布
     imagedestroy ( $org_img_im );
     imagedestroy ( $mark_img_im );
     return array ('flag' => True, 'msg' => '' );

     }

     /**
     * 
     * 检查图片
     * @param unknown_type $img_path
     * @return array('flag'=>true/false,'msg'=>ext/错误信息) 
     */
     private function is_img($img_path)
     {
     if (! file_exists ( $img_path ))
     {
      return array ('flag' => False, 'msg' => "加载图片 $img_path 失败!" );
     }
     $ext = explode ( '.', $img_path );
     $ext = strtolower ( end ( $ext ) );
     if (! in_array ( $ext, $this->exts ))
     {
      return array ('flag' => False, 'msg' => "图片 $img_path 格式不正确!" );
     }
     return array ('flag' => True, 'msg' => $ext );
     }

     /**
     * 
     * 返回正确的图片函数
     * @param unknown_type $ext
     */
     private function get_img_funcs($ext)
     {
     //选择
     switch ($ext)
     {
      case 'jpg' :
      $header = 'Content-Type:image/jpeg';
      $createfunc = 'imagecreatefromjpeg';
      $savefunc = 'imagejpeg';
      break;
      case 'jpeg' :
      $header = 'Content-Type:image/jpeg';
      $createfunc = 'imagecreatefromjpeg';
      $savefunc = 'imagejpeg';
      break;
      case 'gif' :
      $header = 'Content-Type:image/gif';
      $createfunc = 'imagecreatefromgif';
      $savefunc = 'imagegif';
      break;
      case 'bmp' :
      $header = 'Content-Type:image/bmp';
      $createfunc = 'imagecreatefrombmp';
      $savefunc = 'imagebmp';
      break;
      default :
      $header = 'Content-Type:image/png';
      $createfunc = 'imagecreatefrompng';
      $savefunc = 'imagepng';
     }
     return array ('save_func' => $savefunc, 'create_func' => $createfunc, 'header' => $header );
     }

     /**
     * 
     * 检查并试着创建目录
     * @param $save_img
     */
     private function check_dir($save_img)
     {
     $dir = dirname ( $save_img );
     if (! is_dir ( $dir ))
     {
      if (! mkdir ( $dir, 0777, true ))
      {
      return array ('flag' => False, 'msg' => "图片保存目录 $dir 无法创建!" );
      }
     }
     return array ('flag' => True, 'msg' => '' );
     }
    }

    if (! empty ( $_FILES ['test'] ['tmp_name'] ))
    {
     //例子
     $img = new Img ();
     //原图
     $name = explode ( '.', $_FILES ['test'] ['name'] );
     $org_img = 'D:/test.' . end ( $name );
     move_uploaded_file ( $_FILES ['test'] ['tmp_name'], $org_img );
     $option = array ('width' => $_POST ['width'], 'height' => $_POST ['height'] );
     if ($_POST ['type'] == 1)
     {
     $s = $img->resize_image ( $org_img, '', $option );
     } else
     {
     $img->thumb_img ( $org_img, '', $option );
     }
     unlink ( $org_img );
    }

以上所述就是本文的全部内容了,希望大家能够喜欢。

 相关文章:
PHP分页显示制作详细讲解
SSH 登录失败:Host key verification failed
获取IMSI
将二进制数据转为16进制以便显示
文件下载
获取IMEI
贪吃蛇
双位运算符
Java生成UUID
PHP自定义函数获取搜索引擎来源关键字的方法
年的日历图
发送邮件
提取后缀名
在Zeus Web Server中安装PHP语言支持
让你成为最历害的git提交人
指定应用ID以获取对应的应用名称
再谈PHP中单双引号的区别详解
Yii2汉字转拼音类的实例代码
Python 2与Python 3版本和编码的对比
php封装的page分页类完整实例