Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » Наложение вотермарка на уровне модели [RSS Feed]

#1 Апрель 14, 2012 14:58:30

plurk89
От:
Зарегистрирован: 2011-06-09
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Наложение вотермарка на уровне модели

Сабж. Модель:

img = models.ImageField(upload_to='%s%s' % ('tizers/', randstring()))
img_with_watermark = models.ImageField(upload_to='watermark', blank=True, null=True)

Изначально сделал с помощью PIL, но как оказалось анимированные гифки сохранять он не умеет, посему было решено использовать pgmagick.

Код с PIL:
def save(self):
        imbase = Image.open(self.img)
        imwater = Image.open('/home/water.png')
        format = imbase.format
        if imbase.mode not in ('L', 'RGB'):
            imbase = imbase.convert('RGB')
        imbase.paste(imwater,(imbase.size[0]-imwater.size[0],imbase.size[1]-imwater.size[1]),imwater)
        temp_handle = StringIO()
        imbase.save(temp_handle, format)
        temp_handle.seek(0)
        suf = SimpleUploadedFile(os.path.split(self.img.name)[-1],
        temp_handle.read(), content_type='image/%s' % format)
        self.img_with_watermark.save('%s.%s' % (suf.name, format), suf, save=False)
        super(Tizer, self).save()

При попытке открыть self.img через pgmagick вылетает ошибка:
im = pgmagick.Image(self.img.path)

Python argument types in
Image.__init__(Image, unicode)
did not match C++ signature:
__init__(_object*, Magick::Image)
__init__(_object*, unsigned int, unsigned int, std::string, MagickLib::StorageType, void const*)

__init__(_object*)

Пытаюсь открыть так:
im = pgmagick.Image(str(self.img.path))
Отдает Magick: Unable to open file (/home/ursa/PP/tizers/media/35459_09_07_11_6_41_44.png) reported by coders/png.c:2790 (ReadPNGImage)

Аналогичная ошибка вылетает со всеми картинками.



Офлайн

#2 Апрель 23, 2012 23:29:52

murfen
Зарегистрирован: 2012-04-23
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Наложение вотермарка на уровне модели

Для свежезагруженной картинки, до того, как вызван код

super(Tizer, self).save()
поле self.img содержит ссылку на временный файл (на диске или в памяти - зависит от размера).
И его нельзя открывать по пути.

Зато, насколько можно понять из доки к pgmagick, его можно открывать как-то так:
imbase = Image(Blob(self.img.read()))

ЗЫ ИМХО, лучч это все делать в сигнале pre-save

Офлайн

  • Начало
  • » Django
  • » Наложение вотермарка на уровне модели[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version