Загрузка изображения с 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 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
Официальных заявлений от Apple об этой функции нет, хотя многие люди спрашивают об этом даже на форумах Apple. На самом деле, судя по сообщениям в сети, это происходит не только с загрузками в Safari с iPhone, но и с вложениями, отправленными по электронной почте.
Однако очевидно, что это затрагивает многих людей. Фликр, похоже, главная жертва, но есть и другие.
К счастью, в настоящее время существуют способы доступа необработанные данные файла для тегов <input type="file">
. Это позволяет вам взять нужную информацию EXIF, поместить ее в скрытое поле формы и отправить вместе с фактической загрузкой файла. Я адаптировал jsfiddle из этого ответа, чтобы продемонстрировать, что я имею в виду под этим:
ОБНОВЛЕНИЕ: JavaScript не помогает
Похоже, это не оказывает желаемого эффекта на устройства iOS текущего поколения, так как FileReader
API также получает доступ только к очищенному версия файла.
Если фотография отправлена по электронной почте с iphone и сохранена на mac, данные exif сохраняются. Если он скопирован с помощью захвата изображения на Mac, данные exif сохраняются. Только в том случае, если загруженные в службу с роли камеры данные exif не отправляются вместе с загрузкой.
К сожалению, итамар (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
Я только что попробовал другой браузер, Opera Mini, и он сработал! Получил все мои данные exif!
В настоящее время я использую iOS 8.1.1, и я также заметил это неприятное поведение при вырезании определенных данных Exif из фотографий при загрузке через мобильное сафари. Я заметил такое же поведение при новой установке:
- Опера мини
- Хром
- Меркурий
Поэтому я предполагаю, что поведение не связано с браузером, а связано с приложением камеры при передаче фотографии в другое приложение (не авторизованное Apple).
Кто-нибудь нашел официального заявление от Apple об этом сокращении данных Exif?
У меня также есть аналогичная проблема с копированием с iPhone (похоже, не имеет значения, какая комбинация iOS/iPhone, поскольку это происходит уже много лет) на компьютер с Windows 7 (также опробованный на разных машинах). Если я скопирую файл jpg с телефона на компьютер, информация EXIF о значительном меньшинстве изображений будет серьезно удалена. Что очень раздражает, когда метки времени и информация GPS сбиваются с пути. Что еще более странно, так это то, что я могу восстановить "Дату съемки", если я просмотрю jpg в картинной галерее MS и посмотрите на штамп даты съемки изображения, который все еще присутствует - Измените дату на единицу, а затем введите ее обратно, и штамп даты съемки снова появится в файле в проводнике Windows. Это более странное поведение в дополнение к странному поведению и очень раздражает в придачу. Вы не должны выполнять поворот изображений или любое другое редактирование до тех пор, пока не будет исправлена ошибка PG, иначе вы не сможете восстановить штамп с датой съемки.
Для получения дополнительной информации: У меня не установлен iTunes, как это вызывает другие не связанные с этим проблемы.
Итак, чтобы повторить - iPhone, подключенный к ПК, скопируйте файлы jpg через проводник Windows, и некоторые файлы, по-видимому, потеряют свою информацию EXIF.
Тестировался на 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.
Так что, если бы все вы могли достать свои айфоны и начать тестирование, было бы здорово узнать, решена ли эта проблема.