Python exif sous Linux

pyexiv2 logo

Python exif sous Linux :
Lorsque je transfère mes photos depuis mon apn dans un répertoire de mon micro, il arrive fréquemment que les images ne soient pas orientées dans le bon sens.
Je me vois donc dans l’obligation de faire pivoter la photo et de perdre du temps à réaliser ce laborieux travail (n’oublions pas qu’un informaticien se doit d’être feignant…).
D’où l’idée de faire appel à un petit script python pour remettre tout ça dans le bon sens !J’ai dans un premier temps « joué » avec Python Imaging Library (PIL) qui permet (entre autre)  la manipulation des images. Cependant, je me suis rendu compte que cette bibliothèque ne peut pas pivoter une image sans perdre les données EXIF de l’image d’origine. Bref, sauf erreur de ma part, PIL ne semble pas être en mesure de conserver les métadonnées.
Je me suis donc orienté vers la librairie « pyexiv2 » qui permet de réaliser très facilement l’orientation correcte de mes images.

Installation (user root sous Fedora) :

yum install pyexiv2

Voici un script qui prend un paramètre (soit un nom de repertoire, soit un fichier ) puis qui teste l’orientation de l’image, la fait pivoter si nécessaire (en créant un nouveau fichier « good_….. »
1 – On importe les bibliothèque utiles :

#!/usr/bin/python
import glob
import pyexiv2
import sys , os
from shutil import copyfile

2 – Fonctions « get_file » , « fic_rotate » :

def get_file(rep):
""" Parcours le repertoire passé en paramètre afin de
trouver les différentes images """
fics=[]
typFics = [ "/*.jpg" , "/*.JPG" , "/*.png" , "/*.PNG" ]
for fic in [glob.glob( rep + typFic) for typFic in typFics]:
fics+=fic
return fics

def fic_rotate(fics):
"""si l'orientation de l'image est différent de 1,
on fait pivoter l'image.
De plus, on écrit le nom du site web dans les
métadonnées exif (UserComment) """
lstFic=[]
for fic in fics:
img = pyexiv2.ImageMetadata(fic)
img.read()
if int(img['Exif.Image.Orientation'].raw_value) != 1:
ficOut = (os.path.dirname(fic) + "/good_"
+ os.path.basename(fic))
copyfile(fic , ficOut)
lstFic.append(fic)
#on pivote l'image
img = pyexiv2.ImageMetadata(ficOut)
img.read()
img['Exif.Image.Orientation'] = 1
img['Exif.Photo.UserComment'] = 'http://wp.cornillon.org/'
img.write()
return lstFic

3 – Récupération des arguments et traitements des paramètres (fichier ou dossier) :

def main(argv):
"""si argv est un repertoire : on traite l'ensemble des fichiers
du repertoire.
si argv est un fichier : on ne traite que ce fichier
si pas d'argument on ne fait rien
"""
if not argv:
print "Passer au moins un fichier/repertoire en argument !"
exit(0)
for i in argv:
if os.path.isdir(i):
#repertoire
fics = get_file(i)
print fics
print "\nFichiers traités : " , fic_rotate(fics)
elif os.path.isfile(i):
#fichier
print "\nFichier traité : " , fic_rotate([i])
return 0

if __name__ == '__main__':
main(sys.argv[1:])

Aprés avoir rendu ce script executable ( chmod +x exif.py ), il suffit de le lancer en lui passant un argument (fichier ou nom de repertoire).

Ex : ./exif.pl /tmp
Ce script est largement perfectible mais c’est un début afin de réaliser automagiquement
une orientation correcte de mes photos 🙂