web-dev-qa-db-fra.com

Téléchargement d'images à partir de bandes d'iphone exif data

J'ai créé un site Web qui permet le téléchargement d'images et, une fois l'image téléchargée, des informations spécifiques sur la photo s'affichent. depuis un smartphone. Le téléchargement a réussi, mais il semble qu’une partie importante des données affichées lors du téléchargement à partir d’un ordinateur manque maintenant.

Cette section de code est celle qui récupère et affiche les données:

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

var_dump($data) vide en réalité différentes données dans des ordinateurs et des smartphones.

EDIT: Apparemment, cela fonctionne très bien avec les smartphones Andoroid, le problème ne se pose que lorsque j'essaye de télécharger des images depuis l'iPhone

Par exemple, var_dump de computer upload:

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 depuis smartphone upload:

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) 
}

Voici le ordinateur 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) } }

Voici le iPhone results 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) } } 

EDIT: Voici le code HTML du formulaire de téléchargement:  

     <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>

Quelle pourrait en être la cause?

32
user975343

Le problème

Il est exact que l'iphone (ipad, etc., je l'appellerai désormais iphone) supprime les données exif. Ce n’est pas non plus un bug sur l’iphone mais bien une fonctionnalité.

L'une des principales raisons pour lesquelles les utilisateurs d'Android n'aiment pas l'iPhone et les utilisateurs d'iPhone n'apprécient pas les androïdes, c'est parce que l'iphone est très limité (en termes de liberté de modification, de modification, etc.). Vous ne pouvez pas simplement exécuter des applications téléchargées, avoir un accès limité aux paramètres, etc.

En effet, la stratégie d’Apple consiste à créer un produit à sécurité intégrée. "Si vous ne pouvez pas faire des choses étranges, des choses étranges ne se produiront pas". Il essaie de protéger l'utilisateur de toutes les manières imaginables. Il protège également l'utilisateur lors du téléchargement des images. Dans l'exif, il peut y avoir des données pouvant porter atteinte à la vie privée des utilisateurs. Des choses comme les coordonnées GPS, mais même un horodatage peuvent blesser un utilisateur (imaginons que vous téléchargiez une photo de plage avec un horodatage à partir d'un moment que vous avez signalé en étant malade avec le patron).

En gros, il est donc essentiel de supprimer toutes les données EXIF. Moi-même et beaucoup d'autres personnes ne sommes pas d'accord avec cette stratégie, mais nous ne pouvons malheureusement rien y faire.

La solution

Mise à jour: Cela ne fonctionne pas. (merci likeitlikeit pour cette info)

Heureusement, vous pouvez contourner ce problème. Javascript vient à la rescousse. Avec javascript, vous pouvez lire les données exif et les envoyer avec votre photo en ajoutant des données supplémentaires POST.

notez s'il vous plaît: cette solution m'a été présentée par un autre développeur et n'a pas encore été testée. 

Sources

Vous demandez des sources crédibles. Malheureusement, ils sont difficiles à trouver car Apple ne parle pas comme toujours et, par conséquent, toutes les informations dont je dispose sont des ouï-dire.

l’une des sources les plus fiables que je puisse présenter est l’un des membres du personnel de Flickr qui confirme que la cause première est le safari mobile qui efface l’exif . http://www.flickr.com/help/forum/fr us/72157632100391901/# reply72157632135956813

18
nvanesch

si la photo est envoyée par courriel depuis iphone et enregistrée sur un mac, les données exif sont préservées. Si elle est copiée via Mac sur IMage Capture, les données exif sont préservées. Les données exif ne sont pas envoyées avec le téléchargement uniquement si elles sont téléchargées vers un service à partir du rôle de caméra.

6
guest

Apple ne fait aucune déclaration officielle à propos de cette fonctionnalité, même si plusieurs personnes le demandent, même sur les forums Apple. En fait, d'après ce qui a été rapporté sur le net, cela ne se produit pas uniquement lors des téléchargements dans Safari depuis l'iPhone, mais également pour les pièces jointes envoyées par courrier électronique. 

Cependant, il est clair que beaucoup de gens sont touchés par cela. Flickr semble être une victime majeure, mais il y en a d'autres aussi. 

Heureusement, il existe aujourd'hui des moyens d'accéder aux données de fichier brutes pour les balises <input type="file">. Cela vous permet de prendre les informations EXIF ​​de votre choix, de les placer dans un champ de formulaire masqué et de les envoyer avec le téléchargement du fichier. J'ai adapté a jsfiddle from this answer pour montrer ce que je veux dire par là: 

Regarde .

MISE À JOUR: JavaScript est sans aide

Cela ne semble pas avoir l'effet souhaité sur les appareils iOS de la génération actuelle, car the FileReader API n'a également accès qu'à une version assainie du fichier.

5
likeitlikeit

Je viens d'essayer un autre navigateur, Opera Mini, et cela a fonctionné! J'ai toutes mes données exif!

0
Yuri Sidorov

Testé sur l'iphone 6 pour le téléchargement d'images mobiles. Pour répondre à l'orientation pour iPhone. Vous devez être prêt pour les deux types d’images téléchargées. La caméra avant et la caméra arrière. Pour obtenir l'orientation de la caméra selfie frontale *, procédez comme suit: .. Commencez par stocker l'image dans votre dossier de destination sur le serveur.

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

À partir de là, vous lisez le fichier EXIF ​​à partir du fichier de destination créé.

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

Cela vous donnera le numéro d'orientation pour le faire pivoter en conséquence . Quant à la caméra de recul, vous pouvez lire directement à partir de l'URL source. Le fichier posté à partir du formulaire de téléchargement. sans avoir à stocker 1er puis lisez les EXIF

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

Malheureusement, si vous téléchargez depuis un iphone vers un serveur (comme c’est mon cas), la commande IFDO: MAKE est supprimée. Si la photo est enregistrée sur iphone et envoyée par courrier électronique, les données sont là.

J'ai besoin des informations de fabrication pour faire pivoter les photos correctement. La valeur d'ORIENTATION est différente pour Apple et Android et si j'avais le MAKE, je pourrais coder pour m'adapter. Je ne peux pas comprendre ce que les préoccupations de secret pourraient être avec savoir quel appareil a pris la photo. 

À court de Apple permettant à l'utilisateur de sélectionner les informations de données PIC à télécharger, peut-être dans les paramètres, Solutions possibles: 

  • créer du code pour charger le fichier sauvegardé (ne pas partager l'image) sur l'emplacement du serveur, puis attacher/ajouter au lieu final
  • en utilisant des applications commerciales pour télécharger, comme http://www.transloadit.com
  • plutôt que de dépendre des données EXIF ​​de MAKE, j'ai simplement décidé de rechercher le périphérique et le système utilisé pour envoyer les données. Explorera "client_agent" comme point de départ.

Cette idée vient tout simplement de regarder le RESULT JSON provenant du téléchargement sur TRANSLOADIT. Il contient clairement les données dont nous avons besoin:

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

S'ils peuvent "voir" le système et le périphérique, nous le pouvons aussi.

Si nous obtenons ces données, elles peuvent être ajoutées à l’image EXIF ​​et utilisées ailleurs.

J'espère que cela a aidé.

EDIT: données de Windows PC à illustrer lors de l’utilisation de "echo $ _SERVER ['HTTP_USER_AGENT']". "\ N\n"; "

À PARTIR DE PC: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, comme Gecko) Chrome/35.0.1916.114 Safari/537.36 Fichier 

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

EDIT: ajout de la référence à php.net et obtention du navigateur: http://www.php.net/manual/en/function.get-browser.php

0
CliffPR

J'utilise actuellement iOS 8.1.1 et j'ai également remarqué ce comportement désagréable consistant à couper certaines données Exif à partir de photos lors du téléchargement via un safari mobile. J'ai remarqué le même comportement avec une nouvelle installation de:

  • Opera mini
  • Chrome
  • Mercure

Donc, mon hypothèse est que le comportement n'est pas lié au navigateur, mais à l'application de la caméra lors du transfert de la photo vers une autre application (non autorisée par Apple).

Quelqu'un a-t-il trouvé une déclaration officielle d'Apple concernant cette suppression de données Exif?

0
Robin

J'ai également un problème similaire lors de la copie d'un iPhone (le combo iOS/iPhone n'a pas d'importance, car cela se produit depuis des années) sur une machine Windows 7 (également testée sur différentes machines). Si je copie un fichier jpg du téléphone sur le PC, une grande partie des images voient leurs informations EXIF ​​supprimées. Ce qui est très gênant lorsque les horodatages et les informations GPS s'égarent. Ce qui est encore plus étrange, c'est que je puisse récupérer la 'Date prise' si je visualise le jpg dans la galerie de photos de MS et que je regarde le timbre de prise de date de l'image qui est toujours présent. Ceci est un comportement plus étrange par-dessus un comportement étrange et très ennuyeux pour démarrer . Vous ne devez faire aucune rotation sur les images ou toute autre édition, sinon après le correctif PG ou vous ne pourrez pas récupérer la date prise timbre.

Pour plus d'informations: iTunes n'est pas installé car cela entraîne d'autres problèmes non liés.

Donc, pour récapituler - iPhone connecté à un PC, copier des fichiers jpg via l’Explorateur Windows et certains fichiers vont apparemment perdre leurs informations EXIF.

0
Cyclonique