The first problem that occurred to us is that the global image namespace was not continuous (5 different cameras / cellphones with the ability to take photos), and sorting images by their generated names did not solve the it.
Next we tried sorting the images by the file modification date - this was a reasonable approach, but there a few photos which were rotated after fetching them from the memory card causing their modification date to be inadequate for the mentioned problem. Furthermore 2 cameras were configured with an incorrect date / time value.
A few years ago I was implementing an EXIF tag viewer for images, and I remembered that there are tags that store the original image creation time (and quite a few other parameters). I made some research and located a library with python bindings that handles these tags well: pyexiv2.
You may install it using apt-get:
~ $ apt-get install python-pyexiv2
Next I implemented a simple script updates file names so they can be sorted lexicographically according to the real creation time, have a look at the following code:
import pyexiv2 import sys import os import shutil import datetime from dateutil.relativedelta import relativedelta class ExifSort(): @classmethod def _test_extenstion(cls, filename): return filename.split(".")[-1].lower() in ['jpg','jpeg','png'] @classmethod def sort_images(cls, path, prefix=None): files = [] for file in os.listdir(path): if not cls._test_extenstion(file): continue metadata = pyexiv2.ImageMetadata(os.path.join(path, file)) metadata.read() try: d = metadata['Exif.Photo.DateTimeOriginal'].value if metadata['Exif.Image.Make'].value == 'Canon': d+=datetime.timedelta(days=1) elif metadata['Exif.Image.Make'].value == 'FUJIFILM': d += relativedelta(years=1) d -= datetime.timedelta(hours=39) files.append((file, d, )) except: print file continue files.sort(key=lambda x: x[1]) mag = len(str(len(files))) counter = 1 tmp_prefix = "tmp_" for data in files: shutil.move(os.path.join(path, data[0]), os.path.join(path, tmp_prefix + data[0])) for data in files: ext = data[0].split(".")[-1] shutil.move(os.path.join(path, tmp_prefix + data[0]),\ os.path.join(path, "%s%s.%s" % (prefix or "",\ str(counter).rjust(mag,'0'), ext))) counter += 1 if __name__ == '__main__': try: ExifSort.sort_images(sys.argv[1]) except: print "Usage: %s [directory]" % sys.argv[0] sys.exit(1)
This script iterates all files in a specific directory ( sys.argv[1] ), filters jpg/png files, reads their exif date and stores pairs: filename, creation datetime in an array. Finally the array is sorted using the real creation datetime, and the images are renamed (with or withour a specific prefix).
Lines 22-26 are a specific exception - we had 2 cameras with an incorrect date, so we have to correct the read value so it may be compared with images from other cameras (evaluated empirically) .
~KR
No comments:
Post a Comment