From 2925b8d8b5508e1dbbf0c7ae4af4be371424cc2d Mon Sep 17 00:00:00 2001 From: Jordan Braiuka Date: Wed, 20 May 2015 14:55:34 +1000 Subject: [PATCH 01/10] Will parse exif data from filename, write to exif --- exif2timestream.py | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/exif2timestream.py b/exif2timestream.py index 010e604..2079385 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -5,12 +5,14 @@ from os import path import shutil from sys import exit +import pexif from time import strptime, strftime, mktime, localtime, struct_time, time from voluptuous import Required, Schema, MultipleInvalid from itertools import cycle from inspect import isclass +from PIL import Image import logging - +import datetime # versioneer from _version import get_versions __version__ = get_versions()['version'] @@ -235,19 +237,55 @@ def __call__(self, x): raise e return None +def resize(filename, to_width): + # Open the Image + img = Image.open(filename) + # Calculate new height and width + wpercent = to_width/float(img.size[0]) + vsize = int(float(img.size[1]) * float(wpercent)) + img = img.resize((to_width, vsize)) + # read in old exxif data + exif_source = pexif.JpegFile.fromFile(filename) + # Save image + img.save(filename) + # Write new exif data from old image + exif_dest = pexif.JpegFile.fromFile(filename) + exif_dest.exif.primary.ExtendedEXIF.DateTimeOriginal = exif_source.exif.primary.ExtendedEXIF.DateTimeOriginal + exif_dest.exif.primary.Orientation = exif_source.exif.primary.Orientation + exif_dest.writeFile(filename) def get_file_date(filename, round_secs=1): """ Gets a time.struct_time from an image's EXIF, or None if not possible. """ log = logging.getLogger("exif2timestream") + + + with open(filename, "rb") as fh: exif_tags = er.process_file(fh, details=False, stop_tag=EXIF_DATE_TAG) try: str_date = exif_tags[EXIF_DATE_TAG].values date = strptime(str_date, EXIF_DATE_FMT) except KeyError: - return None + # Try and get the DateTime from the Filename + # If successful, then output it back into the exif data + #Else return none + print ("No Exif on " + filename + ", Attempting to read from Filename") + # Grab last element + try: + shortfilename = filename.split("/")[-1] + length = len(shortfilename) + datetime = shortfilename[(length-26):length-7] + datetime = datetime.replace('_', ':') + datetime = datetime[:10] + ' ' + datetime[11:] + img = pexif.JpegFile.fromFile(filename) + img.exif.primary.ExtendedEXIF.DateTimeOriginal = datetime + img.writeFile(filename) + date = strptime(datetime, EXIF_DATE_FMT) + except: + print ("Unable to scrape date from Filename") + return None if round_secs > 1: date = round_struct_time(date, round_secs) log.debug("Date of '{0:s}' is '{1:s}'".format(filename, d2s(date))) @@ -318,6 +356,8 @@ def timestreamise_image(image, camera, subsec=0, step="orig"): log = logging.getLogger("exif2timestream") # make new image path image_date = get_file_date(image, camera[FIELDS["interval"]] * 60) + # Resize the Image + # resize(image, 1000) if not image_date: log.warn("Couldn't get date for image {}".format(image)) raise SkipImage From 26d9ac8d372c6facea1e5d33a86c9ed11795cd74 Mon Sep 17 00:00:00 2001 From: Jordan Braiuka Date: Fri, 29 May 2015 12:15:29 +1000 Subject: [PATCH 02/10] Added Exif parsing from filename --- exif2timestream.py | 55 ++++++++++++++++++++++++---------------------- setup.py | 3 ++- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/exif2timestream.py b/exif2timestream.py index 2079385..405aa17 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -1,18 +1,18 @@ from __future__ import print_function from csv import reader, DictReader -import exifread as er +# import exifread as er import os from os import path import shutil from sys import exit -import pexif from time import strptime, strftime, mktime, localtime, struct_time, time from voluptuous import Required, Schema, MultipleInvalid from itertools import cycle from inspect import isclass from PIL import Image import logging -import datetime +import dateutil.parser +import pexif # versioneer from _version import get_versions __version__ = get_versions()['version'] @@ -254,44 +254,47 @@ def resize(filename, to_width): exif_dest.exif.primary.Orientation = exif_source.exif.primary.Orientation exif_dest.writeFile(filename) +def write_exif_date(filename, date_time): + try: + img = pexif.JpegFile.fromFile(filename) + img.exif.primary.ExtendedEXIF.DateTimeOriginal = date_time + img.writeFile(filename) + return True + except: + print ("Unable to Write exif data") + return False + def get_file_date(filename, round_secs=1): """ Gets a time.struct_time from an image's EXIF, or None if not possible. """ log = logging.getLogger("exif2timestream") - - - with open(filename, "rb") as fh: - exif_tags = er.process_file(fh, details=False, stop_tag=EXIF_DATE_TAG) + # Now uses Pexif + exif_tags = pexif.JpegFile.fromFile(filename) + # exif_tags = er.process_file(fh, details=False, stop_tag=EXIF_DATE_TAG) try: - str_date = exif_tags[EXIF_DATE_TAG].values + str_date = exif_tags.exif.primary.ExtendedEXIF.DateTimeOriginal + # str_date = exif_tags[EXIF_DATE_TAG].values date = strptime(str_date, EXIF_DATE_FMT) - except KeyError: - # Try and get the DateTime from the Filename - # If successful, then output it back into the exif data - #Else return none - print ("No Exif on " + filename + ", Attempting to read from Filename") - # Grab last element + # except KeyError: + except AttributeError: + # Try and Grab datetime from the filename try: shortfilename = filename.split("/")[-1] - length = len(shortfilename) - datetime = shortfilename[(length-26):length-7] - datetime = datetime.replace('_', ':') - datetime = datetime[:10] + ' ' + datetime[11:] - img = pexif.JpegFile.fromFile(filename) - img.exif.primary.ExtendedEXIF.DateTimeOriginal = datetime - img.writeFile(filename) - date = strptime(datetime, EXIF_DATE_FMT) - except: - print ("Unable to scrape date from Filename") - return None + print ("No Exif data in %s, attempting to read from filename"%shortfilename) + datetime = dateutil.parser.parse(shortfilename, fuzzy=True) + date = datetime.strftime(EXIF_DATE_FMT); + write_exif_date(filename, date) + return date + except: + print ("Unable to scrape date from %s"%shortfilename); + return None if round_secs > 1: date = round_struct_time(date, round_secs) log.debug("Date of '{0:s}' is '{1:s}'".format(filename, d2s(date))) return date - def get_new_file_name(date_tuple, ts_name, n=0, fmt=TS_FMT, ext="jpg"): """ Gives the new file name for an image within a timestream, based on diff --git a/setup.py b/setup.py index 4d93078..cc4bbe6 100644 --- a/setup.py +++ b/setup.py @@ -12,9 +12,10 @@ """ install_requires = [ - "ExifRead==1.4.2", + # "ExifRead==1.4.2", "docopt==0.6.1", "voluptuous==0.8.4", + "pexif==0.15", ] test_requires = [ From 854b43db6f4cf188f599163e291952fe9daa7e5a Mon Sep 17 00:00:00 2001 From: Jordan Braiuka Date: Wed, 3 Jun 2015 14:03:14 +1000 Subject: [PATCH 03/10] Updating Jordan Branch --- exif2timestream.py | 116 ++++++++++++++++++++++++++++++++------------- setup.py | 2 +- 2 files changed, 84 insertions(+), 34 deletions(-) diff --git a/exif2timestream.py b/exif2timestream.py index 405aa17..7f67a76 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -1,6 +1,5 @@ from __future__ import print_function from csv import reader, DictReader -# import exifread as er import os from os import path import shutil @@ -9,10 +8,18 @@ from voluptuous import Required, Schema, MultipleInvalid from itertools import cycle from inspect import isclass -from PIL import Image import logging -import dateutil.parser +import re import pexif +import exifread as er +skimage = None +try: + from skimage.transform import rescale + from skimage import novice + import skimage.io as io + skimage = True +except ImportError: + pass # versioneer from _version import get_versions __version__ = get_versions()['version'] @@ -117,11 +124,13 @@ def d2s(date): else: return date + def validate_camera(camera): """Validates and converts to python types the given camera dict (which normally has string values). """ log = logging.getLogger("exif2timestream") + def date(x): if isinstance(x, struct_time): return x @@ -237,59 +246,100 @@ def __call__(self, x): raise e return None -def resize(filename, to_width): - # Open the Image - img = Image.open(filename) - # Calculate new height and width - wpercent = to_width/float(img.size[0]) - vsize = int(float(img.size[1]) * float(wpercent)) - img = img.resize((to_width, vsize)) + +def resize_img(filename, to_width): + # Open the Image and get its width + img = io.imread(filename) + w = novice.open(filename).width + scale = float(to_width) / w + # Rescale the image + img = rescale(img, scale) # read in old exxif data exif_source = pexif.JpegFile.fromFile(filename) # Save image - img.save(filename) + io.imsave(filename, img) # Write new exif data from old image - exif_dest = pexif.JpegFile.fromFile(filename) - exif_dest.exif.primary.ExtendedEXIF.DateTimeOriginal = exif_source.exif.primary.ExtendedEXIF.DateTimeOriginal - exif_dest.exif.primary.Orientation = exif_source.exif.primary.Orientation - exif_dest.writeFile(filename) + try: + exif_dest = pexif.JpegFile.fromFile(filename) + exif_dest.exif.primary.ExtendedEXIF.DateTimeOriginal = exif_source.exif.primary.ExtendedEXIF.DateTimeOriginal + exif_dest.writeFile( filename) + except AttributeError: + pass + +def get_time_from_filename(filename, mask): + # Replace the year with the regex equivalent to parse + regex_mask = mask.replace("%Y", "\d{4}").replace("%m", "\d{2}").replace("%d", "\d{2}") + regex_mask = regex_mask.replace("%H", "\d{2}").replace("%M", "\d{2}").replace("%S", "\d{2}") + # Wildcard character before and after the regex + regex_mask = "\.*" + regex_mask + "\.*" + # compile the regex + date_reg_exp = re.compile(regex_mask) + # get the list of possible date matches + matches_list = date_reg_exp.findall(filename) + for match in matches_list: + try: + # Parse each match into a datetime + datetime = strptime(match, mask) + # Return the datetime + return datetime + # If we cant convert it to the date, then go to the next item on the list + except ValueError: + continue + # If we cant match anything, then return null + return None + + def write_exif_date(filename, date_time): try: + # Read in the file img = pexif.JpegFile.fromFile(filename) - img.exif.primary.ExtendedEXIF.DateTimeOriginal = date_time + # Edit the exif data + img.exif.primary.ExtendedEXIF.DateTimeOriginal = strftime(EXIF_DATE_FMT, date_time) + # Write to the file img.writeFile(filename) return True - except: - print ("Unable to Write exif data") + except IOError: return False + def get_file_date(filename, round_secs=1): """ Gets a time.struct_time from an image's EXIF, or None if not possible. """ log = logging.getLogger("exif2timestream") - with open(filename, "rb") as fh: + # with open(filename, "rb") as fh: # Now uses Pexif - exif_tags = pexif.JpegFile.fromFile(filename) - # exif_tags = er.process_file(fh, details=False, stop_tag=EXIF_DATE_TAG) try: + exif_tags = pexif.JpegFile.fromFile(filename) str_date = exif_tags.exif.primary.ExtendedEXIF.DateTimeOriginal - # str_date = exif_tags[EXIF_DATE_TAG].values date = strptime(str_date, EXIF_DATE_FMT) - # except KeyError: + # print (date) except AttributeError: # Try and Grab datetime from the filename - try: - shortfilename = filename.split("/")[-1] - print ("No Exif data in %s, attempting to read from filename"%shortfilename) - datetime = dateutil.parser.parse(shortfilename, fuzzy=True) - date = datetime.strftime(EXIF_DATE_FMT); - write_exif_date(filename, date) - return date - except: - print ("Unable to scrape date from %s"%shortfilename); + # Grab only the filename, not the directory + shortfilename = os.path.basename(filename) + log.debug("No Exif data in '{0:s}', attempting to read from filename".format(shortfilename)) + # Try and grab the date + # We can put a custom mask in here if we want + custom_mask = EXIF_DATE_FMT + date = get_time_from_filename(filename, custom_mask) + if date is None: + log.debug("Unable to scrape date from '{0:s}'".format(shortfilename)); return None + else: + if not(write_exif_date(filename, date)): + log.debug("Unable to write Exif Data") + return None + return date + except pexif.JpegFile.InvalidFile: + with open(filename, "rb") as fh: + exif_tags = er.process_file(fh, details=False, stop_tag = EXIF_DATE_TAG) + try: + str_date = exif_tags[EXIF_DATE_TAG].values + date = strptime(str_date, EXIF_DATE_FMT) + except KeyError: + return None if round_secs > 1: date = round_struct_time(date, round_secs) log.debug("Date of '{0:s}' is '{1:s}'".format(filename, d2s(date))) @@ -562,7 +612,7 @@ def find_image_files(camera): not dir.startswith("_"): log.error("Souce directory has too many subdirs.A") # TODO: Is raising here a good idea? - #raise ValueError("too many subdirs") + # raise ValueError("too many subdirs") for fle in files: this_ext = path.splitext(fle)[-1].lower().strip(".") if this_ext == ext or ext == "raw" and this_ext in RAW_FORMATS: diff --git a/setup.py b/setup.py index cc4bbe6..81fe23b 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ """ install_requires = [ - # "ExifRead==1.4.2", + "ExifRead==1.4.2", "docopt==0.6.1", "voluptuous==0.8.4", "pexif==0.15", From c455149bccef10f19e7211375240e17008a8f55d Mon Sep 17 00:00:00 2001 From: Jordan Braiuka Date: Wed, 3 Jun 2015 14:10:21 +1000 Subject: [PATCH 04/10] Back on Jordan_Branch --- exif2timestream.py | 5 ++- test/test_exif2timestream.py | 40 +++++++++++++++++- .../camupload/jpg/whroo20131104_020255M.jpg | Bin 0 -> 101045 bytes 3 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 test/unburnable/camupload/jpg/whroo20131104_020255M.jpg diff --git a/exif2timestream.py b/exif2timestream.py index 7f67a76..f9c2de9 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -12,6 +12,7 @@ import re import pexif import exifread as er +import warnings skimage = None try: from skimage.transform import rescale @@ -257,7 +258,9 @@ def resize_img(filename, to_width): # read in old exxif data exif_source = pexif.JpegFile.fromFile(filename) # Save image - io.imsave(filename, img) + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + io.imsave(filename, img) # Write new exif data from old image try: exif_dest = pexif.JpegFile.fromFile(filename) diff --git a/test/test_exif2timestream.py b/test/test_exif2timestream.py index 28f60da..680d406 100644 --- a/test/test_exif2timestream.py +++ b/test/test_exif2timestream.py @@ -9,7 +9,14 @@ import unittest from voluptuous import MultipleInvalid from tempfile import NamedTemporaryFile - +import pexif +try: + from skimage.transform import resize + import skimage.io as io + from skimage import novice + skimage = True +except ImportError: + pass class TestExifTraitcapture(unittest.TestCase): dirname = path.dirname(__file__) @@ -225,7 +232,8 @@ def test_find_image_files(self): 'jpg/IMG_0001.JPG', 'jpg/IMG_0002.JPG', 'jpg/IMG_0630.JPG', - 'jpg/IMG_0633.JPG'] + 'jpg/IMG_0633.JPG', + 'jpg/whroo20131104_020255M.jpg'] }, "raw": {path.join(self.camupload_dir, 'raw/IMG_0001.CR2')}, } @@ -312,6 +320,34 @@ def test_generate_config_csv(self): e2t.generate_config_csv(out_csv) self._md5test(out_csv, "bf1ff915a42390a15ab8e4704e5c38e9") + # Tests for checking parsing of dates from filename + def test_check_date_parse(self): + self.assertEqual(e2t.get_time_from_filename("whroo20141101_001212M.jpg", "%Y%m%d_%H%M%S"), strptime("20141101_001212", "%Y%m%d_%H%M%S")) + self.assertEqual(e2t.get_time_from_filename("TRN-NC-DSC-01~640_2013_06_01_10_45_00_00.jpg", "%Y_%m_%d_%H_%M_%S"), strptime("2013_06_01_10_45_00", "%Y_%m_%d_%H_%M_%S")) + + def test_check_write_exif(self): + # Write To Exif + filename = 'jpg/whroo20131104_020255M.jpg' + date_time = e2t.get_time_from_filename(path.join(self.camupload_dir, filename), "%Y%m%d_%H%M%S") + e2t.write_exif_date(path.join(self.camupload_dir, filename), date_time) + + # Read From Exif + exif_tags = pexif.JpegFile.fromFile(path.join(self.camupload_dir, filename)) + str_date = exif_tags.exif.primary.ExtendedEXIF.DateTimeOriginal + date = strptime(str_date, "%Y:%m:%d %H:%M:%S") + + # Check Equal + self.assertEqual(date_time, date) + + # Tests for checking image resizing + def test_check_resize_img(self): + filename = 'jpg/whroo20131104_020255M.jpg' + new_width = 400 + e2t.resize_img(path.join(self.camupload_dir, filename), new_width) + img = io.imread(path.join(self.camupload_dir, filename)) + w = novice.open(path.join(self.camupload_dir, filename)).width + self.assertEqual(w, new_width) + # tests for main function def test_main(self): e2t.main({ diff --git a/test/unburnable/camupload/jpg/whroo20131104_020255M.jpg b/test/unburnable/camupload/jpg/whroo20131104_020255M.jpg new file mode 100644 index 0000000000000000000000000000000000000000..47ff313d1bd453a24db4d1d4ec084db6b11a7b21 GIT binary patch literal 101045 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Π$~bTS5PQ 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 F{{x{=N3s9_ literal 0 HcmV?d00001 From a93fba2d752c201c179a92416ef23d94c10eadda Mon Sep 17 00:00:00 2001 From: Jordan Braiuka Date: Wed, 3 Jun 2015 14:48:23 +1000 Subject: [PATCH 05/10] Accepts Mask for reading from filename in command line --- exif2timestream.py | 16 +++++++++++----- run_from_cmdline | 2 +- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/exif2timestream.py b/exif2timestream.py index f9c2de9..0b3c650 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -25,9 +25,9 @@ from _version import get_versions __version__ = get_versions()['version'] del get_versions - EXIF_DATE_TAG = "Image DateTime" EXIF_DATE_FMT = "%Y:%m:%d %H:%M:%S" +EXIF_DATE_MASK = EXIF_DATE_FMT TS_V1_FMT = ("%Y/%Y_%m/%Y_%m_%d/%Y_%m_%d_%H/" "{tsname:s}_%Y_%m_%d_%H_%M_%S_{n:02d}.{ext:s}") TS_V2_FMT = ("%Y/%Y_%m/%Y_%m_%d/%Y_%m_%d_%H/" @@ -42,7 +42,7 @@ DATE_NOW_CONSTANTS = {"now", "current"} CLI_OPTS = """ USAGE: - exif2timestream.py [-t PROCESSES -1 -d -l LOGDIR] -c CAM_CONFIG_CSV + exif2timestream.py [-t PROCESSES -1 -d -l LOGDIR] -c CAM_CONFIG_CSV -m MASK exif2timestream.py -g CAM_CONFIG_CSV exif2timestream.py -V @@ -54,6 +54,7 @@ -c CAM_CONFIG_CSV Path to CSV camera config file for normal operation. -g CAM_CONFIG_CSV Generate a template camera configuration file at given path. + -m MASK Mask to Use for parsing dates from filenames -V Print version information. """ @@ -269,7 +270,7 @@ def resize_img(filename, to_width): except AttributeError: pass -def get_time_from_filename(filename, mask): +def get_time_from_filename(filename, mask = EXIF_DATE_MASK): # Replace the year with the regex equivalent to parse regex_mask = mask.replace("%Y", "\d{4}").replace("%m", "\d{2}").replace("%d", "\d{2}") regex_mask = regex_mask.replace("%H", "\d{2}").replace("%M", "\d{2}").replace("%S", "\d{2}") @@ -313,6 +314,7 @@ def get_file_date(filename, round_secs=1): log = logging.getLogger("exif2timestream") # with open(filename, "rb") as fh: # Now uses Pexif + try: exif_tags = pexif.JpegFile.fromFile(filename) str_date = exif_tags.exif.primary.ExtendedEXIF.DateTimeOriginal @@ -325,8 +327,7 @@ def get_file_date(filename, round_secs=1): log.debug("No Exif data in '{0:s}', attempting to read from filename".format(shortfilename)) # Try and grab the date # We can put a custom mask in here if we want - custom_mask = EXIF_DATE_FMT - date = get_time_from_filename(filename, custom_mask) + date = get_time_from_filename(filename) if date is None: log.debug("Unable to scrape date from '{0:s}'".format(shortfilename)); return None @@ -677,6 +678,11 @@ def main(opts): # beginneth the actual main loop start_time = time() cameras = parse_camera_config_csv(opts["-c"]) + try: + global EXIF_DATE_MASK + EXIF_DATE_MASK = opts["-m"] + except KeyError: + pass n_images = 0 for camera in cameras: msg = "Processing experiment {}, location {}\n".format( diff --git a/run_from_cmdline b/run_from_cmdline index b936b02..37923d0 100755 --- a/run_from_cmdline +++ b/run_from_cmdline @@ -7,6 +7,6 @@ test -e test/img && rm -r test/img cp -r test/unburnable test/img mkdir -p test/out/archive mkdir -p test/out/timestreams -python -m exif2timestream -l log -d -c ./test/config.csv +python -m exif2timestream -l log -d -c ./test/config.csv -m "%Y%M%D" if [ -n "$(which tree)" ] ; then tree test/out; fi rm -r test/out From e1685714a78795c29c9cb20e265a996d6583dcfc Mon Sep 17 00:00:00 2001 From: Jordan Braiuka Date: Wed, 3 Jun 2015 15:03:08 +1000 Subject: [PATCH 06/10] Made changes required --- exif2timestream.py | 41 +++++++++++++++++++----------------- run_from_cmdline | 2 +- test/test_exif2timestream.py | 15 +++++++------ 3 files changed, 32 insertions(+), 26 deletions(-) diff --git a/exif2timestream.py b/exif2timestream.py index 0b3c650..c605e2e 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -42,7 +42,7 @@ DATE_NOW_CONSTANTS = {"now", "current"} CLI_OPTS = """ USAGE: - exif2timestream.py [-t PROCESSES -1 -d -l LOGDIR] -c CAM_CONFIG_CSV -m MASK + exif2timestream.py [-t PROCESSES -1 -d -l LOGDIR -m MASK] -c CAM_CONFIG_CSV exif2timestream.py -g CAM_CONFIG_CSV exif2timestream.py -V @@ -251,24 +251,27 @@ def __call__(self, x): def resize_img(filename, to_width): # Open the Image and get its width - img = io.imread(filename) - w = novice.open(filename).width - scale = float(to_width) / w - # Rescale the image - img = rescale(img, scale) - # read in old exxif data - exif_source = pexif.JpegFile.fromFile(filename) - # Save image - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - io.imsave(filename, img) - # Write new exif data from old image - try: - exif_dest = pexif.JpegFile.fromFile(filename) - exif_dest.exif.primary.ExtendedEXIF.DateTimeOriginal = exif_source.exif.primary.ExtendedEXIF.DateTimeOriginal - exif_dest.writeFile( filename) - except AttributeError: - pass + if(skimage): + img = io.imread(filename) + w = novice.open(filename).width + scale = float(to_width) / w + # Rescale the image + img = rescale(img, scale) + # read in old exxif data + exif_source = pexif.JpegFile.fromFile(filename) + # Save image + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + io.imsave(filename, img) + # Write new exif data from old image + try: + exif_dest = pexif.JpegFile.fromFile(filename) + exif_dest.exif.primary.ExtendedEXIF.DateTimeOriginal = exif_source.exif.primary.ExtendedEXIF.DateTimeOriginal + exif_dest.writeFile( filename) + except AttributeError: + pass + else: + raise Warning("Skimage is not installed, Will not resize images") def get_time_from_filename(filename, mask = EXIF_DATE_MASK): # Replace the year with the regex equivalent to parse diff --git a/run_from_cmdline b/run_from_cmdline index 37923d0..b936b02 100755 --- a/run_from_cmdline +++ b/run_from_cmdline @@ -7,6 +7,6 @@ test -e test/img && rm -r test/img cp -r test/unburnable test/img mkdir -p test/out/archive mkdir -p test/out/timestreams -python -m exif2timestream -l log -d -c ./test/config.csv -m "%Y%M%D" +python -m exif2timestream -l log -d -c ./test/config.csv if [ -n "$(which tree)" ] ; then tree test/out; fi rm -r test/out diff --git a/test/test_exif2timestream.py b/test/test_exif2timestream.py index 680d406..0baa891 100644 --- a/test/test_exif2timestream.py +++ b/test/test_exif2timestream.py @@ -341,12 +341,15 @@ def test_check_write_exif(self): # Tests for checking image resizing def test_check_resize_img(self): - filename = 'jpg/whroo20131104_020255M.jpg' - new_width = 400 - e2t.resize_img(path.join(self.camupload_dir, filename), new_width) - img = io.imread(path.join(self.camupload_dir, filename)) - w = novice.open(path.join(self.camupload_dir, filename)).width - self.assertEqual(w, new_width) + if(skimage): + filename = 'jpg/whroo20131104_020255M.jpg' + new_width = 400 + e2t.resize_img(path.join(self.camupload_dir, filename), new_width) + img = io.imread(path.join(self.camupload_dir, filename)) + w = novice.open(path.join(self.camupload_dir, filename)).width + self.assertEqual(w, new_width) + else: + raise Warning("Skimage Not Installed, Unable to Test Resize") # tests for main function def test_main(self): From a9c903ff6fdbce20b3dfd90c62127c69376963d9 Mon Sep 17 00:00:00 2001 From: Jordan Braiuka Date: Wed, 3 Jun 2015 15:24:11 +1000 Subject: [PATCH 07/10] uses warnings module for warrnings now --- exif2timestream.py | 8 ++++---- test/test_exif2timestream.py | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/exif2timestream.py b/exif2timestream.py index c605e2e..bed73f1 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -13,12 +13,12 @@ import pexif import exifread as er import warnings -skimage = None +SKIMAGE = False try: from skimage.transform import rescale from skimage import novice import skimage.io as io - skimage = True + SKIMAGE = True except ImportError: pass # versioneer @@ -251,7 +251,7 @@ def __call__(self, x): def resize_img(filename, to_width): # Open the Image and get its width - if(skimage): + if(SKIMAGE): img = io.imread(filename) w = novice.open(filename).width scale = float(to_width) / w @@ -271,7 +271,7 @@ def resize_img(filename, to_width): except AttributeError: pass else: - raise Warning("Skimage is not installed, Will not resize images") + warnings.warn("Skimage Not Installed, Unable to Test Resize", ImportWarning) def get_time_from_filename(filename, mask = EXIF_DATE_MASK): # Replace the year with the regex equivalent to parse diff --git a/test/test_exif2timestream.py b/test/test_exif2timestream.py index 0baa891..6ef30d4 100644 --- a/test/test_exif2timestream.py +++ b/test/test_exif2timestream.py @@ -10,11 +10,13 @@ from voluptuous import MultipleInvalid from tempfile import NamedTemporaryFile import pexif +import warnings +SKIMAGE = False try: from skimage.transform import resize import skimage.io as io from skimage import novice - skimage = True + # SKIMAGE = True except ImportError: pass @@ -341,7 +343,7 @@ def test_check_write_exif(self): # Tests for checking image resizing def test_check_resize_img(self): - if(skimage): + if(SKIMAGE): filename = 'jpg/whroo20131104_020255M.jpg' new_width = 400 e2t.resize_img(path.join(self.camupload_dir, filename), new_width) @@ -349,7 +351,7 @@ def test_check_resize_img(self): w = novice.open(path.join(self.camupload_dir, filename)).width self.assertEqual(w, new_width) else: - raise Warning("Skimage Not Installed, Unable to Test Resize") + warnings.warn("Skimage Not Installed, Unable to Test Resize", ImportWarning) # tests for main function def test_main(self): From e1cd9f6297fd0a400c8555566ea1fe8eecd289d3 Mon Sep 17 00:00:00 2001 From: Jordan Braiuka Date: Wed, 10 Jun 2015 14:08:30 +1000 Subject: [PATCH 08/10] final changes, should be good now --- exif2timestream.py | 82 ++++++++++++++++++++---------------- run_from_cmdline | 2 +- test/test_exif2timestream.py | 18 +++++--- 3 files changed, 58 insertions(+), 44 deletions(-) diff --git a/exif2timestream.py b/exif2timestream.py index bed73f1..d22ee70 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -251,32 +251,36 @@ def __call__(self, x): def resize_img(filename, to_width): # Open the Image and get its width - if(SKIMAGE): - img = io.imread(filename) - w = novice.open(filename).width - scale = float(to_width) / w - # Rescale the image - img = rescale(img, scale) - # read in old exxif data - exif_source = pexif.JpegFile.fromFile(filename) - # Save image - with warnings.catch_warnings(): - warnings.simplefilter("ignore") - io.imsave(filename, img) - # Write new exif data from old image - try: - exif_dest = pexif.JpegFile.fromFile(filename) - exif_dest.exif.primary.ExtendedEXIF.DateTimeOriginal = exif_source.exif.primary.ExtendedEXIF.DateTimeOriginal - exif_dest.writeFile( filename) - except AttributeError: - pass - else: - warnings.warn("Skimage Not Installed, Unable to Test Resize", ImportWarning) + if not(SKIMAGE): + warnings.warn( + "Skimage Not Installed, Unable to Test Resize", ImportWarning) + return None + img = io.imread(filename) + w = novice.open(filename).width + scale = float(to_width) / w + # Rescale the image + img = rescale(img, scale) + # read in old exxif data + exif_source = pexif.JpegFile.fromFile(filename) + # Save image + with warnings.catch_warnings(): + warnings.simplefilter("ignore") + io.imsave(filename, img) + # Write new exif data from old image + try: + exif_dest = pexif.JpegFile.fromFile(filename) + exif_dest.exif.primary.ExtendedEXIF.DateTimeOriginal = exif_source.exif.primary.ExtendedEXIF.DateTimeOriginal + exif_dest.writeFile(filename) + except AttributeError: + pass + -def get_time_from_filename(filename, mask = EXIF_DATE_MASK): +def get_time_from_filename(filename, mask=EXIF_DATE_MASK): # Replace the year with the regex equivalent to parse - regex_mask = mask.replace("%Y", "\d{4}").replace("%m", "\d{2}").replace("%d", "\d{2}") - regex_mask = regex_mask.replace("%H", "\d{2}").replace("%M", "\d{2}").replace("%S", "\d{2}") + regex_mask = mask.replace("%Y", "\d{4}").replace( + "%m", "\d{2}").replace("%d", "\d{2}") + regex_mask = regex_mask.replace("%H", "\d{2}").replace( + "%M", "\d{2}").replace("%S", "\d{2}") # Wildcard character before and after the regex regex_mask = "\.*" + regex_mask + "\.*" # compile the regex @@ -289,20 +293,21 @@ def get_time_from_filename(filename, mask = EXIF_DATE_MASK): datetime = strptime(match, mask) # Return the datetime return datetime - # If we cant convert it to the date, then go to the next item on the list + # If we cant convert it to the date, then go to the next item on the + # list except ValueError: continue # If we cant match anything, then return null return None - def write_exif_date(filename, date_time): try: # Read in the file img = pexif.JpegFile.fromFile(filename) # Edit the exif data - img.exif.primary.ExtendedEXIF.DateTimeOriginal = strftime(EXIF_DATE_FMT, date_time) + img.exif.primary.ExtendedEXIF.DateTimeOriginal = strftime( + EXIF_DATE_FMT, date_time) # Write to the file img.writeFile(filename) return True @@ -315,33 +320,35 @@ def get_file_date(filename, round_secs=1): Gets a time.struct_time from an image's EXIF, or None if not possible. """ log = logging.getLogger("exif2timestream") - # with open(filename, "rb") as fh: - # Now uses Pexif + # Now uses Pexif try: exif_tags = pexif.JpegFile.fromFile(filename) str_date = exif_tags.exif.primary.ExtendedEXIF.DateTimeOriginal date = strptime(str_date, EXIF_DATE_FMT) - # print (date) + # print (date) except AttributeError: # Try and Grab datetime from the filename # Grab only the filename, not the directory - shortfilename = os.path.basename(filename) - log.debug("No Exif data in '{0:s}', attempting to read from filename".format(shortfilename)) + shortfilename = os.path.basename(filename) + log.debug("No Exif data in '{0:s}', attempting to read from filename".format( + shortfilename)) # Try and grab the date # We can put a custom mask in here if we want date = get_time_from_filename(filename) if date is None: - log.debug("Unable to scrape date from '{0:s}'".format(shortfilename)); + log.debug( + "Unable to scrape date from '{0:s}'".format(shortfilename)) return None else: if not(write_exif_date(filename, date)): log.debug("Unable to write Exif Data") return None - return date + return date except pexif.JpegFile.InvalidFile: with open(filename, "rb") as fh: - exif_tags = er.process_file(fh, details=False, stop_tag = EXIF_DATE_TAG) + exif_tags = er.process_file( + fh, details=False, stop_tag=EXIF_DATE_TAG) try: str_date = exif_tags[EXIF_DATE_TAG].values date = strptime(str_date, EXIF_DATE_FMT) @@ -352,6 +359,7 @@ def get_file_date(filename, round_secs=1): log.debug("Date of '{0:s}' is '{1:s}'".format(filename, d2s(date))) return date + def get_new_file_name(date_tuple, ts_name, n=0, fmt=TS_FMT, ext="jpg"): """ Gives the new file name for an image within a timestream, based on @@ -617,9 +625,9 @@ def find_image_files(camera): for dir in dirs: if dir.lower() not in IMAGE_SUBFOLDERS and \ not dir.startswith("_"): - log.error("Souce directory has too many subdirs.A") + log.error("Source directory has too many subdirs.") # TODO: Is raising here a good idea? - # raise ValueError("too many subdirs") + raise ValueError("too many subdirs") for fle in files: this_ext = path.splitext(fle)[-1].lower().strip(".") if this_ext == ext or ext == "raw" and this_ext in RAW_FORMATS: diff --git a/run_from_cmdline b/run_from_cmdline index b936b02..37534a8 100755 --- a/run_from_cmdline +++ b/run_from_cmdline @@ -9,4 +9,4 @@ mkdir -p test/out/archive mkdir -p test/out/timestreams python -m exif2timestream -l log -d -c ./test/config.csv if [ -n "$(which tree)" ] ; then tree test/out; fi -rm -r test/out +# rm -r test/out diff --git a/test/test_exif2timestream.py b/test/test_exif2timestream.py index 6ef30d4..07321f3 100644 --- a/test/test_exif2timestream.py +++ b/test/test_exif2timestream.py @@ -20,6 +20,7 @@ except ImportError: pass + class TestExifTraitcapture(unittest.TestCase): dirname = path.dirname(__file__) test_config_csv = path.join(dirname, "config.csv") @@ -234,7 +235,7 @@ def test_find_image_files(self): 'jpg/IMG_0001.JPG', 'jpg/IMG_0002.JPG', 'jpg/IMG_0630.JPG', - 'jpg/IMG_0633.JPG', + 'jpg/IMG_0633.JPG', 'jpg/whroo20131104_020255M.jpg'] }, "raw": {path.join(self.camupload_dir, 'raw/IMG_0001.CR2')}, @@ -324,17 +325,21 @@ def test_generate_config_csv(self): # Tests for checking parsing of dates from filename def test_check_date_parse(self): - self.assertEqual(e2t.get_time_from_filename("whroo20141101_001212M.jpg", "%Y%m%d_%H%M%S"), strptime("20141101_001212", "%Y%m%d_%H%M%S")) - self.assertEqual(e2t.get_time_from_filename("TRN-NC-DSC-01~640_2013_06_01_10_45_00_00.jpg", "%Y_%m_%d_%H_%M_%S"), strptime("2013_06_01_10_45_00", "%Y_%m_%d_%H_%M_%S")) + self.assertEqual(e2t.get_time_from_filename( + "whroo20141101_001212M.jpg", "%Y%m%d_%H%M%S"), strptime("20141101_001212", "%Y%m%d_%H%M%S")) + self.assertEqual(e2t.get_time_from_filename("TRN-NC-DSC-01~640_2013_06_01_10_45_00_00.jpg", + "%Y_%m_%d_%H_%M_%S"), strptime("2013_06_01_10_45_00", "%Y_%m_%d_%H_%M_%S")) def test_check_write_exif(self): # Write To Exif filename = 'jpg/whroo20131104_020255M.jpg' - date_time = e2t.get_time_from_filename(path.join(self.camupload_dir, filename), "%Y%m%d_%H%M%S") + date_time = e2t.get_time_from_filename( + path.join(self.camupload_dir, filename), "%Y%m%d_%H%M%S") e2t.write_exif_date(path.join(self.camupload_dir, filename), date_time) # Read From Exif - exif_tags = pexif.JpegFile.fromFile(path.join(self.camupload_dir, filename)) + exif_tags = pexif.JpegFile.fromFile( + path.join(self.camupload_dir, filename)) str_date = exif_tags.exif.primary.ExtendedEXIF.DateTimeOriginal date = strptime(str_date, "%Y:%m:%d %H:%M:%S") @@ -351,7 +356,8 @@ def test_check_resize_img(self): w = novice.open(path.join(self.camupload_dir, filename)).width self.assertEqual(w, new_width) else: - warnings.warn("Skimage Not Installed, Unable to Test Resize", ImportWarning) + warnings.warn( + "Skimage Not Installed, Unable to Test Resize", ImportWarning) # tests for main function def test_main(self): From 3ebf09f7cad81f8624a412b3428e07a506ffb1f2 Mon Sep 17 00:00:00 2001 From: Jordan Braiuka Date: Wed, 10 Jun 2015 15:10:15 +1000 Subject: [PATCH 09/10] Ok now it should be done --- exif2timestream.py | 19 +++++++------------ test/test_exif2timestream.py | 28 +++++++++++++++++++--------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/exif2timestream.py b/exif2timestream.py index d22ee70..ad5bdbd 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -15,9 +15,7 @@ import warnings SKIMAGE = False try: - from skimage.transform import rescale - from skimage import novice - import skimage.io as io + import skimage SKIMAGE = True except ImportError: pass @@ -255,17 +253,17 @@ def resize_img(filename, to_width): warnings.warn( "Skimage Not Installed, Unable to Test Resize", ImportWarning) return None - img = io.imread(filename) - w = novice.open(filename).width + img = skimage.io.imread(filename) + w = skimate.novice.open(filename).width scale = float(to_width) / w # Rescale the image - img = rescale(img, scale) + img = skimage.transform.rescale(img, scale) # read in old exxif data exif_source = pexif.JpegFile.fromFile(filename) # Save image with warnings.catch_warnings(): warnings.simplefilter("ignore") - io.imsave(filename, img) + skimage.io.imsave(filename, img) # Write new exif data from old image try: exif_dest = pexif.JpegFile.fromFile(filename) @@ -297,7 +295,7 @@ def get_time_from_filename(filename, mask=EXIF_DATE_MASK): # list except ValueError: continue - # If we cant match anything, then return null + # If we cant match anything, then return None return None @@ -689,11 +687,8 @@ def main(opts): # beginneth the actual main loop start_time = time() cameras = parse_camera_config_csv(opts["-c"]) - try: - global EXIF_DATE_MASK + if opts['-m'] is not None: EXIF_DATE_MASK = opts["-m"] - except KeyError: - pass n_images = 0 for camera in cameras: msg = "Processing experiment {}, location {}\n".format( diff --git a/test/test_exif2timestream.py b/test/test_exif2timestream.py index 07321f3..3146318 100644 --- a/test/test_exif2timestream.py +++ b/test/test_exif2timestream.py @@ -13,9 +13,7 @@ import warnings SKIMAGE = False try: - from skimage.transform import resize - import skimage.io as io - from skimage import novice + import skimage # SKIMAGE = True except ImportError: pass @@ -325,10 +323,14 @@ def test_generate_config_csv(self): # Tests for checking parsing of dates from filename def test_check_date_parse(self): - self.assertEqual(e2t.get_time_from_filename( - "whroo20141101_001212M.jpg", "%Y%m%d_%H%M%S"), strptime("20141101_001212", "%Y%m%d_%H%M%S")) - self.assertEqual(e2t.get_time_from_filename("TRN-NC-DSC-01~640_2013_06_01_10_45_00_00.jpg", - "%Y_%m_%d_%H_%M_%S"), strptime("2013_06_01_10_45_00", "%Y_%m_%d_%H_%M_%S")) + got = e2t.get_time_from_filename( + "whroo20141101_001212M.jpg", "%Y%m%d_%H%M%S") + expected = strptime("20141101_001212", "%Y%m%d_%H%M%S") + self.assertEqual(got, expected) + got = e2t.get_time_from_filename("TRN-NC-DSC-01~640_2013_06_01_10_45_00_00.jpg", + "%Y_%m_%d_%H_%M_%S") + expected = strptime("2013_06_01_10_45_00", "%Y_%m_%d_%H_%M_%S") + self.assertEqual(got, expected) def test_check_write_exif(self): # Write To Exif @@ -352,8 +354,9 @@ def test_check_resize_img(self): filename = 'jpg/whroo20131104_020255M.jpg' new_width = 400 e2t.resize_img(path.join(self.camupload_dir, filename), new_width) - img = io.imread(path.join(self.camupload_dir, filename)) - w = novice.open(path.join(self.camupload_dir, filename)).width + img = skimage.io.imread(path.join(self.camupload_dir, filename)) + w = skimage.novice.open( + path.join(self.camupload_dir, filename)).width self.assertEqual(w, new_width) else: warnings.warn( @@ -367,6 +370,7 @@ def test_main(self): '-a': None, '-c': self.test_config_csv, '-l': self.out_dirname, + '-m': None, '-g': None, '-t': None}) #os.system("tree %s" % path.dirname(self.out_dirname)) @@ -379,6 +383,7 @@ def test_main_raw(self): '-a': None, '-c': self.test_config_raw_csv, '-l': self.out_dirname, + '-m': None, '-g': None, '-t': None}) #os.system("tree %s" % path.dirname(self.out_dirname)) @@ -392,6 +397,7 @@ def test_main_expt_dates(self): '-a': None, '-c': self.test_config_dates_csv, '-l': self.out_dirname, + '-m': None, '-g': None, '-t': None}) #os.system("tree %s" % path.dirname(self.out_dirname)) @@ -405,6 +411,7 @@ def test_main_threads(self): '-a': None, '-c': self.test_config_csv, '-l': self.out_dirname, + '-m': None, '-g': None, '-t': '2'}) self.assertTrue(path.exists(self.r_fullres_path)) @@ -417,6 +424,7 @@ def test_main_threads_bad(self): '-a': None, '-c': self.test_config_csv, '-l': self.out_dirname, + '-m': None, '-g': None, '-t': "several"}) self.assertTrue(path.exists(self.r_fullres_path)) @@ -429,6 +437,7 @@ def test_main_threads_one(self): '-a': None, '-c': self.test_config_csv, '-l': self.out_dirname, + '-m': None, '-g': None, '-t': None}) self.assertTrue(path.exists(self.r_fullres_path)) @@ -445,6 +454,7 @@ def test_main_generate(self): '-a': None, '-c': None, '-l': self.out_dirname, + '-m': None, '-g': conf_out, '-t': None}) self.assertTrue(path.exists(conf_out)) From 08f359c31c2d3326419b27ca459e6280d3b8e6f0 Mon Sep 17 00:00:00 2001 From: Kevin Murray Date: Wed, 10 Jun 2015 15:27:03 +1000 Subject: [PATCH 10/10] Fix minor formatting issues, use global as req. --- exif2timestream.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/exif2timestream.py b/exif2timestream.py index ad5bdbd..37c2ba1 100644 --- a/exif2timestream.py +++ b/exif2timestream.py @@ -40,7 +40,7 @@ DATE_NOW_CONSTANTS = {"now", "current"} CLI_OPTS = """ USAGE: - exif2timestream.py [-t PROCESSES -1 -d -l LOGDIR -m MASK] -c CAM_CONFIG_CSV + exif2timestream.py [-t PROCESSES -1 -d -l LOGDIR -m MASK] -c CAM_CONFIG_CSV exif2timestream.py -g CAM_CONFIG_CSV exif2timestream.py -V @@ -200,7 +200,7 @@ def image_type_str(x): raise ValueError types = x.lower().strip().split('~') for type in types: - if not type in IMAGE_TYPE_CONSTANTS: + if type not in IMAGE_TYPE_CONSTANTS: raise ValueError return types @@ -212,7 +212,7 @@ def __init__(self, valid_values): self.valid_values = set(valid_values) def __call__(self, x): - if not x in self.valid_values: + if x not in self.valid_values: raise ValueError return x @@ -267,7 +267,8 @@ def resize_img(filename, to_width): # Write new exif data from old image try: exif_dest = pexif.JpegFile.fromFile(filename) - exif_dest.exif.primary.ExtendedEXIF.DateTimeOriginal = exif_source.exif.primary.ExtendedEXIF.DateTimeOriginal + exif_dest.exif.primary.ExtendedEXIF.DateTimeOriginal = \ + exif_source.exif.primary.ExtendedEXIF.DateTimeOriginal exif_dest.writeFile(filename) except AttributeError: pass @@ -687,6 +688,7 @@ def main(opts): # beginneth the actual main loop start_time = time() cameras = parse_camera_config_csv(opts["-c"]) + global EXIF_DATE_MASK # Needed below if opts['-m'] is not None: EXIF_DATE_MASK = opts["-m"] n_images = 0