Изображение загружается автоматически при загрузке - PullRequest
13 голосов
/ 14 марта 2011

Я пытаюсь загрузить изображение в кодировке 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;
}

Я не использую какие-либо функции вращения, но он все еще вращается. Я могу использовать функцию PHP GD, например, imagerotate, но не хочу по таким причинам, как черный фон и т. Д.

Если ты можешь помочь ... ты самый крутой человек !!

Ответы [ 3 ]

15 голосов
/ 14 марта 2011

Я полагаю, что загружаемое изображение на самом деле вращается, но исправляется, потому что оно содержит данные поворота в секции EXIF.(Например, камера может знать о портретной ориентации при съемке фотографии и сохранять эту информацию в данных EXIF; некоторые программы просмотра знают о данных вращения и автоматически поворачивают фотографию при просмотре.) В этом случае, изображение может просто отображаться для поворота за вас, в зависимости от того, что вы используете для его просмотра.

Вы просматриваете изображения «до загрузки» и «после загрузки»используя то же программное обеспечение?Что произойдет, если вы посмотрите на них обоих, используя один и тот же веб-браузер, скажем?

Что произойдет, если вы попробуете другое изображение, предпочтительно из другого источника?У вас есть программное обеспечение, которое позволит вам просматривать данные EXIF ​​изображения?Ищите значение «Ориентация»;любое значение, отличное от «1», означает, что для изображения задан поворот (см. на этой странице , чтобы получить достойное описание.)

Итак, в целом, я бы сказал, что это базовое изображениев файле JPEG находится в «неправильной» ориентации, и данные EXIF ​​содержат информацию, чтобы исправить это вращение для отображения.Это очень вероятно, если источником является, например, iPhone, который только что играл с моим, похоже, хранит данные своего базового изображения в альбомной ориентации, но устанавливает данные EXIF, если изображение действительно было снято (и поэтому должно отображаться) как портрет.

Лучший способ исправить это - почти наверняка проверить данные EXIF ​​файла после загрузки, используя PHP EXIF ​​функции и повернуть изображение по мере необходимости для корректировки ориентации.перед сохранением собственной копии.

1 голос
/ 17 ноября 2017
<code><?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 "
"; if (! empty ($ exif ['Orientation'])) { $ imageResource = imagecreatefromjpeg ($ filePath); switch ($ exif ['Orientation']) { случай 3: $ image = imagerotate ($ imageResource, 180, 0); перерыв; дело 6: $ image = imagerotate ($ imageResource, -90, 0); перерыв; дело 8: $ image = imagerotate ($ imageResource, 90, 0); перерыв; дефолт: $ image = $ imageResource; } imagejpeg ($ image, $ filename, 90); } } ?>
Выберите img
1 голос
/ 26 сентября 2014

Я столкнулся с этой проблемой, когда создавал мобильное гибридное приложение, которое использовало Cordova для доступа к камере мобильного телефона, а затем отправляло изображение на сервер. Я решил это, установив для свойства correctOrientation значение true.

navigator.camera.getPicture(onSuccess, onFail,
                        {
                            quality: 80,
                            destinationType:Camera.DestinationType.DATA_URL,
                            correctOrientation : true
                        });
...