图像在上传时自动旋转

时间:2011-03-14 15:50:44

标签: php rotation gd base64

我正在尝试上传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函数,但不想出于黑色背景等原因。

如果你可以帮助......你是最棒的人!!

3 个答案:

答案 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>