-
Notifications
You must be signed in to change notification settings - Fork 0
/
image metadata.py
87 lines (74 loc) · 2.88 KB
/
image metadata.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
from PIL import Image
from PIL.ExifTags import TAGS, GPSTAGS
class ImageMetaData(object):
'''
Extract the exif data from any image. Data includes GPS coordinates,
Focal Length, Manufacture, and more.
'''
exif_data = None
image = None
def __init__(self, img_path):
self.image = Image.open(img_path)
#print(self.image._getexif())
self.get_exif_data()
super(ImageMetaData, self).__init__()
def get_exif_data(self):
"""Returns a dictionary from the exif data of an PIL Image item. Also converts the GPS Tags"""
exif_data = {}
info = self.image._getexif()
if info:
for tag, value in info.items():
decoded = TAGS.get(tag, tag)
if decoded == "GPSInfo":
gps_data = {}
for t in value:
sub_decoded = GPSTAGS.get(t, t)
gps_data[sub_decoded] = value[t]
exif_data[decoded] = gps_data
else:
exif_data[decoded] = value
self.exif_data = exif_data
return exif_data
def get_if_exist(self, data, key):
if key in data:
return data[key]
return None
def convert_to_degress(self, value):
"""Helper function to convert the GPS coordinates
stored in the EXIF to degress in float format"""
d0 = value[0][0]
d1 = value[0][1]
d = float(d0) / float(d1)
m0 = value[1][0]
m1 = value[1][1]
m = float(m0) / float(m1)
s0 = value[2][0]
s1 = value[2][1]
s = float(s0) / float(s1)
return d + (m / 60.0) + (s / 3600.0)
def get_lat_lng(self):
"""Returns the latitude and longitude, if available, from the provided exif_data (obtained through get_exif_data above)"""
lat = None
lng = None
exif_data = self.get_exif_data()
#print(exif_data)
if "GPSInfo" in exif_data:
gps_info = exif_data["GPSInfo"]
gps_latitude = self.get_if_exist(gps_info, "GPSLatitude")
gps_latitude_ref = self.get_if_exist(gps_info, 'GPSLatitudeRef')
gps_longitude = self.get_if_exist(gps_info, 'GPSLongitude')
gps_longitude_ref = self.get_if_exist(gps_info, 'GPSLongitudeRef')
if gps_latitude and gps_latitude_ref and gps_longitude and gps_longitude_ref:
lat = self.convert_to_degress(gps_latitude)
if gps_latitude_ref != "N":
lat = 0 - lat
lng = self.convert_to_degress(gps_longitude)
if gps_longitude_ref != "E":
lng = 0 - lng
return lat, lng
path_name = 'image0.jpg'
meta_data = ImageMetaData(path_name)
latlng =meta_data.get_lat_lng()
print(latlng)
exif_data = meta_data.get_exif_data()
print(exif_data)