exif_shift.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #!/usr/bin/python3
  2. import sys
  3. import piexif as x
  4. import datetime as dt
  5. shift = dt.timedelta(hours = 1, minutes = 6)
  6. print('Shift exif date time by', shift)
  7. if len(sys.argv) <= 1:
  8. print(sys.argv[0], 'img1.jpg img2.jpg')
  9. quit()
  10. def codesOfLabelsContaining(value: str):
  11. codes = []
  12. for (k, v) in x.TAGS['Exif'].items():
  13. if value in v['name']:
  14. codes.append(k)
  15. return codes
  16. timeCodes = codesOfLabelsContaining('Time')
  17. dateTimeCodes = codesOfLabelsContaining('DateTime')
  18. filenames = sys.argv[1:]
  19. formatDate = '%Y:%m:%d %H:%M:%S'
  20. formatFrom = f"b'{formatDate}'"
  21. def dateTimeOf(exif):
  22. for k in dateTimeCodes:
  23. if k in exif.keys():
  24. return dt.datetime.strptime(str(exif[k]), formatFrom)
  25. return dt.datetime.now()
  26. def describeExif(exif):
  27. for k in timeCodes:
  28. if k in exif.keys():
  29. print('Exif[', k, ']=', exif[k], '->', x.TAGS['Exif'][k]['name'])
  30. else:
  31. print('Exif[', k, ']=', '?', '->', x.TAGS['Exif'][k]['name'])
  32. def shiftDateTime(exifDict):
  33. e = exifDict['Exif']
  34. t = dateTimeOf(e)
  35. print('Shifting')
  36. print(t)
  37. targetDateTime = t + shift
  38. print('to')
  39. print(targetDateTime)
  40. for k in dateTimeCodes:
  41. e[k] = targetDateTime.strftime(formatDate).encode()
  42. return exifDict
  43. for filename in filenames:
  44. print(filename)
  45. exifDict = x.load(filename)
  46. describeExif(exifDict['Exif'])
  47. exifDict = shiftDateTime(exifDict)
  48. describeExif(exifDict['Exif'])
  49. exifBytes = x.dump(exifDict)
  50. x.insert(exifBytes, filename)
  51. print()