You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
42 lines
1.1 KiB
42 lines
1.1 KiB
""" |
|
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
|
|
|