Използване на django-imagekit за обработка на създаване на thumbnail изображения

Публикувано на

Когато правех галерията на този сайт, реших да не ползвам външна библиотека за генериране на умалените изображения. Тогава видях, че Image обектите от PIL библиотеката имат метод thumbnail и мога да ги създавам директно. В началото ми се видя добро решение, но все пак някак си save метода на модела Picture беше станал много грозен. За справка старият ми код. Използвах self.image._committed, правех неща преду super правех неща след super в следсвие от неща взети преди super. Не използвах default_storage, което означава, че кодът ми не е приложим ако медиа файловете не се намират на сървъра, на който се изпълнява сайта (повече подробностти за Django Storage-ите тук).

За служебни проекти съм ползвал easy-thumbnails, но тези дни за пореден път бях чул от един колега за django-imagekit. Основната разликата между двете е мястото на дефиниране на thumbnail-ите. При easy-thumbnails това се прави с темплейтен таг, докато при imagekit се дефинират в модела като допълнителни полета. Най-близко до текущото ми решение за галерия беше django-imagekit. При мен също умаленото изображение беше дефинирано в модела. 

Интеграцията с django-imagekit премина в следните стъпки:

Инсталиране на пакета с pip

$ pip install django-imagekit

Добавяне в INSTALLED_APPS

INSTALLED_APPS = (
    ...
    'imagekit',
    ...
)

Използване на двете специални полета в модела:

from imagekit.models import ProcessedImageField, ImageSpecField
from imagekit.processors import ResizeToFit class Picture(models.Model): MAX_WIDTH = 900 MAX_HEIGHT = 600 MAX_THUMB_WIDTH = 130 MAX_THUMB_HEIGHT = 100 image = ProcessedImageField(upload_to='pictures', processors=[ResizeToFit(MAX_WIDTH, MAX_HEIGHT)], format='JPEG', options={'quality': 95}) thumb = ImageSpecField(image_field='image', processors=[ResizeToFit(MAX_THUMB_WIDTH, MAX_THUMB_HEIGHT)], format='JPEG', options={'quality': 60})

ProcessedImageField се ползва за да промени размера на изображението по време на качване. Така на сървъра се пази директно преоразмерена картинка.

ImageSpecField е виртуално поле, което създава умалено изображение при необходимост (в момента на първо прочитане). Това поле е виртуално понеже не създава колона в базата данни.

ResizeToFit е процесор за преоразмеряване, който запазва оригиналните пропорции но смалява изображението да се побере в оказаните рамки. Django-imagekit притежава и процесори за кропване, като дори има интелигнтно кропване (предполага на коя част от изображението да наблегне)

Пълната документация на пакета може да бъде видяна на адрес http://django-imagekit.readthedocs.org/en/latest/

Със съвсем малко код и малко промени успях да се постига желаният резултат. Сега кодът ми е много по-изчистен, не използвам допълнително поле в базата, умаленото изображение се генерира при първо зареждане, като по-този начин не се бави процеса на качване.

blog comments powered by Disqus