PHP 图像裁剪可旋转图像


PHP image cropping rotates image

我正在创建一个允许人们上传照片的移动应用程序,但我在使用图像操纵器类调整图像大小时遇到了问题,您可以在 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"]);

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

编辑*

上传.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。代码根本不旋转图像。

> 使用 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 个可能的方向需要检测 [这里]

关于您最近的评论:

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

要在PHP中旋转图像,您可以使用图像旋转功能。因此,在裁剪图像并将其保存到$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);