Lecture des métadonnées

Dans une image, quelles informations sont disponibles ?
L’Exchangeable image file format ou EXIF est une spécification de format de fichier pour les images utilisées par les appareils photographiques numériques.

Il a été établi par le Japan Electronic Industry Development Association (JEIDA). Cette spécification repose sur des formats existants tels que JPEG, TIFF version 6.0 et RIFF format de fichier audio WAVE, en y ajoutant des balises de métadonnées. L’Exif n’est pas supporté avec les formats JPEG 2000 ou PNG (avant la version 1.5.0).

Un “set” sera évidemment intégré aux images RAW, où il prend encore plus d’importance.

La dernière norme fournit une bonne quantité d’informations, facilement accessible par un outil (indépendant) du type exiftool

Afin de pouvoir utiliser cet excellent outil sous Python, il y a deux solutions a) utiliser le “Wrapper” PyExifTool, que je n’ai jamais réussi à faire fonctionner sous Windows…
b) faire le “bourrin” avec une commande lancée sur os.popen (rudimentaire, mais fonctionne :-))

import os
#rem exiftool.exe est déposé dans une subdir accessible par PATH

def ExtractExif(fnin):
    stream = os.popen('exiftool '+fnin)
    output = stream.read()
    exif = {}
    lignes = output.splitlines()

    for ligne in lignes:
        elem = ligne.split(":")
        tag = elem[0];strip()
        value= elem[1]
        for v in range(2,len(elem)-1):
            value = value + ":"+str(v)
        exif[tag] = value.strip()
    
    with open(fnin+"_exif.txt", 'w') as f:
        f.write("Exif of : "+fnin+"\n")
        for x in exif:
            line=str(x)+":"+str(exif[x])+ "\n"                
            f.writelines(line)
    f.close()   
    return exif

Voilà, la fonction renvoie un dictionnaire avec tous les tags présents dans un fichier indiqué + écrit un fichier texte avec le même contenu (sous le path/filename identique à l’image, à l’extension près).

Exif of : D:\$python\PSNR\Capture_ReadNoise\Offset_100iso.ARW
ExifTool Version Number         : 11.99
File Name                       : Offset_100iso.ARW
Directory                       : D
File Size                       : 12 MB
File Modification Date/Time     : 2020:2:3:4:5
File Access Date/Time           : 2020:2:3:4:5
File Creation Date/Time         : 2020:2:3:4:5
File Permissions                : rw-rw-rw-
File Type                       : ARW
File Type Extension             : arw
MIME Type                       : image/x-sony-arw
Exif Byte Order                 : Little-endian (Intel, II)
Image Description               : 
Orientation                     : Horizontal (normal)
White Point                     : 0.313 0.329
Primary Chromaticities          : 0.64 0.33 0.21 0.71 0.15 0.06
Image Width                     : 4288
Image Height                    : 2848
Bits Per Sample                 : 12
Compression                     : Sony ARW Compressed
etc
etc...

Si on a désormais besoin d’un Exif dans un traitement d’image,
exiflist = ExtractExif(fn)

fournira le tag intéressant dans le dictionnaire exiflist, par exemple
exiflist[‘Light Value’]

Il est a remarque que le “niveau” de détails pour être affiné selon les paramètres appliqués à l’invocation de exiftool.

Ici, on est au niveau le plus bas, donc certains tag sont directement interprétés.

Ex : exiflist[‘Sony Raw File Type’] donnera “Sony Compressed RAW”

Alors que si on lit la “bible” de https://exiftool.org/TagNames/EXIF.html pour en savoir plus sur ce domaine… On y trouvera pour le même tag :

0x7000SonyRawFileTypeno0 = Sony Uncompressed 14-bit RAW
1 = Sony Uncompressed 12-bit RAW
2 = Sony Compressed RAW
3 = Sony Lossless Compressed RAW

L’appel de exiftool avec de nombreux paramètres (tel que “-s” ) permettra de “creuser” le résultat voulu, des exemples :

exiftool -a -u -g1 a.jpg
Print all meta information in an image, including duplicate and unknown tags, sorted by group (for family 1).

exiftool -common dir
Print common meta information for all images in dir.

exiftool -s -ImageSize -ExposureTime b.jpg
Print ImageSize and ExposureTime tag names and values.

exiftool -l -canon c.jpg d.jpg
Print standard Canon information from two image files.

exiftool -r -w .txt -common pictures
Recursively extract common meta information from files in pictures directory, writing text output into files with the same names but with a .txt extension.

exiftool -p ‘$filename has date $dateTimeOriginal’ -q -f dir
Print one line of output containing the file name and DateTimeOriginal for each image in directory dir.

exiftool -b -ThumbnailImage image.jpg > thumbnail.jpg
Save thumbnail image from image.jpg to a file called thumbnail.jpg.

exiftool -b -PreviewImage 118_1834.JPG > preview.jpg
Extract preview image from JPG file and write it to preview.jpg.

exiftool -b -JpgFromRaw -w _JFR.JPG -ext CRW -r .
Recursively extract JPG image from all Canon CRW files in the current directory, adding _JFR.JPG for the name of the output JPG files.

exiftool -d ‘%r %a, %B %e, %Y’ -DateTimeOriginal -S -s *.jpg
Print formatted date/time for all JPG files in a directory.

Etc, etc,… Consultez les sites suivants pour en savoir plus…

https://exiftool.org/examples.html

https://ninedegreesbelow.com/photography/exiftool-commands.html

http://web.mit.edu/jhawk/mnt/cgs/Image-ExifTool-6.99/html/exiftool_pod.html