Pillow Exifs GPS

a marqué ce sujet comme résolu.

Bonjour,

Je cherche à retrouver les coordonnées GPS de la prise d’une photo à partir de ses Exifs.

Voici le code que j’utilise :

from PIL import Image
from PIL.ExifTags import TAGS

img = Image.open("mon image.jpg")

exifs = img.getexif()

gps_tag = ""

for key, value in TAGS.items():
    if value == "GPSInfo":
        gps_tag = key

gps = exifs[gps_tag]

print(gps)

Je n’ai pas spécialement d’erreur, mais j’obtiens un nombre entier (201008) dont je ne sais pas quoi faire…

Merci d’avance pour votre aide,

@flopy78

:S

C’est embêtant. Je ne trouve pas beaucoup d’explication sur la valeur de ce champ mais clairement il n’est pas clair. Il semble que ça soit juste un indice (offset) qui mène à la valeur que tu dois parser toi-même.

Peu pratique.

Essaye plutôt quelque chose qui ressemble à ça :

import sys
from PIL import Image
from PIL.Image import Exif
from PIL.ExifTags import TAGS, GPSTAGS

def get_exif(file_name) -> Exif:
    image :Image.Image = Image.open(file_name)
    return image.getexif()


def get_geo(exif):
    gps_data = {}
    for key, value in TAGS.items():
        if value == "GPSInfo":
            gps_info = exif.get_ifd(key)
            gps_data = {
                GPSTAGS.get(key, key): value
                for key, value in gps_info.items()
            }

    return gps_data

if __name__ == '__main__':
    exif = get_exif(sys.argv[1])
    geo = get_geo(exif)
    print(geo)

Source: Ce billet github (j’ai mis une ancre sur le commentaire pertinent).

J’ai fait le test sur cette image et j’obtiens ça:

{'GPSVersionID': b'\x02\x03\x00\x00', 'GPSLatitudeRef': 'N', 'GPSLatitude': (50.0, 49.0, 8.592), 'GPSLongitudeRef': 'W', 'GPSLongitude': (0.0, 8.0, 12.45), 'GPSAltitudeRef': b'\x00', 'GPSAltitude': 0.0, 'GPSStatus': 'A'}

Je suppose que ça marchera également chez toi.

+0 -0
import sys
from PIL import Image
from PIL.Image import Exif
from PIL.ExifTags import TAGS, GPSTAGS

def get_exif(file_name) -> Exif:
    image :Image.Image = Image.open(file_name)
    return image.getexif()


def get_geo(exif):
    gps_data = {}
    for key, value in TAGS.items():
        if value == "GPSInfo":
            break
            gps_info = exif.get_ifd(key)
            gps_data = {
                GPSTAGS.get(key, key): value
                for key, value in gps_info.items()
            }

    return gps_data

if __name__ == '__main__':
    exif = get_exif(sys.argv[1])
    geo = get_geo(exif)
    print(geo)

Ce billet github (j’ai mis une ancre sur le commentaire pertinent).

N’y a-t-il pas un petit problème d’indentation dans le code tel que tu l’as posté ? Ligne 15, le break ne permet pas aux instructions qui suivent d’être exécutées 😬

Ah oui tout à fait, il faut retirer le break. Ça m’apprendra à ne pas faire de copier/coller. J’ai adapté le code de manière à retourner {} quand il n’y a pas de donnée GPS et j’ai voulu faire la modification ici et dans mon code mais je l’ai mal faite ici.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte