diff -r 000000000000 -r 0d40e90630ef web/lib/django/core/files/images.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/django/core/files/images.py Wed Jan 20 00:34:04 2010 +0100 @@ -0,0 +1,52 @@ +""" +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'): + close = self.closed + self.open() + self._dimensions_cache = get_image_dimensions(self) + if close: + self.close() + 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() + close = False + if hasattr(file_or_path, 'read'): + file = file_or_path + else: + file = open(file_or_path, 'rb') + close = True + try: + while 1: + data = file.read(1024) + if not data: + break + p.feed(data) + if p.image: + return p.image.size + return None + finally: + if close: + file.close()