La lecture des données GPS à partir de l'image renvoyée par la caméra dans iOS iphone
J'ai besoin d'obtenir les coordonnées GPS d'une image prise avec l'appareil iOS de l'appareil photo. Je ne m'inquiète pas à propos de la pellicule d'images, juste de l'image prise avec UIImagePickerControllerSourceTypecamera.
J'ai lu beaucoup de stackoverflow réponses, comme Obtenir les données Exif des UIImage - UIImagePickerController, qui suppose que vous utilisez le AssetsLibrary cadre, ce qui ne semble pas fonctionner sur les images de la caméra, ou de l'utilisation CoreLocaiton pour obtenir la latitude et de la longitude à partir de l'application elle-même, et pas à partir de l'image.
À l'aide de CoreLocation n'est pas une option. Qui ne veut pas me donner les coordonnées lorsque le déclencheur a été enfoncé. (Avec la CoreLocation des solutions basées sur, vous avez besoin soit d'enregistrer les coordonnées avant de l'amener jusqu'à la vue de la caméra ou après, et bien sûr, si l'appareil est en mouvement, les coordonnées seront fausses. Cette méthode devrait fonctionner avec un appareil stationnaire.)
Je suis iOS5 seulement, je n'ai pas besoin de soutenir les anciens appareils. C'est aussi un produit commercial donc je ne peut pas utiliser http://code.google.com/p/iphone-exif/.
Alors, quelles sont mes options pour la lecture des données GPS à partir de l'image renvoyée par la caméra dans iOS5? Tout ce que je peux penser est d'enregistrer l'image sur pellicule, puis utiliser la AssetsLibrary, mais qui semble à l'eau de rose.
Merci!
Voici le code que j'ai écrit basé sur Caleb réponse.
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
NSData *jpeg = UIImageJPEGRepresentation(image,1.0);
CGImageSourceRef source ;
source = CGImageSourceCreateWithData((__bridge CFDataRef)jpeg, NULL);
NSDictionary *metadataNew = (__bridge NSDictionary *) CGImageSourceCopyPropertiesAtIndex(source,0,NULL);
NSLog(@"%@",metadataNew);
et ma Console affiche:
2012-04-26 14:15:37:137 ferret[2060:1799] {
ColorModel = RGB;
Depth = 8;
Orientation = 6;
PixelHeight = 1936;
PixelWidth = 2592;
"{Exif}" = {
ColorSpace = 1;
PixelXDimension = 2592;
PixelYDimension = 1936;
};
"{JFIF}" = {
DensityUnit = 0;
JFIFVersion = (
1,
1
);
XDensity = 1;
YDensity = 1;
};
"{TIFF}" = {
Orientation = 6;
};
}
Aucune latitude/longitude.
- Vous avez trouvé la bonne réponse? Comment avez-vous résoudre ce problème? Je ne veux pas utiliser CoreLocation ni ce cadre, code.google.com/p/iphone-exif . Est-ce la seule solution pour sauver de la bobine de la caméra, puis l'extraire avec les données gps?
Vous devez vous connecter pour publier un commentaire.
Le problème est que depuis iOS 4
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
bandes de la géolocalisation out. Pour résoudre ce problème, vous devez utiliser la photo originale de chemin d'accès pour accéder à l'intégralité de métadonnées de l'image. Avec quelque chose comme ceci:La sortie doit être quelque chose comme:
info[UIImagePickerControllerReferenceURL]
estnil
pour les photos prises avec leUIImagePickerController
de l'appareil-photo.Nous avons beaucoup travaillé avec l'appareil photo et
UIImagePickerController
et, au moins jusqu'à et y compris l'iOS 5.1.1, on ne renvoie pas les données de localisation dans les métadonnées, soit des photos ou des vidéos prises avecUIImagePickerController
.Il n'importe pas de savoir si les services de localisation est activé pour l'application Appareil photo ou pas; ce contrôle de l'application Appareil photo de l'utilisation des services de localisation, pas à la fonction appareil photo à l'intérieur de
UIImagePickerController
.Votre application devra utiliser le
CLLocation
classe pour obtenir l'emplacement, puis l'ajouter à l'image ou de la vidéo retourné à partir de la caméra. Si votre application peut obtenir l'emplacement dépend de si l'utilisateur autorise l'accès à des services de localisation de votre application. Et de noter que l'utilisateur peut désactiver les services de localisation de votre application (ou entièrement de l'appareil) à tout moment viaSettings > Location
Services.Vous n'êtes pas en utilisant les données d'image de la caméra dans le code que vous avez posté, vous avez généré un JPEG représentation de celui-ci, qui aurait essentiellement pour effet d'annuler toutes les métadonnées. Utilisation
image.CGImage
comme Caleb suggéré.Aussi:
L'auteur assez précise clairement que les licences commerciales est disponible.
Une possibilité est de laisser CoreLocation en cours d'exécution lorsque l'appareil photo est visible. Enregistrer chaque CCLocation dans un tableau avec la durée de l'échantillon. Lorsque la photo est de retour, à trouver son temps, puis le match le plus proche CClocation de la matrice.
Sons encombrants, mais cela va fonctionner.
Peut pas dire que j'ai eu besoin de faire exactement cela dans ma propre substance, mais à partir de la documentation, il semble assez clair que si vous utilisez
UIImagePickerController
vous pouvez obtenir l'image que l'utilisateur a juste pris de l'-imagePicker:didFinishPickingMediaWithInfo:
délégué de la méthode. L'utilisation de la toucheUIImagePickerControllerOriginalImage
pour obtenir l'image.Une fois que vous avez l'image, vous devriez être en mesure d'accéder à ses propriétés, y compris les données EXIF, comme décrit dans QA1654 Accéder aux propriétés de l'image avec ImageIO. Pour créer le CGImageSource, je regarderais
CGImageSourceCreateWithData()
et utiliser les données que vous obtenez à partir de la UIImage deCGImage
méthode. Une fois que vous avez la source de l'image, vous pouvez accéder aux différents attributs viaCGImageSourceCopyProperties()
.En tant que point par Chris Markle, Apple ne se dépouillent les données GPS à partir EXIF. Mais vous pouvez ouvrir les données BRUTES de l'image, et d'analyser les données vous-même ou à un tiers lib pour le faire, pour exemple.
Voici un exemple de code:
Dans votre UIImagePickerController délégué, procédez de la manière suivante:
C'est testé sur iOS 8 et fonctionne pour les vidéos, donc il devrait fonctionner de la même façon pour les photos avec un peu de bricolage.
Swift réponse: