app/django/core/files/images.py
changeset 323 ff1a9aa48cfd
equal deleted inserted replaced
322:6641e941ef1e 323:ff1a9aa48cfd
       
     1 """
       
     2 Utility functions for handling images.
       
     3 
       
     4 Requires PIL, as you might imagine.
       
     5 """
       
     6 
       
     7 from django.core.files import File
       
     8 
       
     9 class ImageFile(File):
       
    10     """
       
    11     A mixin for use alongside django.core.files.base.File, which provides
       
    12     additional features for dealing with images.
       
    13     """
       
    14     def _get_width(self):
       
    15         return self._get_image_dimensions()[0]
       
    16     width = property(_get_width)
       
    17 
       
    18     def _get_height(self):
       
    19         return self._get_image_dimensions()[1]
       
    20     height = property(_get_height)
       
    21 
       
    22     def _get_image_dimensions(self):
       
    23         if not hasattr(self, '_dimensions_cache'):
       
    24             self._dimensions_cache = get_image_dimensions(self)
       
    25         return self._dimensions_cache
       
    26 
       
    27 def get_image_dimensions(file_or_path):
       
    28     """Returns the (width, height) of an image, given an open file or a path."""
       
    29     from PIL import ImageFile as PILImageFile
       
    30     p = PILImageFile.Parser()
       
    31     if hasattr(file_or_path, 'read'):
       
    32         file = file_or_path
       
    33     else:
       
    34         file = open(file_or_path, 'rb')
       
    35     while 1:
       
    36         data = file.read(1024)
       
    37         if not data:
       
    38             break
       
    39         p.feed(data)
       
    40         if p.image:
       
    41             return p.image.size
       
    42     return None