HDRsearch.py


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)