py-exif/exif.py

86 lines
2.4 KiB
Python
Raw Normal View History

2022-05-27 10:50:23 +03:00
import json
import PIL.ExifTags
from PIL import Image, IptcImagePlugin, TiffImagePlugin
class Exif:
def __init__(self, filename: str):
self.filename = filename
self.exif = {}
try:
self.img = Image.open(self.filename)
self.img.verify()
self._readExif()
self._readIptc()
except:
print("Error Couldn't open image: %s" % filename)
def _readExif(self):
img = self.img._getexif()
for (key, value) in img.items():
if key in PIL.ExifTags.TAGS:
if isinstance(value, TiffImagePlugin.IFDRational):
value = float(value)
elif isinstance(value, tuple):
value = tuple(float(t) if isinstance(t, TiffImagePlugin.IFDRational) else t for t in value)
elif isinstance(value, bytes):
value = value.decode(errors="replace")
self.exif[PIL.ExifTags.TAGS[key]] = value
return self.exif
def _readIptc(self):
iptcTAGS = {
(1, 90): 'CodedCharacterSet',
(2, 0): 'RecordVersion',
(2, 5): 'ObjectName',
(2, 25): 'Keywords',
(2, 55): 'DateCreated',
(2, 60): 'TimeCreated',
(2, 62): 'DigitizationDate',
(2, 63): 'DigitizationTime',
(2, 80): 'Byline',
(2, 120): 'Caption',
2022-05-27 19:16:23 +03:00
(2, 90): 'City',
(2, 92): 'Sub location',
(2, 95): 'Province State',
(2, 100): 'Country Code',
(2, 101): 'Country Name',
2022-05-27 10:50:23 +03:00
}
img = IptcImagePlugin.getiptcinfo(self.img)
for (key, value) in img.items():
decoded = iptcTAGS.get(key, str(key))
if isinstance(value, list):
self.exif[decoded] = [x.decode('utf-8') for x in value]
else:
self.exif[decoded] = value.decode('utf-8')
return self.exif
def getValue(self, value):
2022-05-30 00:22:39 +03:00
if value in self.exif.keys():
2022-05-27 10:50:23 +03:00
return self.exif[value]
2022-05-30 00:22:39 +03:00
else:
return {}
2022-05-27 10:50:23 +03:00
def getJson(self):
return json.dumps(self.exif)
2022-05-27 16:25:31 +03:00
def getDic(self):
return self.exif
2022-05-27 10:50:23 +03:00
def __str__(self):
return self.filename
xxx = Exif('./photo.jpg')
print(xxx.getJson())
print(xxx.getValue('Keywords'))
print(xxx.getValue('DateTimeOriginal'))
2022-05-27 16:25:31 +03:00
print(xxx.getDic())
2022-05-27 10:50:23 +03:00
print(xxx)