-
基于PHP封装图片裁剪工具类
这篇文章主要为大家详细介绍了如何基于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[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;
}
}
知识补充
除了上文的内容,小编还为大家整理了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 [type] $font 字体
* @param [type] $content 内容
* @param [type] $size 文字大小
* @param [type] $col 文字颜色(四元数组)
* @param array $location 位置
* @param integer $angle 倾斜角度
* @return [type]
*/
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 [type] $imageMark 水印图片地址
* @param [type] $dst 水印图片在原图片中的位置
* @param [type] $pct 透明度
* @return [type]
*/
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[0], $dst[1], 0, 0, $info2['0'], $info2['1'], $pct);
imagedestroy($water);
} /**
* 压缩图片
* @param [type] $thumbSize 压缩图片大小
* @return [type] [description] */
public function thumb($thumbSize){
$imageThumb=imagecreatetruecolor($thumbSize[0], $thumbSize[1]);
imagecopyresampled($imageThumb, $this->image, 0, 0, 0, 0, $thumbSize[0], $thumbSize[1], $this->info['0'], $this->info['1']);
imagedestroy($this->image);
$this->image=$imageThumb;
} /**
* 裁剪图片
* @param [type] $cutSize 裁剪大小
* @param [type] $location 裁剪位置
* @return [type] [description] */
public function cut($cutSize,$location){
$imageCut=imagecreatetruecolor($cutSize[0],$cutSize[1]);
imagecopyresampled($imageCut, $this->image, 0, 0, $location[0], $location[1],$cutSize[0],$cutSize[1],$cutSize[0],$cutSize[1]);
imagedestroy($this->image);
$this->image=$imageCut;
} /**
* 展现图片
* @return [type] [description] */
public function show(){
header("content-type:".$this->info['mime']);
$funn="image".$this->type;
$funn($this->image);
} /**
* 保存图片
* @param [type] $newname 新图片名
* @return [type] [description] */
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://blog.csdn.net/Q718330882/article/details/137604084
栏目列表
最新更新
vbs能调用的系统对象小结
vbscript网页模拟登录效果代码
VBScript 根据IE窗口的标题输出ESC
杀死指定进程名称的小VBS
通过vbs修改以点结尾的文件的属性为隐藏
查询电脑开关机时间的vbs代码
VBA中的Timer函数用法
ComboBox 控件的用法教程
在windows 64位操作系统上运行32位的vbscri
无法执行vbs脚本中遇到的问题及解决方案
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比