Bladeren bron

:wrench: Fix exif offset

DricomDragon 1 maand geleden
bovenliggende
commit
8e1f286d6d
1 gewijzigde bestanden met toevoegingen van 42 en 16 verwijderingen
  1. 42 16
      exifScripts/exif_shift.py

+ 42 - 16
exifScripts/exif_shift.py

@@ -4,52 +4,78 @@ import sys
 import piexif as x
 import datetime as dt
 
-shift = dt.timedelta(hours = 1)
+shift = dt.timedelta(hours = 1, minutes = 6)
 print('Shift exif date time by', shift)
 
 if len(sys.argv) < 1:
     print('shift img1.jpg img2.jpg')
     quit()
 
+def codesOfLabelsContaining(value: str):
+    codes = []
+    for (k, v) in x.TAGS['Exif'].items():
+        if value in v['name']:
+            codes.append(k)
+    return codes
 
-timeTagCodes = [36867, 36868]
+timeCodes = codesOfLabelsContaining('Time')
+dateTimeCodes = codesOfLabelsContaining('DateTime')
+offsetCodes = codesOfLabelsContaining('OffsetTime')
 
 filenames = sys.argv[1:]
 
 formatDate = '%Y:%m:%d %H:%M:%S'
 formatFrom = f"b'{formatDate}'"
 
+
+def dateTimeOf(exif):
+    for k in dateTimeCodes:
+        if k in exif.keys():
+            return dt.datetime.strptime(str(exif[k]), formatFrom)
+    return dt.datetime.now()
+
+
 def describeExif(exif):
-    for k in timeTagCodes:
+    for k in timeCodes:
         if k in exif.keys():
-            t = dt.datetime.strptime(str(exif[k]), formatFrom)
-            print('Exif[', k, ']=', t, '->', x.TAGS['Exif'][k]['name'])
+            print('Exif[', k, ']=', exif[k], '->', x.TAGS['Exif'][k]['name'])
         else:
             print('Exif[', k, ']=', '?', '->', x.TAGS['Exif'][k]['name'])
-    return t
-
 
-def shiftThisFile(filename: str):
-    m = x.load(filename)
-    e = m['Exif']
-    t = describeExif(e)
 
-    targetDateTime = t + shift
+def shiftDateTime(exifDict):
+    e = exifDict['Exif']
+    t = dateTimeOf(e)
     print('Shifting')
     print(t)
+
+    targetDateTime = t + shift
     print('to')
     print(targetDateTime)
 
-    for k in timeTagCodes:
+    for k in dateTimeCodes:
         e[k] = targetDateTime.strftime(formatDate).encode()
 
-    describeExif(e)
-    return m
+    return exifDict
+
+
+def overrideOffset(exifDict, offset: str):
+    e = exifDict['Exif']
+    offsetBytes = offset.encode()
+    for k in offsetCodes:
+        print('Exif[', k, ']=', e[k], '->', offsetBytes, ':', x.TAGS['Exif'][k]['name'])
+        e[k] = offsetBytes
+
+    return exifDict
 
 
 for filename in filenames:
     print(filename)
-    exifDict = shiftThisFile(filename)
+    exifDict = x.load(filename)
+    describeExif(exifDict['Exif'])
+    exifDict = shiftDateTime(exifDict)
+    exifDict = overrideOffset(exifDict, '+02:00')
+    describeExif(exifDict['Exif'])
     exifBytes = x.dump(exifDict)
     x.insert(exifBytes, filename)
     print()