2008-08-09 04:59:02 +08:00
|
|
|
"""
|
|
|
|
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."""
|
2008-08-09 05:57:25 +08:00
|
|
|
from PIL import ImageFile as PILImageFile
|
|
|
|
p = PILImageFile.Parser()
|
2009-05-08 18:56:51 +08:00
|
|
|
close = False
|
2008-08-09 04:59:02 +08:00
|
|
|
if hasattr(file_or_path, 'read'):
|
|
|
|
file = file_or_path
|
|
|
|
else:
|
|
|
|
file = open(file_or_path, 'rb')
|
2009-05-08 18:56:51 +08:00
|
|
|
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()
|