summaryrefslogtreecommitdiffstats
path: root/webapp/django/core/files/images.py
diff options
context:
space:
mode:
Diffstat (limited to 'webapp/django/core/files/images.py')
-rw-r--r--webapp/django/core/files/images.py42
1 files changed, 42 insertions, 0 deletions
diff --git a/webapp/django/core/files/images.py b/webapp/django/core/files/images.py
new file mode 100644
index 0000000000..5ddcdd4322
--- /dev/null
+++ b/webapp/django/core/files/images.py
@@ -0,0 +1,42 @@
+"""
+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