Загрузка изображения с iphone обрезает данные exif

Я создал веб-сайт, который позволяет загружать изображения, и как только изображение загружается, отображается некоторая конкретная информация о фотографии. Загрузка изображений с компьютеров работает нормально, проблема возникает, когда я пытаюсь загрузить изображение со смартфона. Загрузка успешно завершена, но кажется, что большая часть данных, отображаемых при загрузке с компьютера, теперь отсутствует.

Этот раздел кода является тем, который фактически извлекает и отображает данные:

$location = $_FILES["pic"]["tmp_name"];
$data = exif_read_data($location);
var_dump($data);

var_dump($data) фактически сбрасывает разные данные в компьютеры и смартфоны.

РЕДАКТИРОВАТЬ: По-видимому, это прекрасно работает со смартфонами Andoroid, проблема возникает только тогда, когда я пытаюсь загрузить изображения с iPhone

Например, var_dump с компьютера загрузить:

array(49) { 
    ["FileName"]=> string(10) "php2D4.tmp" 
    ["FileDateTime"]=> int(1367318152) 
    ["FileSize"]=> int(30357) 
    ["FileType"]=> int(2) 
    ["MimeType"]=> string(10) "image/jpeg" 
    ["SectionsFound"]=> string(24) "ANY_TAG, IFD0, EXIF, GPS" 
    ["COMPUTED"]=> array(6) { 
        ["html"]=> string(24) "width="320" height="240""  
        ["Height"]=> int(240)  
        ["Width"]=> int(320)  
        ["IsColor"]=> int(1)  
        ["ByteOrderMotorola"]=> int(1)  
        ["ApertureFNumber"]=> string(5) "f/2.8"  
    }  
    ["Make"]=> string(5) "Apple"  
    ["Model"]=> string(8) "iPhone 4"  
    ["Orientation"]=> int(3)  
    ["XResolution"]=> string(4) "72/1"  
    ["YResolution"]=> string(4) "72/1"  
    ["ResolutionUnit"]=> int(2)  
    ["Software"]=> string(5) "6.1.3"  
    ["DateTime"]=> string(19) "2013:04:26 23:57:43"  
    ["YCbCrPositioning"]=> int(1)  
    ["Exif_IFD_Pointer"]=> int(204)  
    ["GPS_IFD_Pointer"]=> int(594)  
    ["ExposureTime"]=> string(4) "1/15"  
    ["FNumber"]=> string(4) "14/5"  
    ["ExposureProgram"]=> int(2)  
    ["ISOSpeedRatings"]=> int(1000)  
    ["ExifVersion"]=> string(4) "0221"  
    ["DateTimeOriginal"]=> string(19) "2013:04:26 23:57:43"  
    ["DateTimeDigitized"]=> string(19) "2013:04:26 23:57:43"  
    ["ComponentsConfiguration"]=> string(4) ""  
    ["ShutterSpeedValue"]=> string(9) "4889/1250"  
    ["ApertureValue"]=> string(9) "4281/1441"  
    ["BrightnessValue"]=> string(10) "-3581/1451"  
    ["MeteringMode"]=> int(5)  
    ["Flash"]=> int(24)  
    ["FocalLength"]=> string(5) "77/20"  
    ["SubjectLocation"]=> array(4) {  
        [0]=> int(1295) 
        [1]=> int(967) 
        [2]=> int(699) 
        [3]=> int(696) 
    } 
    ["FlashPixVersion"]=> string(4) "0100" 
    ["ColorSpace"]=> int(1) 
    ["ExifImageWidth"]=> int(2592) 
    ["ExifImageLength"]=> int(1936) 
    ["SensingMethod"]=> int(2) 
    ["ExposureMode"]=> int(0) 
    ["WhiteBalance"]=> int(0) 
    ["FocalLengthIn35mmFilm"]=> int(35) 
    ["SceneCaptureType"]=> int(0) 
    ["GPSLatitudeRef"]=> string(1) "N" 
    ["GPSLatitude"]=> array(3) { 
        [0]=> string(4) "31/1" 
        [1]=> string(8) "5854/100" 
        [2]=> string(3) "0/1" 
    } 
    ["GPSLongitudeRef"]=> string(1) "E" 
    ["GPSLongitude"]=> array(3) { 
        [0]=> string(4) "34/1" 
        [1]=> string(8) "4684/100" 
        [2]=> string(3) "0/1" 
    } 
    ["GPSTimeStamp"]=> array(3) { 
        [0]=> string(4) "20/1" 
        [1]=> string(4) "57/1" 
        [2]=> string(8) "4272/100" 
    } 
    ["GPSImgDirectionRef"]=> string(1) "T" 
    ["GPSImgDirection"]=> string(9) "48089/465" 
}

var_dump от загрузки смартфона:

array(12) { 
    ["FileName"]=> string(9) "phpSzwfPw" 
    ["FileDateTime"]=> int(1367318054) 
    ["FileSize"]=> int(1778041) 
    ["FileType"]=> int(2) 
    ["MimeType"]=> string(10) "image/jpeg" 
    ["SectionsFound"]=> string(19) "ANY_TAG, IFD0, EXIF" 
    ["COMPUTED"]=> array(5) { 
        ["html"]=> string(26) "width="2592" height="1936"" 
        ["Height"]=> int(1936) 
        ["Width"]=> int(2592) 
        ["IsColor"]=> int(1) 
        ["ByteOrderMotorola"]=> int(1) 
    } 
    ["Orientation"]=> int(3) 
    ["Exif_IFD_Pointer"]=> int(38) 
    ["ColorSpace"]=> int(1) 
    ["ExifImageWidth"]=> int(2592) 
    ["ExifImageLength"]=> int(1936) 
}

Вот компьютер var_dump($_FILES):

    array(1) 
{ ["pic"]=> array(5) 
{ ["name"]=> string(18) leaf2.JPG" 
["type"]=> string(10) "image/jpeg" 
["tmp_name"]=> string(14) "/tmp/phpzeDUs9"
 ["error"]=> int(0)
 ["size"]=> int(46439) } }

Вот результаты iPhone var_dump($_FILES):

    array(1) { ["pic"]=> array(5) 
{ ["name"]=> string(9) "image.jpg" 
["type"]=> string(10) "image/jpeg" 
["tmp_name"]=> string(14) "/tmp/phplPUZky" 
["error"]=> int(0) ["size"]=> int(1455577) } } 

РЕДАКТИРОВАТЬ: Вот форма загрузки HTML-код:

     <form action="results.php" id="upload-image" method="post" enctype="multipart/form-data">
         <div class="fileupload fileupload-new" data-provides="fileupload">
          <div class="fileupload-preview thumbnail" style="width: 200px; height: 150px;"></div>
          <div>
            <span class="btn btn-file"><span class="fileupload-new">Select image</span><span class="fileupload-exists">Change</span><input type="file" name="pic" id="pic" accept="image/*"/></span>
            <a href="#" class="btn fileupload-exists" data-dismiss="fileupload">Remove</a>
            <button type="submit" class="btn">Upload</button>
            </br>
            <span class="upload-error"></span>
          </div>
     </form>

Что может вызвать это?

9 ответов

Решение

Эта проблема

Правильно, что iphone (ipad и т. Д., Теперь я буду называть его iphone) удаляет exif-данные. Это также не ошибка на iphone, но на самом деле особенность.

Одна из основных причин, по которой пользователям android не нравятся пользователи iphone, а пользователям iphone не нравятся android, заключается в том, что iphone очень ограничен (с точки зрения свободы изменять, изменять и т. Д.). Вы не можете просто запускать загруженные приложения, иметь ограниченный доступ к настройкам и т. Д.

Это потому, что яблочная стратегия заключается в создании отказоустойчивого продукта. "Если вы не можете делать странные вещи, странных вещей не произойдет". Он пытается защитить пользователя всеми возможными способами. Он также защищает пользователя при загрузке изображений. В exif могут быть данные, которые могут нарушить конфиденциальность пользователей. Такие вещи, как координаты GPS, но даже временная метка может навредить пользователю (представьте, что вы загружаете изображение пляжа с временной меткой с момента, когда вы сообщили, что больны с боссом).

Так что в основном это мера безопасности для удаления всех exif-данных. Я и многие другие люди не согласны с этой стратегией, но, к сожалению, мы ничего не можем с этим поделать.

Решение

Обновление: это не работает. (спасибо likeitlikeit за эту информацию)

К счастью, вы можете обойти эту проблему. Javascript приходит на помощь. С помощью javascript вы можете прочитать данные exif и отправить их вместе с фотографией, добавив некоторые дополнительные данные POST.

обратите внимание: это решение было представлено мне другим разработчиком и еще не проверено.

источники

Вы просите достоверных источников. К сожалению, их трудно найти, так как яблоко не говорит, как всегда, и поэтому вся информация, которую я имею, это слухи.

возможно, один из самых надежных источников, которые я могу представить, - один из сотрудников flickr, который подтверждает, что основной причиной является мобильное сафари, убирающее exif. http://www.flickr.com/help/forum/en-us/72157632100391901/

Официальных заявлений от Apple об этой функции нет, хотя многие спрашивают об этом даже на форумах Apple. На самом деле, из того, что сообщается в сети, это происходит не только с загрузками в Safari с iPhone, но и с вложениями по электронной почте.

Тем не менее, ясно, что это затронуло много людей. Flickr, кажется, главная жертва, но есть и другие.

К счастью, в настоящее время существуют способы доступа к необработанным файловым данным для <input type="file"> теги. Это позволяет вам взять требуемую информацию EXIF, поместить ее в скрытое поле формы и отправить ее вместе с фактической загрузкой файла. Я адаптировал jsfiddle из этого ответа, чтобы продемонстрировать, что я имею в виду под этим:

Посмотри.

ОБНОВЛЕНИЕ: JavaScript не поможет

Это, кажется, не оказывает желаемого эффекта на устройствах iOS текущего поколения, так как FileReader API также получает доступ только к очищенной версии файла.

Если изображение отправлено по электронной почте с iphone и сохранено на Mac, данные exif сохраняются. Если его скопировать с помощью IMage Capture на Mac, данные exif сохраняются. Только если вы загружены в службу из роли камеры, exif-данные не отправляются при загрузке.

У меня такая же проблема. Ниже показано решение

Чтобы решить проблему... зайдите в настройки, Камера, Форматы. Выберите "Наиболее совместимые".

https://www.flickr.com/help/forum/en-us/72157700799502582/

В настоящее время я использую iOS 8.1.1, и я также заметил это непривлекательное поведение вырезания определенных данных Exif из фотографий при загрузке через мобильное сафари. Я заметил то же поведение со свежей установкой:

  • Опера мини
  • Хром
  • Меркурий

Поэтому я предполагаю, что поведение не связано с браузером, а является приложением камеры при переносе фотографии в другое приложение (не авторизованное Apple).

Кто-нибудь нашел официальное заявление от Apple для этой вырезки данных Exif?

У меня также есть похожая проблема, связанная с копированием с iPhone (кажется, не имеет значения, какая комбинация iOS/iPhone, как это происходило в течение многих лет) на компьютер с Windows 7 (также пробовал на разных машинах). Если я копирую файл jpg с телефона на ПК, большая часть снимков получает EXIF-информацию, которая сильно удаляется. Что очень раздражает, когда метки времени и информация GPS сбиваются с пути. Что еще более странно, это то, что я могу восстановить 'Date Taken', если я просматриваю jpg в картинной галерее MS и смотрю на штамп с датой, снятый на изображении, который все еще присутствует. Измените дату на одну и введите затем обратно одну и дату Принятая печать вновь появится в файле в проводнике Windows. Это более странное поведение поверх странного и очень раздражающее при загрузке. Вы не должны делать какие-либо повороты на изображениях или любое другое редактирование до тех пор, пока вы не исправите PG, или вы не сможете вернуть штамп с датой.

Для получения дополнительной информации: у меня не установлен iTunes, поскольку это вызывает другие не связанные с этим проблемы.

Напомним, что iPhone, подключенный к ПК, копирует файлы jpg через Windows Explorer, и некоторые файлы, очевидно, потеряют свою EXIF-информацию.

I Phone удалит большую часть данных exif. Вы можете проверить это здесь: http://metapicz.com/ Просто используйте реализованную функцию загрузки из сафари...

Кто-нибудь нашел хорошее решение этой проблемы?

Я только что попробовал другой браузер, Opera Mini, и это сработало! Получил все мои exif данные!

К сожалению, itamar (op), если вы загружаете с iphone на сервер (как в моем случае), IFDO: MAKE удаляется. Если рис сохранен на iphone и отправлен по электронной почте, данные там.

Мне нужна информация MAKE, чтобы правильно вращать фотографии. Значение ОРИЕНТАЦИИ для Apple и Android различно, и если бы у меня было СДЕЛАТЬ, я мог бы написать код для адаптации. Не могу понять, что может быть связано с секретностью, зная, какое устройство сделало снимок.

Если не считать Apple, позволяющей пользователю выбирать информацию о данных PIC для загрузки, возможно, в настройках, возможные решения:

  • создание кода для ЗАГРУЗКИ сохраненного файла (но не для отправки изображения) в расположение на сервере, а затем присоединение / добавление в конечное место
  • использование коммерческих приложений для загрузки, например, http://www.transloadit.com/
  • вместо того, чтобы зависеть от данных EXIF ​​MAKE, я просто решил выяснить устройство и o / s, используемые для отправки данных. Будет изучать "client_agent" в качестве отправной точки.

Просто получил эту идею, посмотрев на RESULT JSON от загрузки в TRANSLOADIT. В нем явно есть данные, которые нам нужны:

"client_agent": "Mozilla / 5.0 (iPad; CPU OS 7_1_1, как Mac OS X) AppleWebKit/537.51.1 (KHTML, как Gecko) CriOS/34.0.1847.18 Mobile/11D201 Safari/9537.53",

Если они могут "видеть" o / s и устройство, то и мы можем.

Если мы получим эти данные, то их можно добавить в рис. EXIF ​​и использовать в другом месте.

Надеюсь, это помогло.

РЕДАКТИРОВАТЬ: данные с ПК с Windows для иллюстрации при использовании "echo $_SERVER['HTTP_USER_AGENT'] . "\ N \n";"

С ПК: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, как Gecko) Chrome/35.0.1916.114 Safari/537.36 Файл

ИЗ IPAD: "Mozilla/5.0 (iPad; CPU OS 7_1_1, например Mac OS X) AppleWebKit/537.51.1 (KHTML, как Gecko) CriOS/34.0.1847.18 Mobile/11D201 Safari/9537.53",

РЕДАКТИРОВАТЬ: добавили ссылку на php.net и получите браузер: http://www.php.net/manual/en/function.get-browser.php

Прошел тестирование на iphone 6 для загрузки мобильных изображений. Чтобы удовлетворить ориентацию на iPhone. Вы должны быть готовы к загрузке двух типов изображений. Передняя камера и задняя камера. Чтобы получить ориентацию с передней * селфи камеры, вы должны сделать следующее. Сначала сохраните изображение в папке назначения на сервере.

$image = imagecreatefromjpeg($source_url);
imagejpeg($image, $destination_url, $quality);

Оттуда вы читаете EXIF ​​из созданного файла назначения

$exif = exif_read_data($destination_url, 0, true);
    if(!empty($exif['IFD0']['Orientation'])) {
        //rotate accordingly
}

Это даст вам номер ориентации, чтобы повернуть его соответственно. Что касается задней камеры, вы можете читать непосредственно с исходного URL. Файл размещен в форме загрузки. без необходимости хранить 1-й, а затем прочитать EXIF

$exif = exif_read_data($source_url);
    if(!empty($exif['Orientation'])) {
        //rotate accordingly
}

Я думаю, что это было решено теперь с более новой версией (я точно не знаю какая) iOS. Я не могу быть уверен на 100% в этом.

Я только недавно заметил, что это начало работать на нескольких различных iPhone, которые я протестировал, с установленной iOS 9.2.

Так что, если бы вы все могли достать свои айфоны и начать тестирование, было бы здорово увидеть, решена ли это.

Другие вопросы по тегам