我正在创建一个允许用户上传照片的移动应用,但我在使用您在此处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。代码根本不会旋转图像。
答案 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]