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图片裁剪的资料请关注代码网其它相关文章!
发表评论