翼度科技»论坛 编程开发 PHP 查看内容

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

10

主题

10

帖子

30

积分

新手上路

Rank: 1

积分
30
PHP工具类图片裁剪类封装
  1. <?php
  2. namespace App\Utils;



  3. /**
  4. * 图片裁剪工具类
  5. * @author        田小涛
  6. * @date        2020年7月23日
  7. * @comment
  8. *
  9. */
  10. class ImageCropUtils
  11. {
  12.    
  13.     private $sImage;
  14.     private $dImage;
  15.     private $src_file;
  16.     private $dst_file;
  17.     private $src_width;
  18.     private $src_height;
  19.     private $src_ext;
  20.     private $src_type;
  21.     private $mime;
  22.    
  23.     //上传基础路径处
  24.     private $basisUploadPath;
  25.    
  26.     public function __construct( $file = null, $distFile = null )
  27.     {
  28.         $this->dst_file = $distFile;
  29.         $this->basisUploadPath = storage_path( 'app/uploads/' );
  30.         if( isset( $file ) && $file )
  31.         {
  32.             $this->src_file = $file;
  33.             $this->init( $file );
  34.         }
  35.     }

  36.    
  37.     /**
  38.      * 生成唯一的文件名称
  39.      * @author         Administrator
  40.      * @datetime 2019年12月24日 上午11:44:02
  41.      * @comment       
  42.      *
  43.      * @param string $salt
  44.      * @return string
  45.      */
  46.     protected function getUniqueDiskName($salt = '')
  47.     {
  48.         if( empty( $salt ) )
  49.         {
  50.             $salt = mt_rand(1,1000000);
  51.         }
  52.         list($usec, $sec) = explode(" ", microtime());
  53.         
  54.         $micros = str_replace('.', '', ((float)$usec + (float)$sec)).$salt;
  55.         
  56.         return md5( $micros );
  57.     }
  58.    
  59.    
  60.     /**
  61.      * 初始化参数
  62.      * @author         Administrator
  63.      * @datetime 2020年7月22日 下午3:00:22
  64.      * @comment       
  65.      *
  66.      * @return boolean
  67.      */
  68.     public function init( $url )
  69.     {
  70.         $strExt = $this->getImgExt( $url );
  71.         $filename = $this->getUniqueDiskName( md5( $url ) );
  72.         $path = date( 'y' ) . '/' . date( 'm' ) . '/' . date( 'd' ) . '/' . $filename;
  73.         
  74.         $dowRes = new \generalDowmload( $url,  $path . $strExt );
  75.         if( !empty( $dowRes ) && isset( $dowRes->basename ) )
  76.         {
  77.             if( isset( $dowRes->location ) && strlen( $dowRes->location ) )
  78.             {
  79.                 $this->src_file = $dowRes->location;
  80.             }
  81.             else
  82.             {
  83.                 $this->src_file = $this->basisUploadPath .  $path . $strExt;
  84.             }
  85.         }
  86.         else
  87.         {
  88.             return false;
  89.         }
  90.         if( !isset( $this->src_file ) || is_null( $this->src_file ) || !file_exists( $this->src_file ) )
  91.         {
  92.             return false;
  93.         }
  94.         
  95.         $arrImageInfos = @getimagesize( $this->src_file );
  96.         if( !isset( $arrImageInfos ) || empty( $arrImageInfos ) )
  97.         {
  98.             return false;
  99.         }
  100.         if( isset( $arrImageInfos[0] ) && $arrImageInfos[0] )
  101.         {
  102.             $this->src_width    = $arrImageInfos[0];
  103.         }
  104.         if( isset( $arrImageInfos[1] ) && $arrImageInfos[1] )
  105.         {
  106.             $this->src_height   = $arrImageInfos[1];
  107.         }
  108.         $this->src_type = 2;
  109.         if( isset( $arrImageInfos[2] ) && $arrImageInfos[2] )
  110.         {
  111.             $this->src_type = $arrImageInfos[2];
  112.         }
  113.         if( isset( $arrImageInfos[ 'mime' ] ) )
  114.         {
  115.             $this->mime     = $arrImageInfos[ 'mime' ];
  116.         }
  117.         switch( $this->src_type )
  118.         {
  119.             case IMAGETYPE_JPEG :
  120.                 ini_set( 'gd.jpeg_ignore_warning', true );
  121.                 $this->sImage   =  @imagecreatefromjpeg( $this->src_file );
  122.                 $this->ext      =  'jpg';
  123.                 if( !isset( $this->mime ) || strlen( $this->mime ) <= 0 )
  124.                 {
  125.                     $this->mime = 'image/jpeg';
  126.                 }
  127.             break;
  128.             case IMAGETYPE_PNG :
  129.                 $this->sImage   =  @imagecreatefrompng( $this->src_file );
  130.                 $this->ext      =  'png';
  131.                 if( !isset( $this->mime ) || strlen( $this->mime ) <= 0 )
  132.                 {
  133.                     $this->mime = 'image/' . $this->ext;
  134.                 }
  135.             break;
  136.             case IMAGETYPE_GIF :
  137.                 $this->sImage   =  imagecreatefromgif( $this->src_file );
  138.                 $this->ext      =  'gif';
  139.                 if( !isset( $this->mime ) || strlen( $this->mime ) <= 0 )
  140.                 {
  141.                     $this->mime = 'image/' . $this->ext;;
  142.                 }
  143.             break;
  144.             case 18:
  145.                 $this->sImage   = @imagecreatefromwebp( $this->src_file );
  146.                 $this->ext      =  'webp';
  147.                 if( !isset( $this->mime ) || strlen( $this->mime ) <= 0 )
  148.                 {
  149.                     $this->mime = 'image/' . $this->ext;;
  150.                 }
  151.             break;
  152.             default:
  153.                 return false;
  154.         }
  155.         
  156.         return true;
  157.     }
  158.    
  159.    
  160.    
  161.     /**
  162.      * 裁剪
  163.      * @author         Administrator
  164.      * @datetime 2020年7月22日 下午3:07:36
  165.      * @comment       
  166.      *
  167.      * @param unknown $dst_width
  168.      * @param unknown $dst_height
  169.      * @param unknown $dst_x
  170.      * @param unknown $dst_y
  171.      * @param string $dst_file
  172.      * @return boolean
  173.      */
  174.     public function cutImage( $dst_width, $dst_height, $dst_x, $dst_y, $originWidth, $originHeight )
  175.     {
  176.         if( !$dst_width || !$dst_height )
  177.         {
  178.             return false;
  179.         }

  180.         # 创建画布时,判断最终需要的画布大小
  181.         if ($originWidth && $originHeight)
  182.         {
  183.             $dst_w = $originWidth;
  184.             $dst_h = $originHeight;
  185.         }
  186.         else
  187.         {
  188.             $dst_w = $dst_width;
  189.             $dst_h = $dst_height;
  190.         }

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

  207.         return true;
  208.     }
  209.    
  210.    
  211.     /**
  212.      * 存储
  213.      * @author         Administrator
  214.      * @datetime 2020年7月22日 下午3:15:52
  215.      * @comment       
  216.      *
  217.      * @param unknown $file
  218.      * @return boolean
  219.      */
  220.     public function save( $file = null )
  221.     {
  222.         if( !isset( $file ) || is_null( $file ) )
  223.         {
  224.             $this->dst_file = $this->src_file;
  225.         }
  226.         else
  227.         {
  228.             $this->dst_file = $this->basisUploadPath . '/'. $file;
  229.         }
  230.         try{
  231.             switch( $this->src_type )
  232.             {
  233.                 case IMAGETYPE_JPEG :
  234.                     @imagejpeg( $this->dImage, $this->dst_file, 98 );
  235.                 break;
  236.                 case IMAGETYPE_PNG :
  237.                     imagepng( $this->dImage, $this->dst_file );
  238.                 break;
  239.                 case IMAGETYPE_GIF :
  240.                     imagegif( $this->dImage, $this->dst_file );
  241.                 break;
  242.                 case 18:
  243.                     @imagejpeg( $this->dImage, $this->dst_file, 98 );
  244.                 break;
  245.                 default:
  246.                     return false;
  247.             }
  248.         }catch( \Exception $e ){
  249.             
  250.         }
  251.         
  252.         $strExt = $this->getImgExt( $this->dst_file );
  253.         
  254.         $tmpImageInfo = @getimagesize( $this->dst_file );
  255.         $width = 0;
  256.         $height = 0;
  257.         if( isset( $tmpImageInfo[0] ) && $tmpImageInfo[0] > 0 )
  258.         {
  259.             $width = $tmpImageInfo[0];
  260.         }
  261.         if( isset( $tmpImageInfo[1] ) && $tmpImageInfo[1] > 0 )
  262.         {
  263.             $height = $tmpImageInfo[1];
  264.         }
  265.         
  266.         $objRet = new \stdClass();
  267.         $objRet->mime       = $this->mime;
  268.         $objRet->filename   = basename( $this->dst_file );
  269.         $objRet->ext        = $strExt;
  270.         $objRet->width      = $width;
  271.         $objRet->height     = $height;
  272.         
  273.         return $objRet;
  274.     }
  275.    
  276.    
  277.     /**
  278.      * 数据销毁
  279.      * @author         Administrator
  280.      * @datetime 2020年7月22日 下午3:31:12
  281.      * @comment       
  282.      *
  283.      */
  284.     public function destroy()
  285.     {
  286.         imagedestroy( $this->sImage);
  287.         imagedestroy( $this->dImage );
  288.         @unlink( $this->src_file );
  289.         
  290.         return true;
  291.     }

  292.     /**
  293.      * 检索图集是否存在后缀
  294.      *  若不存在-则使用默认(强制转换)
  295.      * @author         Administrator
  296.      * @datetime 2018年11月27日  下午3:30:47
  297.      * @comment
  298.      *
  299.      * @param unknown $url
  300.      * @return string|unknown
  301.      */
  302.     protected function getImgExt( $url )
  303.     {
  304.         
  305.         $iLastSlash = strrpos( $url, '/' );
  306.         $strFileName = mb_substr( $url, intval($iLastSlash+1) );
  307.         $strExt = strrchr( $strFileName, '.' );
  308.         preg_match( "/(.*?)\?.*?/", $strExt, $matches );
  309.         if( !empty( $matches ) && isset( $matches[1] ) )
  310.         {
  311.             $strExt = $matches[1];
  312.         }
  313.         if( false == $strExt || is_null( $strExt ) || strlen( $strExt ) <= 0 )
  314.         {
  315.             $strExt = '.jpg';
  316.         }
  317.         
  318.         return $strExt;
  319.     }
  320.    
  321.    
  322. }
复制代码
知识补充
除了上文的内容,小编还为大家整理了php实现封装图片水印添加、压缩、剪切的相关方法,希望对大家有所帮助
  1. <?php  

  2. class Image
  3. {   
  4.     private $info;    private $image;    public $type;    public function construct($src)
  5.     {

  6.         $this->info=getimagesize($src);
  7.         $this-&gt;type=image_type_to_extension($this-&gt;info['2'],false);
  8.         $fun="imagecreatefrom{$this-&gt;type}";
  9.         $this-&gt;image=$fun($src);
  10.     }    /**
  11.      * 文字水印
  12.      * @param  [type]  $font     字体
  13.      * @param  [type]  $content  内容
  14.      * @param  [type]  $size     文字大小
  15.      * @param  [type]  $col      文字颜色(四元数组)
  16.      * @param  array   $location 位置
  17.      * @param  integer $angle    倾斜角度
  18.      * @return [type]           
  19.      */
  20.     public function fontMark($font,$content,$size,$col,$location,$angle=0){
  21.         $col=imagecolorallocatealpha($this-&gt;image, $col['0'], $col['1'], $col['2'],$col['3']);

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

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

  38.     }    /**
  39.      * 压缩图片
  40.      * @param  [type] $thumbSize 压缩图片大小
  41.      * @return [type]            [description]     */
  42.     public function thumb($thumbSize){
  43.         $imageThumb=imagecreatetruecolor($thumbSize[0], $thumbSize[1]);
  44.         
  45.         imagecopyresampled($imageThumb, $this-&gt;image, 0, 0, 0, 0, $thumbSize[0], $thumbSize[1], $this-&gt;info['0'], $this-&gt;info['1']);
  46.         imagedestroy($this-&gt;image);
  47.         $this-&gt;image=$imageThumb;
  48.     }    /**
  49.     * 裁剪图片
  50.      * @param  [type] $cutSize  裁剪大小
  51.      * @param  [type] $location 裁剪位置
  52.      * @return [type]           [description]     */
  53.      public function cut($cutSize,$location){
  54.          $imageCut=imagecreatetruecolor($cutSize[0],$cutSize[1]);

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

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

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

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

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

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

来源:https://www.jb51.net/program/319494vdy.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具