0

我使用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)

但是如何将值从字段传输到模型内部的自定义 ImageKit 处理器?像这样的东西:

# ./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) # but `self` is wrong and raise error
        ], 
        format='JPEG',
        options={'quality': 100}
    )
    ...

我很乐意解释评论和/或用例。

4

1 回答 1

0

简短的回答是https://stackoverflow.com/a/27914831/6543526

来自官方文档

通常,在使用 ImageSpecField 时,您可能希望规范根据模型的属性而变化。(例如,您可能希望在模型上存储图像尺寸,然后使用它们来生成缩略图。)现在我们知道如何从规范中访问源图像,提取其模型并使用它是一件简单的事情创建我们的处理器列表。事实上,ImageKit 包含一个用于获取此信息的实用程序。

于 2017-11-26T06:16:25.043 回答