UIImagePickerController et à en extraire les données EXIF des photos existantes
Il est bien connu que UIImagePickerController ne pas renvoyer les métadonnées de la photo après la sélection. Cependant, un couple d'applications dans l'app store (Mobile Fotos, PixelPipe) semblent être en mesure de lire les fichiers d'origine et les données EXIF stockées au sein de eux, ce qui permet à l'application d'extraire les données à partir de la photo sélectionnée.
Ils semblent le faire par la lecture du fichier d'origine de la /private/var/mobile/Media/DCIM/100APPLE/ dossier et en l'exécutant à travers une EXIF de la bibliothèque.
Cependant, je ne peux pas travailler un moyen d'associer une photo retourné à partir de la UIImagePickerController à un fichier sur le disque. J'ai exploré les tailles de fichier, mais le fichier d'origine est un JPEG, tandis que l'image renvoyée est un raw UIImage, rendant impossible de connaître la taille du fichier de l'image qui a été choisie.
J'envisage de faire un tableau de hachages et le rapprochement avec la première de x pixels de chaque image. Cela semble un peu plus haut, cependant, et probablement assez lent.
Des suggestions?
- Avez-vous trouvé une solution ou une autre approche dans le temps de le dire?
- Il semble que la solution que la plupart des gens vont pour se construire leur propre Vue de la Table de sélection de la liste de photos. Mobile Fotos semble avoir accès à la Caméra Sélecteur, mais je ne peux pas savoir comment.
- Cette question est aujourd'hui désuet, car il est désormais possible d'extraire les métadonnées de l'image sous iOS 4.0, à l'aide de la AssetLibrary cadre.
- Pas de son encore pertinents que vous avez pour appuyer les appareils 3g
Vous devez vous connecter pour publier un commentaire.
Avez-vous pris un coup d'oeil à ce exif iPhone bibliothèque?
http://code.google.com/p/iphone-exif/
Vais essayer de mon côté. Je voudrais avoir le GPS (géolocalisation) des coordonnées de l'image qui a été prise avec la UIImagePickerController :/
Après un regard plus profond, cette bibliothèque semble prendre NSData info comme une entrée et le UIImagePickerController renvoie une UIImage après la prise d'un instantané. En théorie, si nous utilisons l'sélectionnés à partir de la UIkit catégorie pour UIImage
Alors nous pouvons convertir les UIImage dans un NSData de l'instance et ensuite l'utiliser avec l'iPhone exif de la bibliothèque.
Mise à JOUR:
J'ai fait un test à la bibliothèque mentionné ci-dessus et il semble fonctionner. Toutefois, en raison de mon peu de knwoledge sur le format EXIF et le manque de haut niveau de l'API de la bibliothèque, je n'arrive pas à obtenir les valeurs pour les données EXIF.
Voici mon code au cas où l'un de vous peut aller plus loin :
La recherche des balises de définition est OK, mais toutes les valeurs de balise renvoie
nil
🙁Dans le cas où vous souhaitez donner un essai à la bibliothèque, vous devez définir une variable globale pour le remettre en marche (comme expliqué dans la doc, mais hum.. :/)
BOOL gLogging = FALSE;
Mise à JOUR 2
Réponse ici : iPhone - accéder aux informations de localisation à partir d'une photo
Une UIImage ne pas encapsuler les informations meta, de sorte que nous sommes coincés : pour sûr, pas EXIF info sera donnée par l'intermédiaire de cette interface.
dernière mise à JOUR
Ok j'ai réussi à le faire fonctionner, au moins pour géolocaliser correctement les images renvoyées par le sélecteur.
Avant le déclenchement de la UIImagePickerController, c'est à vous d'utiliser le CLLocationManager pour récupérer le courant CLocation
Une fois que vous avez cela, vous pouvez utiliser cette méthode qui utilise exif-iPhone bibliothèque de géolocaliser les UIImage de la CLLocation :
Cela fonctionne avec iOS5 (beta 4) et la pellicule (vous avez besoin de type defs pour les blocs dans le .h):
Il y a un moyen de
iOS 8
Sans l'aide d'un 3ème partie
EXIF
de la bibliothèque.Apple a ajouté une Image I/O dans le Cadre de l'iOS4 qui peut être utilisé pour lire les données EXIF des photos. Je ne sais pas si le
UIImagePickerController
retourne un tableau avec les données EXIF intégrées si.Edit: En iOS4 vous pouvez extraire les données EXIF, en saisissant la valeur de la
UIImagePickerControllerMediaMetadata
clé dans l'info dictionnaire qui est passé à laUIImagePickerControllerDelegate
délégué.UIImagePickerControllerMediaMetadata
dans le délégué de rappel de l'info dictionnaire. C'estnil
.J'ai eu une question similaire où je voulais juste la date à laquelle une photo a été prise et aucune de ces semblent résoudre mon problème d'une manière simple (par exemple, pas de bibliothèques externes), voici donc toutes les données que j'ai pu trouver ce qui vous permet d'extraire d'une image après l'avoir sélectionné avec le sélecteur:
Ainsi, lorsque vous sélectionnez une image, vous obtenez un résultat qui ressemble à ceci (y compris la date!):
De toute façon, j'espère que ça sauve quelqu'un d'autre peu de temps.
Je passe un certain temps à travailler sur ce point aussi, pour une application j'ai été conclu le contrat de construction. Fondamentalement, comme l'API actuelle, il n'est pas possible. Le problème de base est le UIImage classe des BANDES de toutes les données EXIF, sauf pour l'orientation de sortir. Aussi la fonction pour enregistrer dans la pellicule des bandes de ces données. Donc, fondamentalement, la seule façon de saisir et de maintenir supplémentaire des données EXIF qui est de l'enregistrer dans un cadre " privé "camera roll" dans votre application. J'ai déposé ce bug avec apple ainsi et a souligné la nécessité de l'application de l'examinateur de répétitions, nous avons été en contact avec. J'espère qu'un jour ils vont l'ajouter dans.. Sinon il fait d'avoir la GÉO-tagging complètement inutile car il ne fonctionne que dans le "stock" de l'application appareil photo.
NOTE de Certaines applications sur l'app store hack autour de ce. Par ce que j'ai trouvé, accédant directement à la bobine de caméra et ENREGISTREMENT de photos directement à enregistrer les données GEO. Toutefois, cela ne fonctionne qu'avec la camera roll/sauvegarder des photos et PAS le reste de la bibliothèque de photos. Les photos "synchronisés" de votre téléphone à partir de votre ordinateur toutes les données EXIF, sauf pour l'orientation dépouillé.
Je n'arrive toujours pas à comprendre pourquoi ces demandes ont été approuvées (heck ils même de les SUPPRIMER à partir de la pellicule) et notre application qui ne fait rien de cela n'est encore freinée.
Pour iOS 8 et les versions ultérieures vous pouvez utiliser Photos-Cadre.
C'est quelque chose que l'API publique ne prévoit pas, mais pourrait être utile à beaucoup de gens. Votre principal recours est de fichier un bug avec Apple qui décrit ce qu'il vous faut (et il peut être utile d'expliquer pourquoi vous avez besoin en tant que bien). Nous espérons que votre demande pourrait le faire dans une version future.
Après le dépôt d'un bug, vous pouvez également utiliser l'un des Développeurs de l'assistance Technique (DTS) les incidents qui sont venus avec votre iPhone Developer Program adhésion. Si il y a un public pour ce faire, une Pomme ingénieur savoir. Sinon, il peut au moins aider à obtenir votre sort un peu plus d'attention dans le vaisseau-mère. Bonne chance!
Utiliser le
UIImagePickerControllerMediaURL
dictionnaire clé pour obtenir l'URL du fichier dans le fichier d'origine. En dépit de ce que dit la documentation, vous pouvez obtenir le fichier d'URL pour les photos et pas seulement des films.Vous pourriez être en mesure de hachage des données de l'image renvoyée par la UIImagePickerController et les images dans le répertoire et de les comparer.
Juste une pensée, mais avez-vous essayé TTPhotoViewController dans le Three20 projet sur GitHub?
Qui fournit une image de sélecteur qui permet de lire à partir de plusieurs sources. Vous pouvez être en mesure de l'utiliser comme une alternative à UIImagePickerController, ou de la source peut vous donner une idée de comment faire pour obtenir l'info dont vous avez besoin.
Est-il une raison spécifique que vous souhaitez extraire les données de localisation à partir de l'image? Une alternative pourrait être d'obtenir l'emplacement séparément à l'aide du framework CoreLocation. Si c'est uniquement les données dont vous avez besoin, cela pourrait vous éviter quelques maux de tête.
il semble que la photo atteint par UIImagePickerControllerMediaURL n'ont pas de balises exif à tous les
Afin d'obtenir cette métadonnées que vous aurez à utiliser le niveau inférieur du cadre AVFoundation.
Prendre un coup d'oeil à Apple Squarecam exemple (http://developer.apple.com/library/ios/#samplecode/SquareCam/Introduction/Intro.html)
Trouver la méthode ci-dessous et ajoutez la ligne, j'ai ajouté le code. Les métadonnées dictionnaire retourné contient également un diagnostic NSDictionary objet.
Je suis en utilisant ce pour la pellicule des images
Il fonctionne, évidemment, si l'image contient des gps méta-informations
Espère que cela aide
C'est dans Swift 3 si vous voulez encore de support pour iOS 8:
Pour iOS 10 - Swift 3
Le sélecteur de rappel du a un
info
dict où il y a une touche avec les métadonnées:UIImagePickerControllerMediaMetadata
La coquine la façon de le faire est de traverser le UIImagePickerViewController de vues et de choisir l'image sélectionnée dans la délégué de rappel.
Qui va vous donner le chemin vers l'image en taille réelle, que vous pouvez ouvrir avec une EXIF de la bibliothèque de votre choix.
Mais, cela appelle une API Privée et ces noms de méthode sera être détecté par Apple, si vous soumettez cette application. Donc, ne fais pas ça, OK?