Загрузка изображения с 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-данные не отправляются при загрузке.
У меня такая же проблема. Ниже показано решение
Чтобы решить проблему... зайдите в настройки, Камера, Форматы. Выберите "Наиболее совместимые".
В настоящее время я использую 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.
Так что, если бы вы все могли достать свои айфоны и начать тестирование, было бы здорово увидеть, решена ли это.