exif_shift.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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('shift 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. offsetCodes = codesOfLabelsContaining('OffsetTime')
  19. filenames = sys.argv[1:]
  20. formatDate = '%Y:%m:%d %H:%M:%S'
  21. formatFrom = f"b'{formatDate}'"
  22. def dateTimeOf(exif):
  23. for k in dateTimeCodes:
  24. if k in exif.keys():
  25. return dt.datetime.strptime(str(exif[k]), formatFrom)
  26. return dt.datetime.now()
  27. def describeExif(exif):
  28. for k in timeCodes:
  29. if k in exif.keys():
  30. print('Exif[', k, ']=', exif[k], '->', x.TAGS['Exif'][k]['name'])
  31. else:
  32. print('Exif[', k, ']=', '?', '->', x.TAGS['Exif'][k]['name'])
  33. def shiftDateTime(exifDict):
  34. e = exifDict['Exif']
  35. t = dateTimeOf(e)
  36. print('Shifting')
  37. print(t)
  38. targetDateTime = t + shift
  39. print('to')
  40. print(targetDateTime)
  41. for k in dateTimeCodes:
  42. e[k] = targetDateTime.strftime(formatDate).encode()
  43. return exifDict
  44. def overrideOffset(exifDict, offset: str):
  45. e = exifDict['Exif']
  46. offsetBytes = offset.encode()
  47. for k in offsetCodes:
  48. print('Exif[', k, ']=', e[k], '->', offsetBytes, ':', x.TAGS['Exif'][k]['name'])
  49. e[k] = offsetBytes
  50. return exifDict
  51. for filename in filenames:
  52. print(filename)
  53. exifDict = x.load(filename)
  54. describeExif(exifDict['Exif'])
  55. exifDict = shiftDateTime(exifDict)
  56. exifDict = overrideOffset(exifDict, '+02:00')
  57. describeExif(exifDict['Exif'])
  58. exifBytes = x.dump(exifDict)
  59. x.insert(exifBytes, filename)
  60. print()