基于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->type=image_type_to_extension($this->info['2'],false);
$fun="imagecreatefrom{$this->type}";
$this->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->image, $col['0'], $col['1'], $col['2'],$col['3']);
imagettftext($this->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->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->image, 0, 0, 0, 0, $thumbSize, $thumbSize, $this->info['0'], $this->info['1']);
imagedestroy($this->image);
$this->image=$imageThumb;
} /**
* 裁剪图片
* @param $cutSize裁剪大小
* @param $location 裁剪位置
* @return */
public function cut($cutSize,$location){
$imageCut=imagecreatetruecolor($cutSize,$cutSize);
imagecopyresampled($imageCut, $this->image, 0, 0, $location, $location,$cutSize,$cutSize,$cutSize,$cutSize);
imagedestroy($this->image);
$this->image=$imageCut;
} /**
* 展现图片
* @return */
public function show(){
header("content-type:".$this->info['mime']);
$funn="image".$this->type;
$funn($this->image);
} /**
* 保存图片
* @param $newname 新图片名
* @return */
public function save($newname){
header("content-type:".$this->info['mime']);
$funn="image".$this->type;
$funn($this->image,$newname.'.'.$this->type);
} public function destruct(){
imagedestroy($this->image);
}
}以上就是基于PHP封装图片裁剪工具类的详细内容,更多关于PHP图片裁剪的资料请关注脚本之家其它相关文章!
来源:https://www.jb51.net/program/319494vdy.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页:
[1]