Подтвердить что ты не робот

Загрузка изображения с iphone-полос данных exif

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

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

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

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

EDIT: По-видимому, он отлично работает с Android-телефонами 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>

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

4b9b3361

Ответ 1

Проблема

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

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

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

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

Решение

Обновление: Это не работает. (спасибо likeitlikeit для этой информации)

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

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

Источники

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

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

Ответ 2

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

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

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

Посмотрите.

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

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

Ответ 3

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

Ответ 4

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

Мне нужна информация MAKE для правильного поворота фотографий. Значение ORIENTATION отличается для Apple и Android, и если бы у меня был MAKE, я мог бы код адаптироваться. Не могу понять, что может означать секретность, зная, какое устройство взяло картину.

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

  • создание кода для UPLOAD сохраненного файла (не разделяющего изображение) на местоположение сервера, а затем присоединение/добавление в конечное место
  • использование коммерческих приложений для загрузки, например 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 и устройство, также можем ли мы.

Если мы получим эти данные, его можно добавить в pic 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 Файл

FROM 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",

EDIT: добавлена ​​разница в php.net и получить браузер: http://www.php.net/manual/en/function.get-browser.php

Ответ 5

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

Ответ 6

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

  • Opera mini
  • Chrome
  • Mercury

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

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

Ответ 7

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

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

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

Ответ 8

Был протестирован на 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
}

Ответ 9

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

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

Ответ 10

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

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

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