171 lines
5.7 KiB
Python
171 lines
5.7 KiB
Python
#!/usr/bin/env python
|
|
|
|
from PIL import Image
|
|
from _raw_photo import get_raw_image_dimensions
|
|
from _image_tag import ImageTag
|
|
|
|
# https://exiftool.org/TagNames/EXIF.html
|
|
# https://exiftool.org/TagNames/Sony.html
|
|
|
|
class PhotoFile:
|
|
def __init__(self,path_file_name,*args,**kwargs):
|
|
super(PhotoFile, self).__init__(*args, **kwargs)
|
|
self.path_file_name = path_file_name
|
|
self.args = args
|
|
self.kwargs = kwargs
|
|
self.img = None
|
|
self.image_tag = ImageTag(path_file_name=self.path_file_name)
|
|
self.is_jpg = self.is_photo_jpeg()
|
|
self.is_raw = self.is_photo_raw()
|
|
self.size_width = self.get_photo_width()
|
|
self.size_height = self.get_photo_height()
|
|
self.size = self.get_photo_size()
|
|
self.mpixels = self.get_photo_megapixels()
|
|
self.size_ratio = self.get_photo_size_ratio()
|
|
self.dpi = self.get_dpi()
|
|
self.iso = self.get_iso()
|
|
self.aperture = self.get_aperture()
|
|
self.camera_brand = self.get_camera_brand()
|
|
self.camera_model = self.get_camera_model()
|
|
self.lens_make = self.get_lens_make()
|
|
self.lens_model = self.get_lens_model()
|
|
self.focal_length = self.get_focal_length()
|
|
self.photo_meta = {}
|
|
self.photo_capture_date = self.get_photo_capture_date()
|
|
|
|
|
|
def get_photo_capture_date(self):
|
|
return self.image_tag.date_time_original
|
|
|
|
def is_photo_raw(self):
|
|
# TODO: Actually inspect the mime type instead of relying on an extension.
|
|
if self.path_file_name.lower().endswith('jpg') \
|
|
or self.path_file_name.lower().endswith('.jpeg'):
|
|
self.is_raw = False
|
|
self.is_jpg = True
|
|
self.img = Image.open(self.path_file_name)
|
|
else:
|
|
self.is_raw = True
|
|
self.is_jpg = False
|
|
|
|
return self.is_raw
|
|
|
|
def is_photo_jpeg(self):
|
|
# TODO: Stop making assumption. #Life-Lessons
|
|
self.is_photo_raw()
|
|
return self.is_jpg
|
|
|
|
def get_photo_width(self):
|
|
if self.is_jpg:
|
|
width = self.img.width
|
|
elif self.is_raw:
|
|
width = get_raw_image_dimensions(self.path_file_name)[1]
|
|
else:
|
|
width = None
|
|
return width
|
|
|
|
def get_photo_height(self):
|
|
if self.is_jpg:
|
|
height = self.img.height
|
|
elif self.is_raw:
|
|
height = get_raw_image_dimensions(self.path_file_name)[0]
|
|
else:
|
|
height = None
|
|
return height
|
|
|
|
def get_photo_size(self):
|
|
if self.size_width is None:
|
|
self.size_width = self.get_photo_width()
|
|
if self.size_height is None:
|
|
self.size_height = self.get_photo_height()
|
|
return f'{self.size_width}x{self.size_height}'
|
|
|
|
def get_photo_size_ratio(self):
|
|
if self.size_width is None:
|
|
self.size_width = self.get_photo_width()
|
|
if self.size_height is None:
|
|
self.size_height = self.get_photo_height()
|
|
return float(self.size_width / self.size_height)
|
|
|
|
def get_photo_megapixels(self):
|
|
if self.size_width is None:
|
|
self.size_width = self.get_photo_width()
|
|
if self.size_height is None:
|
|
self.size_height = self.get_photo_height()
|
|
return self.size_width * self.size_height
|
|
|
|
def get_dpi(self):
|
|
return self.image_tag.get_image_tag("xresolution")
|
|
|
|
def get_iso(self):
|
|
return self.image_tag.get_image_tag( 'iso')
|
|
|
|
def get_aperture(self):
|
|
return self.image_tag.get_image_tag('fnumber')
|
|
|
|
def get_camera_brand(self):
|
|
tag = self.image_tag.get_image_tag('Make')
|
|
return tag
|
|
|
|
def get_camera_model(self):
|
|
tag = self.image_tag.get_image_tag('cameramodelname')
|
|
if tag is None:
|
|
tag = self.image_tag.get_image_tag('image model')
|
|
return tag
|
|
|
|
def get_camera_firmware(self):
|
|
tag = self.image_tag.get_image_tag('CameraFirmware')
|
|
return tag
|
|
|
|
def get_camera_serial_number(self):
|
|
tag = self.image_tag.get_image_tag('CameraSerialNumber')
|
|
return tag
|
|
|
|
def get_lens_make(self):
|
|
return self.image_tag.get_image_tag('lensmake')
|
|
|
|
def get_lens_model(self):
|
|
return self.image_tag.get_image_tag('lensmodel')
|
|
|
|
def get_lens_serial(self):
|
|
pass
|
|
|
|
def get_focal_length(self):
|
|
return self.image_tag.get_image_tag('focallength')
|
|
|
|
def get_photographer(self):
|
|
pass
|
|
|
|
def get_orientation(self):
|
|
pass
|
|
|
|
def get_sony_raw_type(self):
|
|
pass
|
|
|
|
def get_exposure_program(self):
|
|
pass
|
|
|
|
def get_photo_meta(self):
|
|
photo_meta = {
|
|
'photo': {
|
|
'aperture': self.aperture,
|
|
'camera_brand': self.camera_brand,
|
|
'camera_model': self.camera_model,
|
|
'dpi': self.dpi,
|
|
'is_jpg': self.is_jpg,
|
|
'is_raw': self.is_raw,
|
|
'iso': self.iso,
|
|
'lens_make': self.lens_make,
|
|
'lens_model': self.lens_model,
|
|
'lens_focal_length': self.focal_length,
|
|
'size': {
|
|
'height': self.size_height,
|
|
'width': self.size_width,
|
|
'width_height': self.size,
|
|
'megapixels': self.mpixels,
|
|
'ratio': self.size_ratio
|
|
}
|
|
}
|
|
}
|
|
|
|
return photo_meta |