Удобная работа с картинками в Django

в 18:07, , рубрики: django, image resize, Веб-разработка, метки: ,

Imagekit — приложение, которое позволяет производить манипуляции над изображениями, без изменения исходной картинки. Я думаю удобство и так понятно, Вы можете иметь несколько вариантов картинки и всегда иметь возможность вернуться к исходнику.

Позволяет изменять размеры, создавать превью, накладывать водяные знаки.

Установка

Для работы с imagekit вам понадобится PIL или PILLOW
Ставим из PyPI:

pip install django-imagekit 

Добавляем 'imagekit' в INSTALLED_APPS

Использование в модели
import PIL
...
from PIL import Image
from imagekit.models.fields import ImageSpecField
from imagekit.processors import ResizeToFit, Adjust,ResizeToFill

class Jobseeker(models.Model):
    def get_file_path(self, filename):
        extension = filename.split('.')[-1]
        filename = "%s.%s" % (uuid.uuid4(), extension)
        return os.path.join("images", filename)
        ...
        photo = models.ImageField(verbose_name=u'Poster',upload_to=get_file_path,max_length=256, blank=True, null=True)
        photo_small =ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
            ResizeToFill(50, 50)], image_field='photo',
            format='JPEG', options={'quality': 90})
        photo_medium =ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
            ResizeToFit(300, 200)], image_field='photo',
            format='JPEG', options={'quality': 90})
       photo_big =ImageSpecField([Adjust(contrast=1.2, sharpness=1.1),
            ResizeToFit(640, 480)], image_field='photo',
            format='JPEG', options={'quality': 90})

Использование в шаблоне

В view.py передаем обьект

def some_def(request):
    ...
    photo  = Jobseeker.objects.get()
    ...
   return (render_to_response('jobseeker/resume_template.html',
       {
       ...
      'photo': photo,
       ...
       },  context_instance=RequestContext(request))
       )

и в шаблоне мы можем обратиться к таким полям:

photo.photo_small.url # превью размером 50х50
photo.photo_medium.url # изображение приведенное к размерам 300х200
photo.photo_big.url # изображение приведенное к размерам 640х480
# можем обратиться к свойствам картинки
photo.photo_small.width #вернет 50
photo.photo.width #вернет ширину оригинальной картинки

В данном примере мы использовали 2 image процессора, а именно: ResizeToFit и ResizeToFill.
На самом деле их несколько больше — processors Module

ResizeToFit(width=None, height=None, upscale=None, mat_color=None, anchor='c')

Назначение: будет создано изображение с указанными размерами, на которое наложено исходное изображение, пропорционально сжатое, что бы не выходить за указанные рамки.
width=None, height=None — ширина и высота, соответственно.
upscale — булево значение, определяющее, будет ли увеличено изображение, если оно меньше указанных параметров
mat_color — цвет заливки незаполенной исходным изображением области.

ResizeToFill(width, height)

Назначение: изменить размер до указанных размеров, все что выходит за указанные размеры будет обрезано
В атрибутах соответственно указывается шинира и высота.

Примеры работы

Оригинальное фото

Удобная работа с картинками в Django

ResizeToFill

Удобная работа с картинками в Django

ResizeToFit с применением параметра mat_color, чтобы показать реальные размеры нового изображения

Удобная работа с картинками в Django

Все дополнительные картинки созданные с помощью imagekit сохраняются в папке caсhe, все оригиналы сохранены в отдельной папке. Создаются при первом заходе на страницу в которой используются. В любое время все картинки можно удалить без вреда для оригинала и создать заново с новыми параметрами.
Все это очень облегчает работу с изображениями, и сохраняет нервы разработчика, если начальные настройки вдруг оказались не верными, а оригиналы не додумались сохранить.

Ссылки:
Github
Документация

Автор: int22h

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js