Архивы: Август 2012

Наложение водяного знака в Django

Как я решил вопрос наложения водяного знака на изображение за 2 минуты.
Написал некую функцию которая и реализует наложение водяного знака с помощью модуля PIL:

import Image, ImageEnhance

def add_watermark(image, watermark, opacity=1, wm_interval=0):
    assert opacity >= 0 and opacity <= 1
    if opacity < 1:
        if watermark.mode != 'RGBA':
            self.watermark = watermark.convert('RGBA')
        else:
            watermark = watermark.copy()
        alpha = watermark.split()[3]
        alpha = ImageEnhance.Brightness(alpha).enhance(opacity)
        watermark.putalpha(alpha)

    layer = Image.new('RGBA', image.size, (0,0,0,0))
    for y in range(0, image.size[1], watermark.size[1]+wm_interval):
        for x in range(0, image.size[0], watermark.size[0]+wm_interval):
            layer.paste(watermark, (x, y))
    return Image.composite(layer,  image,  layer)

В моделе есть поле image, вот на него мы и накладываем водяной знак при любом сохранении объекта (это плохо — так не делайте, хотя бы по тому, что при каждом сохранении на изображение наложится повторно водяной знак, я это написал для наглядности). Вот этот сигнал и палит сохранение модели:

def prev_image(sender, instance, created, **kwargs):
    # Открываем водяной знак
    path_watermark = settings.STATIC_ROOT + '/watermark/logo.png'
    watermark_open = Image.open(path_watermark, 'r')

    # Открываем текущее изобразение изображение
    img_path = '/home/isite/data/django-apps/energy' + instance.image.url
    img_open = Image.open(img_path, 'r')

    # Накладываем водяной знак
    add_watermark(img_open, watermark_open, 0.3, 50).save(img_path)

signals.post_save.connect(prev_image, sender=Product)