我正在尝试上传base64编码的图像并在解码后保存。图像上传并保存,我可以使用URL和所有内容访问它。但图像逆时针旋转90度,我不知道为什么!!
我获取编码数据的地方很好,因为把它放在<img />
中工作正常!
function saveImageData($base64Data) {
$base64_decoded = base64_decode($base64Data);
$im = imagecreatefromstring($base64_decoded);
if ($im !== false) {
$imagepath = '/public/uploads/' . time() . '.jpg';
imagejpeg($im, $imagepath);
chmod($imagepath, 0755);
imagedestroy($im);
} else {
return false;
}
return $imagepath;
}
我没有使用任何旋转功能,但它仍在旋转。我可以使用像Imagerotate这样的PHP GD函数,但不想出于黑色背景等原因。
如果你可以帮助......你是最棒的人!!
答案 0 :(得分:15)
我的猜测是您上传的图片实际上已经旋转,但正在更正,因为它在EXIF部分中包含旋转数据。 (例如,相机在拍照时可能会发现纵向方向,并将该信息保存在EXIF数据中;某些查看软件会识别旋转数据,并在查看时自动旋转照片。)在这种情况下,图像可能只是出现为您旋转,具体取决于您使用它来查看它。
您是否正在使用相同的软件查看“上传前”和“上传后”图片?如果你使用相同的网络浏览器查看它们会发生什么呢?
如果您尝试使用其他图像,最好是来自不同来源,会发生什么?您是否有任何软件可以查看图像的EXIF数据?寻找“定位”值;除“1”以外的任何内容都意味着图像的旋转设置(请参阅this page以获得合适的描述。)
因此,总而言之,我会说JPEG文件中的基础图像处于“错误”方向,而EXIF数据包含用于校正旋转以供显示的信息。如果源是例如刚刚与我玩过的iPhone,它很可能是以横向方式存储其底层图像数据,但如果实际拍摄了图像则设置EXIF数据(因此应该显示) )作为肖像。
最好的解决方法是在上传后检查文件上的EXIF数据,使用PHP EXIF functions并根据需要旋转图像以更正方向,然后再保存自己的副本。
答案 1 :(得分:1)
我在制作移动混合应用程序时遇到过这个问题,该应用程序使用Cordova访问手机摄像头,然后将图像发布到服务器。我通过将correctOrientation属性设置为true来解决它。
navigator.camera.getPicture(onSuccess, onFail,
{
quality: 80,
destinationType:Camera.DestinationType.DATA_URL,
correctOrientation : true
});
答案 2 :(得分:1)
<?php
if (isset($_POST['submit'])) {
$filename = $_FILES['file']['name'];
$filePath = $_FILES['file']['tmp_name'];
$exif = exif_read_data($_FILES['file']['tmp_name']);
echo "<pre>";
print_r($exif);
echo "</pre>";
if (!empty($exif['Orientation'])) {
$imageResource = imagecreatefromjpeg($filePath);
switch ($exif['Orientation']) {
case 3:
$image = imagerotate($imageResource, 180, 0);
break;
case 6:
$image = imagerotate($imageResource, -90, 0);
break;
case 8:
$image = imagerotate($imageResource, 90, 0);
break;
default:
$image = $imageResource;
}
imagejpeg($image, $filename, 90);
}
}
?>
<form class="form-horizontal" method="post" enctype="multipart/form-data">
<div class="form-group">
<div class="col-md-9">
<div class="input-group">
<span class="input-group-btn">
<span class="btn btn-default btn-file">
Choose img<input type="file" name="file" id="imgInp">
</span>
</span>
</div>
</div>
</div>
<button name="submit" type="submit">Send</button>
</form>