木鱼也是鱼呀 发表于 2024-5-27 03:17:25

基于PHP封装图片裁剪工具类

PHP工具类图片裁剪类封装
<?php
namespace App\Utils;



/**
* 图片裁剪工具类
* @author        田小涛
* @date        2020年7月23日
* @comment
*
*/
class ImageCropUtils
{
   
    private $sImage;
    private $dImage;
    private $src_file;
    private $dst_file;
    private $src_width;
    private $src_height;
    private $src_ext;
    private $src_type;
    private $mime;
   
    //上传基础路径处
    private $basisUploadPath;
   
    public function __construct( $file = null, $distFile = null )
    {
      $this->dst_file = $distFile;
      $this->basisUploadPath = storage_path( 'app/uploads/' );
      if( isset( $file ) && $file )
      {
            $this->src_file = $file;
            $this->init( $file );
      }
    }

   
    /**
   * 生成唯一的文件名称
   * @author       Administrator
   * @datetime 2019年12月24日 上午11:44:02
   * @comment       
   *
   * @param string $salt
   * @return string
   */
    protected function getUniqueDiskName($salt = '')
    {
      if( empty( $salt ) )
      {
            $salt = mt_rand(1,1000000);
      }
      list($usec, $sec) = explode(" ", microtime());
      
      $micros = str_replace('.', '', ((float)$usec + (float)$sec)).$salt;
      
      return md5( $micros );
    }
   
   
    /**
   * 初始化参数
   * @author       Administrator
   * @datetime 2020年7月22日 下午3:00:22
   * @comment       
   *
   * @return boolean
   */
    public function init( $url )
    {
      $strExt = $this->getImgExt( $url );
      $filename = $this->getUniqueDiskName( md5( $url ) );
      $path = date( 'y' ) . '/' . date( 'm' ) . '/' . date( 'd' ) . '/' . $filename;
      
      $dowRes = new \generalDowmload( $url,$path . $strExt );
      if( !empty( $dowRes ) && isset( $dowRes->basename ) )
      {
            if( isset( $dowRes->location ) && strlen( $dowRes->location ) )
            {
                $this->src_file = $dowRes->location;
            }
            else
            {
                $this->src_file = $this->basisUploadPath .$path . $strExt;
            }
      }
      else
      {
            return false;
      }
      if( !isset( $this->src_file ) || is_null( $this->src_file ) || !file_exists( $this->src_file ) )
      {
            return false;
      }
      
      $arrImageInfos = @getimagesize( $this->src_file );
      if( !isset( $arrImageInfos ) || empty( $arrImageInfos ) )
      {
            return false;
      }
      if( isset( $arrImageInfos ) && $arrImageInfos )
      {
            $this->src_width    = $arrImageInfos;
      }
      if( isset( $arrImageInfos ) && $arrImageInfos )
      {
            $this->src_height   = $arrImageInfos;
      }
      $this->src_type = 2;
      if( isset( $arrImageInfos ) && $arrImageInfos )
      {
            $this->src_type = $arrImageInfos;
      }
      if( isset( $arrImageInfos[ 'mime' ] ) )
      {
            $this->mime   = $arrImageInfos[ 'mime' ];
      }
      switch( $this->src_type )
      {
            case IMAGETYPE_JPEG :
                ini_set( 'gd.jpeg_ignore_warning', true );
                $this->sImage   =@imagecreatefromjpeg( $this->src_file );
                $this->ext      ='jpg';
                if( !isset( $this->mime ) || strlen( $this->mime ) <= 0 )
                {
                  $this->mime = 'image/jpeg';
                }
            break;
            case IMAGETYPE_PNG :
                $this->sImage   =@imagecreatefrompng( $this->src_file );
                $this->ext      ='png';
                if( !isset( $this->mime ) || strlen( $this->mime ) <= 0 )
                {
                  $this->mime = 'image/' . $this->ext;
                }
            break;
            case IMAGETYPE_GIF :
                $this->sImage   =imagecreatefromgif( $this->src_file );
                $this->ext      ='gif';
                if( !isset( $this->mime ) || strlen( $this->mime ) <= 0 )
                {
                  $this->mime = 'image/' . $this->ext;;
                }
            break;
            case 18:
                $this->sImage   = @imagecreatefromwebp( $this->src_file );
                $this->ext      ='webp';
                if( !isset( $this->mime ) || strlen( $this->mime ) <= 0 )
                {
                  $this->mime = 'image/' . $this->ext;;
                }
            break;
            default:
                return false;
      }
      
      return true;
    }
   
   
   
    /**
   * 裁剪
   * @author       Administrator
   * @datetime 2020年7月22日 下午3:07:36
   * @comment       
   *
   * @param unknown $dst_width
   * @param unknown $dst_height
   * @param unknown $dst_x
   * @param unknown $dst_y
   * @param string $dst_file
   * @return boolean
   */
    public function cutImage( $dst_width, $dst_height, $dst_x, $dst_y, $originWidth, $originHeight )
    {
      if( !$dst_width || !$dst_height )
      {
            return false;
      }

      # 创建画布时,判断最终需要的画布大小
      if ($originWidth && $originHeight)
      {
            $dst_w = $originWidth;
            $dst_h = $originHeight;
      }
      else
      {
            $dst_w = $dst_width;
            $dst_h = $dst_height;
      }

      $this->dImage = imagecreatetruecolor( $dst_w, $dst_h ); //创建了目标文件的大小的画布
      $bg = imagecolorallocatealpha( $this->dImage, 255, 255, 255, 127 ); //给画布分配颜色
      imagefill( $this->dImage, 0, 0, $bg ); //给图像用颜色进行填充
      imagecolortransparent( $this->dImage, $bg ); //背景定义成透明色
      
      $ratio_w = 1.0 * $dst_width / $this->src_width; //横向缩放的比例
      $ratio_h = 1.0 * $dst_height / $this->src_height; //纵向缩放的比例
      //不进行缩放,直接对图像进行裁剪
      $ratio = 1.0;
      $tmp_w = (int)($dst_width / $ratio);
      $tmp_h = (int)($dst_height / $ratio);
      
      $tmp_img = imagecreatetruecolor( $dst_width, $dst_height ); //创建暂时保存的画布
      imagecopy( $tmp_img, $this->sImage, 0, 0, $dst_x,$dst_y, $dst_width, $dst_height ); //拷贝出图像的一部分,进行裁切
      imagecopyresampled( $this->dImage, $tmp_img, 0, 0, 0, 0, $dst_w, $dst_h, $tmp_w, $tmp_h ); //把暂时缓存的图片,放到目标文件里面
      imagedestroy( $tmp_img );

      return true;
    }
   
   
    /**
   * 存储
   * @author       Administrator
   * @datetime 2020年7月22日 下午3:15:52
   * @comment       
   *
   * @param unknown $file
   * @return boolean
   */
    public function save( $file = null )
    {
      if( !isset( $file ) || is_null( $file ) )
      {
            $this->dst_file = $this->src_file;
      }
      else
      {
            $this->dst_file = $this->basisUploadPath . '/'. $file;
      }
      try{
            switch( $this->src_type )
            {
                case IMAGETYPE_JPEG :
                  @imagejpeg( $this->dImage, $this->dst_file, 98 );
                break;
                case IMAGETYPE_PNG :
                  imagepng( $this->dImage, $this->dst_file );
                break;
                case IMAGETYPE_GIF :
                  imagegif( $this->dImage, $this->dst_file );
                break;
                case 18:
                  @imagejpeg( $this->dImage, $this->dst_file, 98 );
                break;
                default:
                  return false;
            }
      }catch( \Exception $e ){
            
      }
      
      $strExt = $this->getImgExt( $this->dst_file );
      
      $tmpImageInfo = @getimagesize( $this->dst_file );
      $width = 0;
      $height = 0;
      if( isset( $tmpImageInfo ) && $tmpImageInfo > 0 )
      {
            $width = $tmpImageInfo;
      }
      if( isset( $tmpImageInfo ) && $tmpImageInfo > 0 )
      {
            $height = $tmpImageInfo;
      }
      
      $objRet = new \stdClass();
      $objRet->mime       = $this->mime;
      $objRet->filename   = basename( $this->dst_file );
      $objRet->ext      = $strExt;
      $objRet->width      = $width;
      $objRet->height   = $height;
      
      return $objRet;
    }
   
   
    /**
   * 数据销毁
   * @author       Administrator
   * @datetime 2020年7月22日 下午3:31:12
   * @comment       
   *
   */
    public function destroy()
    {
      imagedestroy( $this->sImage);
      imagedestroy( $this->dImage );
      @unlink( $this->src_file );
      
      return true;
    }

    /**
   * 检索图集是否存在后缀
   *若不存在-则使用默认(强制转换)
   * @author       Administrator
   * @datetime 2018年11月27日下午3:30:47
   * @comment
   *
   * @param unknown $url
   * @return string|unknown
   */
    protected function getImgExt( $url )
    {
      
      $iLastSlash = strrpos( $url, '/' );
      $strFileName = mb_substr( $url, intval($iLastSlash+1) );
      $strExt = strrchr( $strFileName, '.' );
      preg_match( "/(.*?)\?.*?/", $strExt, $matches );
      if( !empty( $matches ) && isset( $matches ) )
      {
            $strExt = $matches;
      }
      if( false == $strExt || is_null( $strExt ) || strlen( $strExt ) <= 0 )
      {
            $strExt = '.jpg';
      }
      
      return $strExt;
    }
   
   
}知识补充
除了上文的内容,小编还为大家整理了php实现封装图片水印添加、压缩、剪切的相关方法,希望对大家有所帮助
<?php

class Image
{   
    private $info;    private $image;    public $type;    public function construct($src)
    {

      $this->info=getimagesize($src);
      $this-&gt;type=image_type_to_extension($this-&gt;info['2'],false);
      $fun="imagecreatefrom{$this-&gt;type}";
      $this-&gt;image=$fun($src);
    }    /**
   * 文字水印
   * @param$font   字体
   * @param$content内容
   * @param$size   文字大小
   * @param$col      文字颜色(四元数组)
   * @paramarray   $location 位置
   * @paraminteger $angle    倾斜角度
   * @return          
   */
    public function fontMark($font,$content,$size,$col,$location,$angle=0){
      $col=imagecolorallocatealpha($this-&gt;image, $col['0'], $col['1'], $col['2'],$col['3']);

      imagettftext($this-&gt;image, $size, $angle, $location['0'], $location['1'], $col,$font,$content);
    }   
    /**
   * 图片水印
   * @param $imageMark 水印图片地址
   * @param $dst       水印图片在原图片中的位置
   * @param $pct       透明度
   * @return             
   */
    public function imageMark($imageMark,$dst,$pct){
      $info2=getimagesize($imageMark);
      $type=image_type_to_extension($info2['2'],false);
      $func2="imagecreatefrom".$type;
      $water=$func2($imageMark);

      imagecopymerge($this-&gt;image, $water, $dst, $dst, 0, 0, $info2['0'], $info2['1'], $pct);
      imagedestroy($water);

    }    /**
   * 压缩图片
   * @param $thumbSize 压缩图片大小
   * @return                */
    public function thumb($thumbSize){
      $imageThumb=imagecreatetruecolor($thumbSize, $thumbSize);
      
      imagecopyresampled($imageThumb, $this-&gt;image, 0, 0, 0, 0, $thumbSize, $thumbSize, $this-&gt;info['0'], $this-&gt;info['1']);
      imagedestroy($this-&gt;image);
      $this-&gt;image=$imageThumb;
    }    /**
    * 裁剪图片
   * @param $cutSize裁剪大小
   * @param $location 裁剪位置
   * @return             */
   public function cut($cutSize,$location){
         $imageCut=imagecreatetruecolor($cutSize,$cutSize);

         imagecopyresampled($imageCut, $this-&gt;image, 0, 0, $location, $location,$cutSize,$cutSize,$cutSize,$cutSize);
         imagedestroy($this-&gt;image);
         $this-&gt;image=$imageCut;
   }    /**
   * 展现图片
   * @return    */
    public function show(){
      header("content-type:".$this-&gt;info['mime']);

      $funn="image".$this-&gt;type;

      $funn($this-&gt;image);
    }    /**
   * 保存图片
* @param $newname 新图片名
* @return           */
   public function save($newname){
         header("content-type:".$this-&gt;info['mime']);

         $funn="image".$this-&gt;type;

         $funn($this-&gt;image,$newname.'.'.$this-&gt;type);
   }   public function destruct(){
         imagedestroy($this-&gt;image);
   }

}以上就是基于PHP封装图片裁剪工具类的详细内容,更多关于PHP图片裁剪的资料请关注脚本之家其它相关文章!

来源:https://www.jb51.net/program/319494vdy.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 基于PHP封装图片裁剪工具类