Skip to content

Instantly share code, notes, and snippets.

@jongyeol
Created April 4, 2020 08:42
Show Gist options
  • Save jongyeol/2b7bd10cecc35e46f75ed0551ffd5e2a to your computer and use it in GitHub Desktop.
Save jongyeol/2b7bd10cecc35e46f75ed0551ffd5e2a to your computer and use it in GitHub Desktop.
#!/usr/bin/env python
# EXIF date converter
# Dependencies
# $ pip install piexif
import argparse
import datetime
import sys
import piexif
TIFF_DATE_TIME = 306
EXIF_DATE_TIME_ORIGINAL = 36867
EXIF_DATE_TIME_DIGITIZED = 36868
def print_date(filename):
exif_dict = piexif.load(filename)
tiff_date_time = exif_dict['0th'][TIFF_DATE_TIME]
date_original = exif_dict['Exif'][EXIF_DATE_TIME_ORIGINAL]
date_digitized = exif_dict['Exif'][EXIF_DATE_TIME_DIGITIZED]
print("""filename: {}
tiff_date_time: {}
exif_original: {}
exif_digitized: {}
""".format(filename, tiff_date_time, date_original, date_digitized))
def change_date(filename, target_date):
exif_dict = piexif.load(filename)
tiff_date_time = exif_dict['0th'][TIFF_DATE_TIME]
date_original = exif_dict['Exif'][EXIF_DATE_TIME_ORIGINAL]
date_digitized = exif_dict['Exif'][EXIF_DATE_TIME_DIGITIZED]
exif_dict['0th'][TIFF_DATE_TIME] = target_date
exif_dict['Exif'][EXIF_DATE_TIME_ORIGINAL] = target_date
exif_dict['Exif'][EXIF_DATE_TIME_DIGITIZED] = target_date
exif_bytes = piexif.dump(exif_dict)
piexif.insert(exif_bytes, filename)
#im.save(filename, "jpeg", exif=exif_bytes, quality=100, icc_profile=im.info.get('icc_profile'))
print("""filename: {}
tiff_date_time: {} => {}
exif_original: {} => {}
exif_digitized: {} => {}
""".format(filename, tiff_date_time, target_date, date_original, target_date, date_digitized, target_date))
def main(argv):
parser = argparse.ArgumentParser(description="EXIF Date Changer",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
group = parser.add_mutually_exclusive_group()
group.add_argument("--get", action="store_true", help="Get date of target files")
group.add_argument("--set-date", action="store", help="Set date. ('2020:04:04 14:00:00')")
parser.add_argument('filenames', metavar='FILENAME', type=str, nargs='+',
help='filenames of target operation')
args = parser.parse_args()
if len(args.filenames) == 0: # never happen by parser.
print("Wrong. filenames are empty.")
sys.exit(1)
elif args.get:
for filename in args.filenames:
print_date(filename)
elif args.set_date is not None:
target_date = args.set_date
# Validate the date format. If it's wrong, it throws.
d = datetime.datetime.strptime(target_date, '%Y:%m:%d %H:%M:%S')
if d is None:
print("--set-date format is wrong")
sys.exit(2)
for filename in args.filenames:
change_date(filename, target_date)
if __name__ == '__main__':
main(sys.argv)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment