Extraire les métadonnées d’image en Python

Découvrez comment vous pouvez extraire des métadonnées d’image telles que des informations GPS, la marque de la caméra, le modèle et bien plus encore en utilisant le format de fichier d’images interchangeables (EXIF) dans Python avec la bibliothèque d’oreillers.

Dans ce tutoriel, vous apprendrez comment vous pouvez extraire des métadonnées utiles dans les images en utilisant la bibliothèque Pillow de Python.

Les appareils tels que les appareils photo numériques, les smartphones et les scanners utilisent la norme EXIF pour sauvegarder des images ou des fichiers audio. Cette norme contient de nombreuses étiquettes utiles à extraire, ce qui peut être utile pour l’investigation médico-légale, comme la marque et le modèle de l’appareil, la date et l’heure exactes de la création de l’image, et même les informations GPS sur certains dispositifs.

Veuillez noter qu’il existe des outils gratuits pour extraire des métadonnées telles que ImageMagick ou ExifTool sur Linux, le but de ce tutoriel est d’extraire des métadonnées avec le langage de programmation Python.

Pour commencer, vous devez installer la bibliothèque d’oreillers:

$ pip3 install Pillow

Ouvrez un nouveau fichier Python et suivez-le:

from PIL import Image
from PIL.ExifTags import TAGS

Maintenant, cela ne fonctionnera que sur les fichiers d’images JPEG, prenez n’importe quelle image que vous avez prise et le testera pour ce tutoriel (si vous voulez tester sur mon image, vous le trouverez dans le dépôt du tutoriel):

#chemin d'accès à l'image ou à la vidéo
imagename = "image.jpg"

#lire les données d'image en utilisant PIL
image = Image.open(imagename)

Nous avons chargé l’image en utilisant la méthode Image.open(). Avant d’appeler la fonction getexif(), la bibliothèque pillow a quelques attributs sur l’objet image; imprimons-les:

#extraire d'autres métadonnées de base
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}")

Maintenant, appelons le getexif()Méthode sur l’image qui retourne des métadonnées d’image:

#extraire les données EXIF
exifdata = image.getexif()

Le problème avec exifdataLa variable maintenant est que les noms de champ sont justes des ID, pas un nom de champ lisible par l’homme, c’est pourquoi nous allons avoir besoin du dictionnaire TAGS du module PIL.ExifTags, qui cartographie chaque étiquette ID en un texte lisible par l’homme:

#itérer sur tous les champs de données EXIF
for tag_id in exifdata:
    #obtenir le nom de la balise, au lieu de l'identifiant de la balise illisible par l'homme
    tag = TAGS.get(tag_id, tag_id)
    data = exifdata.get(tag_id)
    #décoder les octets
    if isinstance(data, bytes):
        data = data.decode()
    print(f"{tag:25}: {data}")

Voici ma sortie :

Filename                 : .\image.jpg
Image Size               : (5312, 2988)       
Image Height             : 2988
Image Width              : 5312
Image Format             : JPEG
Image Mode               : RGB
Image is Animated        : False
Frames in Image          : 1
ExifVersion              : 0220
ShutterSpeedValue        : 4.32
ApertureValue            : 1.85
DateTimeOriginal         : 2016:11:10 19:33:22
DateTimeDigitized        : 2016:11:10 19:33:22
BrightnessValue          : -1.57
ExposureBiasValue        : 0.0
MaxApertureValue         : 1.85
MeteringMode             : 3
Flash                    : 0
FocalLength              : 4.3
ColorSpace               : 1
ExifImageWidth           : 5312
FocalLengthIn35mmFilm    : 28
SceneCaptureType         : 0
ImageWidth               : 5312
ExifImageHeight          : 2988
ImageLength              : 2988
Make                     : samsung
Model                    : SM-G920F
Orientation              : 1
YCbCrPositioning         : 1
XResolution              : 72.0
YResolution              : 72.0
ImageUniqueID            : A16LLIC08SM A16LLIL02GM

ExposureProgram          : 2
ISOSpeedRatings          : 640
ResolutionUnit           : 2
ExposureMode             : 0
FlashPixVersion          : 0100
WhiteBalance             : 0
Software                 : G920FXXS4DPI4
DateTime                 : 2016:11:10 19:33:22
ExifOffset               : 226
MakerNote                : 0100 
                                Z@P
UserComment              :
ExposureTime             : 0.05
FNumber                  : 1.9

Un tas de choses utiles; en regardant rapidement le modèle, j’ai conclu que cette image a été prise par un Samsung Galaxy S6. Exécutez ceci sur des images qui ont été capturées par d’autres appareils, et vous verrez différents (peut-être plus) champs.

D’accord, nous avons fini. Un bon défi pour vous est de télécharger toutes les images à partir d’une URL et d’exécuter le script de ce tutoriel sur chaque image que vous trouvez et d’étudier les résultats intéressants.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *