陈捷盛 发表于 2023-1-3 04:34:48

PHP实现图片旋转的方法详解

最近有一个需求需要将前端上传过来的图片进行逆时针旋转90°,这个主要需要使用到php的imagerotate方法对于图片进行旋转,具体实现方法如下:
<?php

namespace common\traits;

use Yii;
use yii\helpers\FileHelper;

/**
* 图片旋转处理trait
*
* @author wangjian
* @since 1.0
*/
class ImageRotate
{

    /**
   * base64图片旋转
   * @param $image 需要旋转的base64图片
   * @param string $rotate 逆时针旋转角度
   * @param false $savePath 保存的图片路径,false返回base64格式
   */
    public static function base64Rotate($image, $rotate = '90', $savePath = false)
    {
      if (empty($image)) {
            return false;
      }
      if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $image, $result)) {
            $type = $result;
            //设置临时目录
            $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, '', $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 = '90', $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, 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图片', '旋转角度');2:base64图片旋转并保存
ImageRotate::base64Rotate('base64图片', '旋转角度', '保存地址');3:本地图片旋转
ImageRotate::imageRotate('本地图片地址', '旋转角度', '保存地址');根据上面的方法我们就可以实现图片的旋转功能了
到此这篇关于PHP实现图片旋转的方法详解的文章就介绍到这了,更多相关PHP图片旋转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

来源:https://www.jb51.net/article/266643.htm
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: PHP实现图片旋转的方法详解