| """ |
| Utility functions for handling images. |
| |
| Requires PIL, as you might imagine. |
| """ |
| |
| from django.core.files import File |
| |
| class ImageFile(File): |
| """ |
| A mixin for use alongside django.core.files.base.File, which provides |
| additional features for dealing with images. |
| """ |
| def _get_width(self): |
| return self._get_image_dimensions()[0] |
| width = property(_get_width) |
| |
| def _get_height(self): |
| return self._get_image_dimensions()[1] |
| height = property(_get_height) |
| |
| def _get_image_dimensions(self): |
| if not hasattr(self, '_dimensions_cache'): |
| self._dimensions_cache = get_image_dimensions(self) |
| return self._dimensions_cache |
| |
| def get_image_dimensions(file_or_path): |
| """Returns the (width, height) of an image, given an open file or a path.""" |
| from PIL import ImageFile as PILImageFile |
| p = PILImageFile.Parser() |
| if hasattr(file_or_path, 'read'): |
| file = file_or_path |
| else: |
| file = open(file_or_path, 'rb') |
| while 1: |
| data = file.read(1024) |
| if not data: |
| break |
| p.feed(data) |
| if p.image: |
| return p.image.size |
| return None |