MediaFile.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from os import path, getcwd
  2. from PIL import Image
  3. from pycs.observable import ObservableDict
  4. class MediaFile(ObservableDict):
  5. def __init__(self, obj, parent):
  6. super().__init__(obj, parent)
  7. def __get_file(self, id):
  8. file_directory = path.join(getcwd(), 'projects', self.parent['id'], 'data')
  9. file_name = id + self['extension']
  10. return file_directory, file_name
  11. def get_file(self):
  12. return self.__get_file(self['id'])
  13. def resize(self, maximum_width):
  14. # check if resized file already exists
  15. resized = MediaFile(self, self.parent)
  16. resized['id'] = self['id'] + '-' + maximum_width
  17. target_directory, target_name = self.__get_file(resized['id'])
  18. target_path = path.join(target_directory, target_name)
  19. if path.exists(target_path):
  20. return resized
  21. # load full size image
  22. current_directory, current_name = self.get_file()
  23. image = Image.open(path.join(current_directory, current_name))
  24. image_width, image_height = image.size
  25. # calculate target height
  26. maximum_width = int(maximum_width)
  27. maximum_height = int(maximum_width * image_height / image_width)
  28. # return self if requested size is larger than the image
  29. if image_width < maximum_width:
  30. return self
  31. # resize image
  32. resized_image = image.resize((maximum_width, maximum_height))
  33. # save to file
  34. resized_image.save(target_path, quality=80)
  35. return resized