Automated image processing for Django. Currently v4.0
Find a file
Matthew Tretter 51144daeb6 Fix bug
Eric's fixes in c00ea10b0a meant that
some of the code that already existed to reuse objects would actually
be run for the first time. Naturally, there were some bugs; namely, I
was storing a filename (instead of a File object) in `_file` and a bad
else clause.
2011-09-25 16:18:52 -04:00
imagekit Fix bug 2011-09-25 16:18:52 -04:00
.gitignore Adding distutils stuff to .gitignore. 2011-02-11 12:59:24 -08:00
AUTHORS Adding Josh to the contributors list. 2011-06-28 11:40:29 -07:00
LICENSE Wrangling in a stray line. 2011-02-10 15:20:40 -08:00
MANIFEST.in Fleshing out setup.py. Adding MANIFEST.in. 2011-02-11 01:27:10 -08:00
README.rst Changed how cache files are named. 2011-09-18 21:08:49 -04:00
setup.py Being a good PyPI citizen. 2011-06-28 11:38:42 -07:00

===============
django-imagekit
===============

ImageKit In 6 Steps
===================

Step 1
******

::

    $ pip install django-imagekit

(or clone the source and put the imagekit module on your path)

Step 2
******

Create an ImageModel subclass and add specs to it.

::

    # myapp/models.py

    from django.db import models
    from imagekit.models import ImageModel
    from imagekit.specs import ImageSpec
    from imagekit.processors import Crop, Fit, Adjust

    class Photo(ImageModel):
        name = models.CharField(max_length=100)
        original_image = models.ImageField(upload_to='photos')
        num_views = models.PositiveIntegerField(editable=False, default=0)

        thumbnail_image = ImageSpec([Crop(100, 75), Adjust(contrast=1.2, sharpness=1.1)], quality=90, pre_cache=True, image_field='original_image', cache_to='cache/photos/thumbnails/')
        display = ImageSpec([Fit(600)], quality=90, increment_count=True, image_field='original_image', cache_to='cache/photos/display/', save_count_as='num_views')


Of course, you don't have to define your ImageSpecs inline if you don't want to:

::

    # myapp/specs.py

    from imagekit.specs import ImageSpec
    from imagekit.processors import Crop, Fit, Adjust

    class _BaseSpec(ImageSpec):
        quality = 90        
        image_field = 'original_image'

    class DisplaySpec(_BaseSpec):
        pre_cache = True
        increment_count = True
        save_count_as = 'num_views'
        processors = [Fit(600)]
        cache_to = 'cache/photos/display/'

    class ThumbnailSpec(_BaseSpec):
        processors = [Crop(100, 75), Adjust(contrast=1.2, sharpness=1.1)]
        cache_to = 'cache/photos/thumbnails/'

    # myapp/models.py

    from django.db import models
    from imagekit.models import ImageModel
    from myapp.specs import DisplaySpec, ThumbnailSpec

    class Photo(ImageModel):
        name = models.CharField(max_length=100)
        original_image = models.ImageField(upload_to='photos')
        num_views = models.PositiveIntegerField(editable=False, default=0)

        thumbnail_image = ThumbnailSpec()
        display = DisplaySpec()
            

Step 3
******

Flush the cache and pre-generate thumbnails (ImageKit has to be added to ``INSTALLED_APPS`` for management command to work).

::

    $ python manage.py ikflush myapp

Step 4
******

Use your new model in templates.

::

    <div class="original">
    <img src="{{ photo.original_image.url }}" alt="{{ photo.name }}">
    </div>

    <div class="display">
    <img src="{{ photo.display.url }}" alt="{{ photo.name }}">
    </div>

    <div class="thumbs">
    {% for p in photos %}
    <img src="{{ p.thumbnail_image.url }}" alt="{{ p.name }}">
    {% endfor %}
    </div>

Step 5
******

Play with the API.

::

    >>> from myapp.models import Photo
    >>> p = Photo.objects.all()[0]
    <Photo: MyPhoto>
    >>> p.display.url
    u'/static/photos/myphoto_display.jpg'
    >>> p.display.width
    600
    >>> p.display.height
    420
    >>> p.display.image
    <JpegImagePlugin.JpegImageFile instance at 0xf18990>
    >>> p.display.file
    <File: /path/to/media/photos/myphoto_display.jpg>
    >>> p.display.spec
    <class 'myapp.specs.Display'>

Step 6
******

Enjoy a nice beverage.

::

    from refrigerator import beer

    beer.enjoy()