PHP图像裁剪旋转图像

时间:2014-12-19 13:13:25

标签: php

我正在创建一个允许用户上传照片的移动应用,但我在使用您在此处https://gist.github.com/philBrown/880506找到的图像操纵器类调整图像大小时出现问题。

我的问题是,当我通过将手机保持在纵向模式拍照时,图像向右旋转90度。当我以横向模式拍照时,一切都很顺利。

这是我的裁剪PHP代码:

$manipulator = new ImageManipulator($_FILES['Filedata']['tmp_name']);
$width  = $manipulator->getWidth();
$height = $manipulator->getHeight();
$centreX = round($width / 2);
$centreY = round($height / 2);

// our dimensions will be 600x450
$x1 = $centreX - 300; // 600 / 2
$y1 = $centreY - 225; // 450 / 2

$x2 = $centreX + 300; // 600 / 2
$y2 = $centreY + 225; // 450 / 2

// center cropping to 600x450
$newImage = $manipulator->crop($x1, $y1, $x2, $y2);

// rotate 90 degrees to the right
$imageResource = $newImage->getResource();
$angle = '90'; // in degrees
$fileName = "../file_upload_img/43/" . $random_file_name . $_FILES["Filedata"]["name"];
$rotatedImage = imagerotate($imageResource, $angle);
imagejpeg($rotatedImage, $fileName, 95);

// saving file to uploads folder
$manipulator->save("../file_upload_img/43/" . $random_file_name . $_FILES["Filedata"]["name"]);

如何确保以纵向模式拍摄的照片在裁剪时不会旋转?

编辑*

upload.php代码:

require_once(__DIR__ . '/../includes/ImageManipulator.php');
require_once(__DIR__ . '/../init/db/conn.php');

ob_start();
echo "<pre>";
print_r($_FILES);
print_r($_GET);
print_r($_POST);

echo "</pre>";

print_r("file type: " . $_FILES["Filedata"]["type"]);

$allowedExts = array("gif", "jpeg", "jpg", "png");
$temp = explode(".", $_FILES["Filedata"]["name"]);
$extension = end($temp);
if ((($_FILES["Filedata"]["type"] == "image/gif")
    || ($_FILES["Filedata"]["type"] == "image/jpeg")
    || ($_FILES["Filedata"]["type"] == "image/jpg")
    || ($_FILES["Filedata"]["type"] == "image/pjpeg")
    || ($_FILES["Filedata"]["type"] == "image/x-png")
    || ($_FILES["Filedata"]["type"] == "image/png"))
    && ($_FILES["Filedata"]["size"] < 9999999999)
    && in_array($extension, $allowedExts)) {
        if ($_FILES["Filedata"]["error"] > 0) {
            echo "Return Code: " . $_FILES["Filedata"]["error"] . "<br>";
        }
        else {
            echo "Upload: " . $_FILES["Filedata"]["name"] . "<br>";
            echo "Type: " . $_FILES["Filedata"]["type"] . "<br>";
            echo "Size: " . ($_FILES["Filedata"]["size"] / 1024) . " kB<br>";
            echo "Temp file: " . $_FILES["Filedata"]["tmp_name"] . "<br>";

        if (file_exists("../file_upload_img/" . $_FILES["Filedata"]["name"])) {
            echo $_FILES["Filedata"]["name"] . " already exists. ";
        }
        else {
            $random_file_name = sha1(uniqid($_FILES["Filedata"]["name"]));

            /*
            * ROTATE, CROP AND RESIZE
            */
            // 4:3 Ratio version
            $manipulator = new ImageManipulator($_FILES['Filedata']['tmp_name']);

            // Resize image to 600px wide and 450px high
            $manipulator = $manipulator->resample(600, 450);    

            // saving file to uploads folder
            $manipulator->save("../file_upload_img/43/" . $random_file_name . $_FILES["Filedata"]["name"]);

            $width  = $manipulator->getWidth();
            $height = $manipulator->getHeight();
            $centreX = round($width / 2);
            $centreY = round($height / 2);
            // our dimensions will be 600x450
            $x1 = $centreX - 300; // 600 / 2
            $y1 = $centreY - 225; // 450 / 2

            $x2 = $centreX + 300; // 600 / 2
            $y2 = $centreY + 225; // 450 / 2

            // center cropping to 200x130
            $newImage = $manipulator->crop($x1, $y1, $x2, $y2);

            // rotate 90 degrees to the right
            $imageResource = $newImage->getResource();
            $angle = '90'; // in degrees
            $fileName = "../file_upload_img/43/" . $random_file_name . $_FILES["Filedata"]["name"];
            $rotatedImage = imagerotate($imageResource, $angle);
            imagejpeg($rotatedImage, $fileName, 95);

            // saving file to uploads folder
            $manipulator->save("../file_upload_img/43/" . $random_file_name . $_FILES["Filedata"]["name"]);

            // 640:120 Ratio version
            $manipulator_640 = new ImageManipulator($_FILES['Filedata']['tmp_name']);

            // Resize image to 640px wide and 120px high
            $manipulator_640 = $manipulator_640->resample(640, 120);    

            // saving file to uploads folder
            $manipulator_640->save("../file_upload_img/header/" . $random_file_name . $_FILES["Filedata"]["name"]);

            $width_640  = $manipulator_640->getWidth();
            $height_640 = $manipulator_640->getHeight();
            $centreX_640 = round($width_640 / 2);
            $centreY_640 = round($height_640 / 2);
            // our dimensions will be 640x120
            $x1_640 = $centreX_640 - 320; // 640 / 2
            $y1_640 = $centreY_640 - 60; // 120 / 2

            $x2_640 = $centreX_640 + 320; // 640 / 2
            $y2_640 = $centreY_640 + 60; // 120 / 2

            // center cropping to 640x120
            $newImage_640 = $manipulator_640->crop($x1_640, $y1_640, $x2_640, $y2_640);
            // saving file to uploads folder
            $manipulator_640->save("../file_upload_img/header/" . $random_file_name . $_FILES["Filedata"]["name"]);
            /*
            *****************
            */
        }
    }
}
else {
    echo "Invalid file";
}

$data=ob_get_clean();

编辑2

我已将用户@matewka的代码添加到我的PHP中。我用包含的旋转代码编辑了我的PHP。代码根本不会旋转图像。

2 个答案:

答案 0 :(得分:2)

关于你最近的评论:

  

我刚刚意识到手机本身已经旋转​​了我拍摄后的图像。 如何通过手机旋转最近拍摄的图像以使它们看起来正常?

要在PHP中旋转图像,您可以使用imagerotate功能。因此,在您裁剪图像并将其保存到$newImage变量后,请继续执行以下操作:

$imageResource = $newImage->getResource();
$angle = '90'; // in degrees
$fileName = "../file_upload_img/43/" . $random_file_name . $_FILES["Filedata"]["name"];
$rotatedImage = imagerotate($imageResource, $angle);
imagejpeg($rotatedImage, $fileName, 95);

答案 1 :(得分:2)

使用exif_read_data

修复图像方向
function orientation($path){
    $image = imagecreatefromjpeg($path);
    $exif = exif_read_data($path);
    $orientation = $exif['COMPUTED']['Orientation'];
    switch ($orientation) {
        case 3:
            $image = imagerotate($image, 180, 0);
            break;
        case 6:
            $image = imagerotate($image, -90, 0);
            break;
        case 8:
            $image = imagerotate($image, 90, 0);
            break;
    }
    imagejpeg($image, $path);
}

可能会检测到4种可能的方向[Here]