Загрузка изображения с 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>

Что может быть причиной этого?

Author: nvanesch, 2013-04-30

9 answers

Проблема

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

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

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

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

Решение

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

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

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

Источники

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

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

 17
Author: nvanesch, 2013-08-14 13:48:55

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

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

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

Взгляни-ка.

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

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

 5
Author: likeitlikeit, 2017-05-23 12:34:43

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

 5
Author: guest, 2013-09-14 05:07:36

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

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

Не хватает Apple, позволяющей пользователю выбирать изображение информация о данных для загрузки, возможно, в НАСТРОЙКАХ, возможные решения:

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

Только что получил это идея от просмотра РЕЗУЛЬТАТА JSON при загрузке в TRANSLOADIT. В нем явно есть необходимые нам данные:

"клиент_агент": "Mozilla/5.0 (iPad; ОС ПРОЦЕССОРА 7_1_1, как Mac OS X) AppleWebKit/537.51.1 (KHTML, как Геккон) CRIOS/34.0.1847.18 Мобильный/11D201 Safari/9537.53",

Если они могут "видеть" операционные системы и устройство, то и мы можем.

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

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

ИЗМЕНИТЬ: данные с ПК с Windows на иллюстрируйте при использовании "echo $_SERVER['HTTP_USER_AGENT']."\n\n";"

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

С IPAD: "Mozilla/5.0 (iPad; ОС ПРОЦЕССОРА 7_1_1, как Mac OS X) AppleWebKit/537.51.1 (KHTML, как Геккон) CRIOS/34.0.1847.18 Мобильный/11D201 Safari/9537.53",

ИЗМЕНИТЬ: добавлена ссылка на php.net и получить браузер: http://www.php.net/manual/en/function.get-browser.php

 0
Author: CliffPR, 2014-05-27 22:20:49

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

 0
Author: Yuri Sidorov, 2014-09-05 21:30:05

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

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

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

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

 0
Author: Robin, 2014-11-24 21:39:55

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

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

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

 0
Author: Cyclonique, 2015-05-17 16:41:47

Тестировался на 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
}
 0
Author: WyHowe, 2016-10-05 08:29:55

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

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

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

 -2
Author: Eightstrax, 2016-01-15 09:19:57