<?php
namespacecommon\traits;
useYii;
useyii\helpers\FileHelper;
/**
*图片旋转处理trait
*
*@authorwangjian
*@since1.0
*/
classImageRotate
{
/**
*base64图片旋转
*@param$image需要旋转的base64图片
*@paramstring$rotate逆时针旋转角度
*@paramfalse$savePath保存的图片路径,false返回base64格式
*/
publicstaticfunctionbase64Rotate($image,$rotate='90',$savePath=false)
{
if(empty($image)){
returnfalse;
}
if(preg_match('/^(data:\s*image\/(\w+);base64,)/',$image,$result)){
$type=$result[2];
//设置临时目录
$temporaryPath='/tmp/';
$temporaryPath=dirname(Yii::getAlias('@common')).'/web'.$temporaryPath;
FileHelper::createDirectory($temporaryPath);
//将原图保存到零食目录
$temporaryImage=date('YmdHis').rand(1000,9999).'.'.$type;
if(file_put_contents($temporaryPath.$temporaryImage,base64_decode(str_replace($result[1],'',$image)))){
$newImage=self::rotateImage($temporaryPath.$temporaryImage,$rotate);//旋转图片
//删除临时文件
@unlink($temporaryPath.$temporaryImage);
ob_start();
if($savePath===false){//返回base
imagepng($newImage);
$imageString=$result[1].base64_encode(ob_get_contents());
@unlink($newImage);
}else{
$imageString=imagepng($newImage,$savePath);
}
ob_end_clean();
return$imageString;
}
}
returnfalse;
}
/**
*本地图片旋转
*@param$image需要旋转的本地图片
*@paramstring$rotate逆时针旋转角度
*@paramfalse$savePath保存的图片路径,false返回替换原图
*/
publicstaticfunctionimageRotate($image,$rotate='90',$savePath=false)
{
if(empty($image)){
returnfalse;
}
//旋转图片
$newImage=self::rotateImage($image,$rotate);
ob_start();
if($savePath===false){
//替换原图
$url=$image;
}else{
$url=$savePath;
}
$imageString=imagepng($newImage,$url);
ob_end_clean();
return$imageString;
}
/**
*@param$file需要旋转的图片
*@param$rotate逆时针旋转角度
*/
privatestaticfunctionrotateImage($file,$rotate)
{
$imageSize=getimagesize($file);
$imageSize=explode('/',$imageSize['mime']);
$type=$imageSize[1];
switch($type){
case"png":
$image=imagecreatefrompng($file);
break;
case"jpeg":
$image=imagecreatefromjpeg($file);
break;
case"jpg":
$image=imagecreatefromjpeg($file);
break;
case"gif":
$image=imagecreatefromgif($file);
break;
}
$rotateImage=imagerotate($image,$rotate,0);//逆时针旋转
//获取旋转后的宽高
$srcWidth=imagesx($rotateImage);
$srcHeight=imagesy($rotateImage);
//创建新图
$newImage=imagecreatetruecolor($srcWidth,$srcHeight);
//分配颜色+alpha,将颜色填充到新图上
$alpha=imagecolorallocatealpha($newImage,0,0,0,127);
imagefill($newImage,0,0,$alpha);
//将源图拷贝到新图上,并设置在保存PNG图像时保存完整的alpha通道信息
imagecopyresampled($newImage,$rotateImage,0,0,0,0,$srcWidth,$srcHeight,$srcWidth,$srcHeight);
imagesavealpha($newImage,true);
return$newImage;
}
}
具体使用:
1:base64图片旋转并输出base64
ImageRotate::base64Rotate('base64图片','旋转角度');
ImageRotate::base64Rotate('base64图片','旋转角度');
2:base64图片旋转并保存
ImageRotate::base64Rotate('base64图片','旋转角度','保存地址');
3:本地图片旋转
ImageRotate::imageRotate('本地图片地址','旋转角度','保存地址');
|