martes, 4 de septiembre de 2018

Editando fecha EXIF de muchas fotos en bloque

No sé si todo el mundo es tan manazas con la fotografía como yo, pero me suele pasar a menudo que tengo fotos sin metadatos de fecha (las típicas que te pasan por Whatsapp, o capturas de pantalla, escaneados,...)

El siguiente script (en Python) recorre recursivamente un directorio y para cada foto que se encuentra, busca si tiene un dato de fecha de creación en los metadatos EXIF.

Si no lo tiene, y el formato del nombre del fichero es del tipo *yyyymmdd*, añade una fecha en los datos EXIF de la foto basada en el nombre del fichero.

#!/usr/bin/env python3

import sys, os, re, piexif


if len(sys.argv) < 2:
    print ("Usage:", __file__ , "DIRECTORY")
    sys.exit(1)


date_tag = piexif.ExifIFD.DateTimeOriginal
exif_key = 'Exif'
regexp = re.compile(r'\b(20(\d{6}))\b') 

if os.path.isdir(sys.argv[1]):
    base_dir = os.path.abspath(sys.argv[1])
    #print ("Searching photos in ", base_dir)
    for root, dirs, files in os.walk(base_dir):
        for f in files:
            full_path = os.path.join(root, f)
            filename, ext = os.path.splitext(full_path)
            if ext.lower() in ('.jpg', '.jpeg'):
                try:
                    exif_data = piexif.load(full_path) 
                    if not date_tag in exif_data[exif_key]:
                        # print ("No date-time data for", full_path)
                        match = regexp.search(filename)
                        if match:
                            new_date = "%s:%s:%s 00:00:00" % (match[0][:4], match[0][4:6], match[0][6:])
                            #print ("The file", full_path, "seems to have a date-time", match[0], "=>", new_date)
                            exif_data[exif_key][date_tag] = new_date
                            exif_bytes = piexif.dump(exif_data)
                            try:
                                piexif.insert(exif_bytes, full_path)
                                print ('"'+full_path+'" modified with date-time', new_date)
                            except Exception as e2:
                                print (e2)                      

                except Exception as e1:
                    pass
                    #print ("Error reading", full_path, "Corrupted file?")


else:
    print (sys.argv[1], "is not a valid directory.")
    sys.exit(1)

Es especialmente interesante el módulo piexif, no lo conocía. Funciona un poco a bajo nivel, pero para hacer estas manipulaciones rápidas va muy bien.

No hay comentarios:

Publicar un comentario