--- /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()