2017-11-26 8 views
0

私は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) 

しかし、どのようにモデル内のカスタム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} 
    ) 
    ... 

私は説明的なコメントやユースケースにはうれしく思います。

答えて

0

短い答えは、公式docsからhttps://stackoverflow.com/a/27914831/6543526

です:

しばしばImageSpecFieldを使用しているとき、あなたは仕様がモデルのプロパティに基づいて を変更することもできます。たとえば、 画像の寸法をモデルに保存し、それを使用して サムネイルを生成することができます)。 仕様からソース画像にアクセスする方法を知ったので、そのモデルを抽出してそれを使用して プロセッサリストを作成します。実際、ImageKitには という情報を得るためのユーティリティが含まれています。

関連する問題