最近有一个需求需要将前端上传过来的图片进行逆时针旋转90°,这个主要需要使用到php的imagerotate方法对于图片进行旋转,具体实现方法如下:
namespace common\traits; | |
use Yii; | |
use yii\helpers\FileHelper; | |
/** | |
* 图片旋转处理trait | |
* | |
* @author wangjian | |
* @since.0 | |
*/ | |
class ImageRotate | |
{ | |
/** | |
* base图片旋转 | |
* @param $image 需要旋转的base图片 | |
* @param string $rotate 逆时针旋转角度 | |
* @param false $savePath 保存的图片路径,false返回base格式 | |
*/ | |
public static function baseRotate($image, $rotate = '90', $savePath = false) | |
{ | |
if (empty($image)) { | |
return false; | |
} | |
if (preg_match('/^(data:\s*image\/(\w+);base,)/', $image, $result)) { | |
$type = $result[]; | |
//设置临时目录 | |
$temporaryPath = '/tmp/'; | |
$temporaryPath = dirname(Yii::getAlias('@common')) . '/web' . $temporaryPath; | |
FileHelper::createDirectory($temporaryPath); | |
//将原图保存到零食目录 | |
$temporaryImage = date('YmdHis') . rand(, 9999) . '.' . $type; | |
if (file_put_contents($temporaryPath . $temporaryImage, base_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[] . base64_encode(ob_get_contents()); | |
@unlink($newImage); | |
} else { | |
$imageString = imagepng($newImage, $savePath); | |
} | |
ob_end_clean(); | |
return $imageString; | |
} | |
} | |
return false; | |
} | |
/** | |
* 本地图片旋转 | |
* @param $image 需要旋转的本地图片 | |
* @param string $rotate 逆时针旋转角度 | |
* @param false $savePath 保存的图片路径,false返回替换原图 | |
*/ | |
public static function imageRotate($image, $rotate = '', $savePath = false) | |
{ | |
if (empty($image)) { | |
return false; | |
} | |
//旋转图片 | |
$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 逆时针旋转角度 | |
*/ | |
private static function rotateImage($file, $rotate) | |
{ | |
$imageSize = getimagesize($file); | |
$imageSize = explode('/', $imageSize['mime']); | |
$type = $imageSize[]; | |
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,); //逆时针旋转 | |
//获取旋转后的宽高 | |
$srcWidth = imagesx($rotateImage); | |
$srcHeight = imagesy($rotateImage); | |
//创建新图 | |
$newImage = imagecreatetruecolor($srcWidth, $srcHeight); | |
//分配颜色 + alpha,将颜色填充到新图上 | |
$alpha = imagecolorallocatealpha($newImage,, 0, 0, 127); | |
imagefill($newImage,, 0, $alpha); | |
//将源图拷贝到新图上,并设置在保存 PNG 图像时保存完整的 alpha 通道信息 | |
imagecopyresampled($newImage, $rotateImage,, 0, 0, 0, $srcWidth, $srcHeight, $srcWidth, $srcHeight); | |
imagesavealpha($newImage, true); | |
return $newImage; | |
} | |
} |
具体使用:
1:base64图片旋转并输出base64
ImageRotate::baseRotate('base64图片', '旋转角度');
2:base64图片旋转并保存
ImageRotate::baseRotate('base64图片', '旋转角度', '保存地址');
3:本地图片旋转
ImageRotate::imageRotate('本地图片地址', '旋转角度', '保存地址');
根据上面的方法我们就可以实现图片的旋转功能了