1 | # Das Skript findet alle HDR Bilder in einem Unterverzeichnis und kopiert die
|
2 | # jeweils zusammengehörenden Bilder in ein Unterverzeichnis.
|
3 | # (max. Zeit zwischen zwei Bilder ist in der Variable DELTA definiert)
|
4 | #
|
5 | # Author ist Tom
|
6 | # http://www.mikrocontroller.net/topic/239663#2434707
|
7 |
|
8 | # Zur Vorsicht wird nichts verschoben, sondern es werden Befehle
|
9 | # ausgegeben, die man in ein hinterher auszuführendes Shellscript umleiten kann
|
10 |
|
11 | #!/usr/bin/python
|
12 |
|
13 | # max zeitabstand in sekunden
|
14 | DELTA = 3
|
15 |
|
16 | import sys
|
17 | import os
|
18 | import re
|
19 | from PIL import Image
|
20 | from PIL.ExifTags import TAGS
|
21 | from datetime import datetime
|
22 |
|
23 | def get_exif(fn):
|
24 | '''exif-daten zu einer datei fn lesen'''
|
25 | ret = {}
|
26 | i = Image.open(fn)
|
27 | info = i._getexif()
|
28 | for tag, value in info.items():
|
29 | decoded = TAGS.get(tag, tag)
|
30 | ret[decoded] = value
|
31 | return ret
|
32 |
|
33 | def get_date(fn):
|
34 | '''DateTimeOriginal aus datei als datetime'''
|
35 | info = get_exif(fn)
|
36 | d = info['DateTimeOriginal']
|
37 | return datetime.strptime(d, '%Y:%m:%d %H:%M:%S')
|
38 |
|
39 | def build_dict(files):
|
40 | '''dict aus zeit und dateinamen'''
|
41 | res = dict()
|
42 | for f in files:
|
43 | d = get_date(f)
|
44 | if d not in res:
|
45 | res[d] = list()
|
46 | res[d].append(f)
|
47 | return res
|
48 |
|
49 | def sec_delta(a,b):
|
50 | '''abstand zwischen zwei datetimes'''
|
51 | td = a - b
|
52 | # mit python 2.7 ginge das eleganter:
|
53 | return abs((td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6 )
|
54 |
|
55 | def sort_and_group(di):
|
56 | '''list mit lists aus files mit zeitabstand <= DELTA'''
|
57 | res=list()
|
58 | dates = sorted(di.keys())
|
59 | last_d = dates[0]
|
60 | group = list()
|
61 | for x in di[last_d]:
|
62 | group.append(x)
|
63 | group_saved = True
|
64 | for d in dates[1:]:
|
65 | diff = sec_delta(d , last_d)
|
66 | if diff > DELTA: #neue list anfangen, alte ins ergebnis schubsen
|
67 | res.append(group)
|
68 | group = list()
|
69 | group_saved = True
|
70 | for x in di[d]:
|
71 | group.append(x)
|
72 | group_saved = False
|
73 | last_d = d
|
74 | if not group_saved:
|
75 | res.append(group)
|
76 | return res
|
77 |
|
78 | def move_sorted(d, wd):
|
79 | '''order fuer jede gruppe von mehr als einem file erstellen und files verschieben, gibt nur shellbefehle aus'''
|
80 | num = 1
|
81 | for p in d:
|
82 | if len(p) > 1:
|
83 | foldername = '%s\\HDR\\HDR_%05d' % (wd, num)
|
84 | num += 1
|
85 | print 'mkdir "%s"' % foldername
|
86 | for f in p:
|
87 | print 'move "%s" "%s/"' % (f, foldername)
|
88 | else:
|
89 | print 'REM ignoring %s' % (p[0])
|
90 |
|
91 | def list_files(d):
|
92 | ''' alle jpgs aus ordner d'''
|
93 | return [os.path.join(d, f) for f in os.listdir(d) if re.match('\.jpe?g$', os.path.splitext(f)[1], re.IGNORECASE ) ]
|
94 |
|
95 | if __name__ == '__main__':
|
96 | working_dir = sys.argv[1].rstrip('/')
|
97 | pics = list_files(working_dir)
|
98 | picswithdate = build_dict(pics)
|
99 |
|
100 | if False:
|
101 | picswithdate = dict()
|
102 | picswithdate[datetime(2010, 1, 1, 2, 3, 4)] = ['a0']
|
103 | picswithdate[datetime(2010, 1, 1, 2, 3, 5)] = ['a1']
|
104 | picswithdate[datetime(2010, 1, 1, 2, 3, 12)] = ['a2']
|
105 | picswithdate[datetime(2010, 1, 1, 2, 3, 12)].append('a3')
|
106 | picswithdate[datetime(2010, 1, 1, 2, 3, 13)] = ['a4']
|
107 | picswithdate[datetime(2010, 1, 1, 2, 3, 30)] = ['a5']
|
108 | picswithdate[datetime(2010, 1, 1, 2, 3, 32)] = ['a6']
|
109 | pics_sorted = sort_and_group(picswithdate)
|
110 | move_sorted(pics_sorted, working_dir)
|