vikkyshostak
@vikkyshostak
< This head full of dreams.

Django ImageKit. Как передать значение из поля в кастомный процессор внутри модели?

Приветствую.

Я использую Django ImageKit для обработки/обрезки загружаемых фото. Возникла необходимость добавлять к фото ещё и надпись. ОК. Написал кастомный процессор:

# ./example/processors.py

from django.conf import settings
from PIL import Image, ImageDraw, ImageFont

_default_font = ImageFont.truetype(settings.TEXT_OVERLAY_FONT_REGULAR, 24)


def add_text_overlay(image, text, font=_default_font):
    rgba_image = image.convert('RGBA')
    text_overlay = Image.new('RGBA', rgba_image.size, (255, 255, 255, 0))

    image_draw = ImageDraw.Draw(text_overlay)
    text_size_x, text_size_y = image_draw.textsize(text, font=font)
    text_xy = ((rgba_image.size[0] / 2) - (text_size_x / 2), (rgba_image.size[1] / 2) - (text_size_y / 2))

    image_draw.text(text_xy, text, font=font, fill=(255, 255, 255, 255))
    image_with_text_overlay = Image.alpha_composite(rgba_image, text_overlay)

    return image_with_text_overlay


class TextOverlayProcessor(object):
    def __init__(self, text='Lorem ipsum dolor sit amet'):
        """
        :param text: The overlay text, string.

        """
        self.text = text

    def process(self, img):
        return add_text_overlay(image=img, text=self.text)

Подскажите, пожалуйста, как передать значение из поля в этот кастомный процессор внутри модели? Что-то типа такого:

# ./example/models.py

from imagekit.models import ImageSpecField
from imagekit.processors import ResizeToFill
from .processors import TextOverlayProcessor


class Example(models.Model):
    description = models.CharField('Description', ...)
    image = models.ImageField('Picture', default=None)

    image_800x800 = ImageSpecField(
        source='image',
        processors=[
            ResizeToFill(800, 800), 
            TextOverlayProcessor(text=self.description) # но self, конечно же, нет в модели
        ], 
        format='JPEG',
        options={'quality': 100}
    )
    ...

Буду рад толковым комментариям.
Спасибо.
  • Вопрос задан
  • 516 просмотров
Решения вопроса 1
vikkyshostak
@vikkyshostak Автор вопроса
< This head full of dreams.
Решение, как всегда, оказалось проще пареной репы.

В processors.py добавляем в конец:

@register.generator('examle:example:image_800x800')
class OverlayImage(ImageSpec):
    format = 'JPEG'
    options = {'quality': 100}

    @property
    def processors(self):
        model, field_name = get_field_info(self.source)
        return [
            ResizeToFill(800, 800),
            TextOverlayProcessor(text=model.description)
        ]

В models.py просто переписываем image_800x800:

image_800x800 = ImageSpecField(
    source='image',
    id='tours:tours:image_800x800'
)
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы