De nos jours, un grand nombre d’applications et de services Web utilisent les données EXIF des images pour les manipuler et les traiter en conséquence. Cependant, l’extraction des données EXIF d’une image n’est pas une tâche simple et il existe de nombreux formats et ensembles de données avec lesquels il faut composer. Voici un blog qui examine certaines des méthodes les plus utilisées pour extraire les données EXIF d’une image à l’aide de Python.

Qu’est-ce que les données EXIF ?

Les données EXIF sont une forme de métadonnées qui sont intégrées dans de nombreuses images numériques. Elles contiennent diverses informations sur l’image, telles que la date et l’heure de la prise de vue, les paramètres de l’appareil photo utilisé et les coordonnées GPS de l’endroit où l’image a été prise. Ces informations peuvent être très utiles pour retrouver la source d’une image ou pour déterminer le contexte dans lequel elle a été prise.

Méthode 1 : utiliser la bibliothèque de pil

Conditions préalables :

PIL : La bibliothèque Pil est une bibliothèque Python qui permet à l’utilisateur de créer, manipuler et convertir des images. La bibliothèque est basée sur la bibliothèque Pillow et fournit une gamme de fonctions de traitement et de manipulation d’images. La bibliothèque est écrite en C et est disponible pour Windows, Linux et macOS.

pip install pil

Code:

Importez toutes les dépendances

from PIL import Image
from PIL.ExifTags import TAGS

Ici, nous ajoutons le chemin de l’image et ouvrons ensuite cette image avec pil.

Note : Cette méthode ne fonctionne que sur les fichiers jpg, alors utilisez-la uniquement.

imagename = 'photo2.jpg'
image = Image.open(imagename)

Avant d’extraire les données EXIF d’une image, nous devons d’abord essayer d’acquérir quelques connaissances sur celle-ci. Pour ce faire, nous pouvons utiliser la bibliothèque pillow pour découvrir certains attributs de l’objet image. Commençons par les imprimer.

# getting the basic metadata from the image
info_dict = {
    "Filename": image.filename,
    "Image Size": image.size,
    "Image Height": image.height,
    "Image Width": image.width,
    "Image Format": image.format,
    "Image Mode": image.mode,
    "Image is Animated": getattr(image, "is_animated", False),
    "Frames in Image": getattr(image, "n_frames", 1)
}

for label,value in info_dict.items():
    print(f"{label:25}: {value}")

Sortie :

Extrayons maintenant les données EXIF d’une image en utilisant Python et la fonction getexif().

 exifdata = image.getexif()

Le problème est que la variable de données EXIF ne renvoie que des noms de champs sous forme d’entiers au lieu de valeurs lisibles par l’homme. Nous devrons utiliser les données de notre tableau de données d’image pour récupérer les noms de champ corrects pour notre projet.

# iterating over all EXIF data fields
for tag_id in exifdata:
    tag = TAGS.get(tag_id, tag_id)
    data = exifdata.get(tag_id)
    # decode bytes
    if isinstance(data, bytes):
        data = data.decode()
    print(f"{tag:25}: {data}")

Sortie :

Vous pouvez y voir une liste d’informations sur l’image, comme le modèle, le logiciel, la date et l’heure de la prise de vue, etc.

Méthode 2 : utiliser la bibliothèque EXIF

Conditions préalables :

EXIF : La bibliothèque EXIF pour Python est un excellent outil pour extraire les données EXIF d’une image à l’aide de Python. Grâce à cette bibliothèque, vous pouvez facilement accéder à toutes les métadonnées associées à une photo, notamment la date et l’heure de la prise de vue, les paramètres de l’appareil photo utilisé et l’emplacement de la photo. Ces informations peuvent être très utiles lorsque vous essayez d’organiser et de gérer vos photos numériques. Pour installer la bibliothèque EXIF, utilisez la commande suivante :

pip install exif

Code:

Tout d’abord, ouvrons l’image dans la bibliothèque EXIF.

from exif import Image

img_path = 'random2.jpg'
with open(img_path, 'rb') as src:
    img = Image(src)
    print (src.name, img)

Sortie :

Maintenant que nous avons chargé notre image, voyons ce que contiennent les données EXIF dans notre image.

print(img.list_all())

Sortie :

Comme vous pouvez le constater, nous avons beaucoup de données EXIF dans cette image particulière. Par exemple, nous allons extraire la date et l’heure de l’image en utilisant la méthode get.

print(f' Date and Time: {img.get("datetime")}')

Sortie :

Extraire l’emplacement de l’image :

Pour extraire l’emplacement de l’image, nous devons d’abord extraire la longitude, la latitude et la référence de l’image.

from exif import Image

img_path = 'random2.jpg'
with open(img_path, 'rb') as src:
    img = Image(src)

# getting the Longitude and latitude data
print(f' Longitude data: {img.get("gps_longitude")}')
print(f' latitude data: {img.get("gps_latitude")}')
# getting the Longitude  and latitude Reference data is also very important when converting the Decimal degrees formen
print(f' Longitude data reference : {img.get("gps_longitude_ref")}')
print(f' latitude data reference : {img.get("gps_latitude_ref")}')

Sortie :

Ces données sont actuellement au format degrés, minutes et secondes (DMS). Nous devons donc les convertir au format degrés décimaux (DD).

from exif import Image

img_path = 'random2.jpg'
with open(img_path, 'rb') as src:
    img = Image(src)

def decimal_coords(coords, ref):
    decimal_degrees = coords[0] + \
                      coords[1] / 60 + \
                      coords[2] / 3600
    if ref == "S" or ref == "W":
        decimal_degrees = -decimal_degrees 
    return decimal_degrees

def image_coordinates(image_path):
    with open(img_path, 'rb') as src:
        img = Image(src)
    if img.has_exif:
        try:
            img.gps_longitude
            coords = (decimal_coords(img.gps_latitude,
                      img.gps_latitude_ref),
                      decimal_coords(img.gps_longitude,
                      img.gps_longitude_ref))
        except AttributeError:
            print('No Coordinates')
    else:
        print('The Image has no EXIF information')
    print(f"Image {src.name}, OS Version:{img.get('software', 'Not Known')} ------")
    print(f"Was taken: {img.datetime_original}, and has coordinates:{coords}")

image_coordinates(img_path)

Regardons l’explication du code :

  1. Importez la dépendance
  2. Chargement de l’image dans le module EXIF
  3. Création d’une fonction pour convertir les coordonnées en format degrés décimaux (DD).
  4. Nous avons ensuite créé une autre fonction pour imprimer les coordonnées au format degrés décimaux (DD) avec quelques métadonnées supplémentaires sur l’image.

Sortie :

Et voilà, nous avons maintenant nos coordonnées en degrés décimaux et si vous voulez les utiliser, il suffit de les copier et de les coller dans Google Maps.

Le mot de la fin

Dans cet article de blog, nous avons exploré deux méthodes différentes pour extraire vos données EXIF. La première consiste à utiliser la bibliothèque d’imagerie Python, qui est un outil formidable mais qui ne peut extraire que certains types d’informations. La deuxième méthode consiste à utiliser la bibliothèque EXIF, qui est assez avancée et offre beaucoup plus d’options que la bibliothèque Python. Les données de la bibliothèque EXIF contiennent également les coordonnées de l’emplacement de l’image, ce qui est idéal pour tout type de géo-analyse ou simplement pour cartographier l’endroit où l’image a été prise. J’espère que ce blog vous a plu. Si vous avez d’autres questions, n’hésitez pas à nous contacter. Merci de votre lecture !