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[0] ) && $arrImageInfos[0] )
{
$this->src_width = $arrImageInfos[0];
}
if( isset( $arrImageInfos[1] ) && $arrImageInfos[1] )
{
$this->src_height = $arrImageInfos[1];
}
$this->src_type = 2;
if( isset( $arrImageInfos[2] ) && $arrImageInfos[2] )
{
$this->src_type = $arrImageInfos[2];
}
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[0] ) && $tmpImageInfo[0] > 0 )
{
$width = $tmpImageInfo[0];
}
if( isset( $tmpImageInfo[1] ) && $tmpImageInfo[1] > 0 )
{
$height = $tmpImageInfo[1];
}
$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[1] ) )
{
$strExt = $matches[1];
}
if( false == $strExt || is_null( $strExt ) || strlen( $strExt ) <= 0 )
{
$strExt = '.jpg';
}
return $strExt;
}
}