Как использовать PIL в моделях Django - PullRequest
0 голосов
/ 23 марта 2011

Я хотел бы изменить размер загруженного изображения (ImageField) перед окончательным сохранением, я слышал, что в python есть библиотека изображений с именем PIL, и я хотел бы использовать ее для этой задачи, но я не уверен, как начать. *

Есть предложения как это сделать?

Спасибо

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Я только что узнал, как это сделать, но есть ли способ упростить это? Я новичок в Python и Django, поэтому я не уверен, что это правильный способ сделать это.

ниже мой код:

from django.db.models.signals import pre_delete, pre_save

def on_save_image(sender, **kwargs):
    import PIL
    obj = kwargs['instance']
    if obj.file:
        try:
            original = sender.objects.get(pk = obj.pk)
            if original.file:
                #if change image then delete original file
                original.file.delete()
        except ObjectDoesNotExist:
            pass
        finally:
            img = PIL.Image.open(obj.file)
            img.thumbnail((500, 500))
            # reset pointer to start at 0 again
            obj.file.open()
            img.save(obj.file)
pre_save.connect(on_save_image, sender = Image)

# delete file in memory
def on_delete_image(sender, **kwargs):
    obj = kwargs['instance']
    if obj.file:
        obj.file.delete()
pre_delete.connect(on_delete_image, sender = Image)

Спасибо

0 голосов
/ 23 марта 2011

вы можете переопределить функцию сохранения модели, где вы можете открыть файл и изменить его размер (не рекомендуется, так как он будет изменять его размер каждый раз, когда вы сохраняете модель), вы изменяете размер после загрузки файла (например, до / во время form.save ())

, но ИМХО гораздо лучшее решение - использовать для этого специальное приложение, мое любимое sorl-thumbnails

...