Python Exif

Rédigé par Paulo Aucun commentaire
Classé dans : Python Mots clés : exif

 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) :
[bash]
yum install pyexiv2
[/bash]

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):
    fics=[]
    typFics = [ "/*.jpg" , "/*.JPG" , "/*.png" , "/*.PNG" ]
    for fic in [glob.glob( rep + typFic) for typFic in typFics]:
        fics+=fic
    return fics

def get_file_rotate(fics):
    """ Orientation des photos : 
          1: 'Horizontal (normal)',
          2: 'Mirrored horizontal',
          3: 'Rotated 180',
          4: 'Mirrored vertical',
          5: 'Mirrored horizontal then rotated 90 CCW',
          6: 'Rotated 90 CW',
          7: 'Mirrored horizontal then rotated 90 CW',
          8: 'Rotated 90 CCW 
    """
   img = pyexiv2.ImageMetadata(fic)
   img.read()
   orientation = int(img['Exif.Image.Orientation'].raw_value)
   return orientation

def fic_rotate(fics):
   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'] = "paulo"
         img.write()
   return lstFicdef 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 :)
 

Les commentaires sont fermés.