关于php:php实现图片旋转

42次阅读

共计 2633 个字符,预计需要花费 7 分钟才能阅读完成。

最近有一个需要须要将前端上传过去的图片进行逆时针旋转 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[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;
            }
        }

        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[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 图片', '旋转角度');

2:base64 图片旋转并保留

ImageRotate::base64Rotate('base64 图片', '旋转角度', '保留地址');

3:本地图片旋转

ImageRotate::imageRotate('本地图片地址', '旋转角度', '保留地址');

正文完
 0