Django: изменение размера изображения при сохранении сигнала - PullRequest
2 голосов
/ 13 мая 2019

У меня есть модель, которая содержит поле ImageField, и я хочу изменить размер предоставленного изображения, если его размеры слишком велики (более 600x600).Мой сигнал выглядит следующим образом:

from django.conf import settings
from django.db.models.signals import pre_save
from PIL import Image

def resize_profile_picture(sender, instance, **kwargs):
    img = Image.open(instance.profile_picture)
    print(img.__dict__['_size'])
    if any([img.width > settings.MAX_PROFILE_PICTURE_WIDTH, img.height > settings.MAX_PROFILE_PICTURE_HEIGHT]):
        img.thumbnail(settings.MAX_PROFILE_PICTURE_DIMENSIONS)
        print(img.__dict__['_size'])

pre_save.connect(resize_profile_picture, sender=get_user_model())

Эти отпечатки показывают, что на самом деле размер изображения изменяется с (645, 374) до (600, 347), но проблема в том, что этот эскиз не отображаетсясохранено и у меня еще есть картинка в оригинальном размере.Поскольку thumbnail работает с той же картинкой, на которой вызывается, я не могу найти причину, по которой он не работает, потому что согласно документации thumbnail возвращает NoneType, поэтому, насколько я понимаю, я не могу сохранить измененнуюсфотографируйте или верните его (но я все же попытался, не повезло).

1 Ответ

3 голосов
/ 13 мая 2019

Вам нужно сохранить img и переназначить его на instance.profile_picture как это:

from django.conf import settings
from django.db.models.signals import pre_save
from PIL import Image

def resize_profile_picture(sender, instance, **kwargs):
    img = Image.open(instance.profile_picture)
    print(img.__dict__['_size'])
    if any([img.width > settings.MAX_PROFILE_PICTURE_WIDTH, img.height > settings.MAX_PROFILE_PICTURE_HEIGHT]):
        img.thumbnail(settings.MAX_PROFILE_PICTURE_DIMENSIONS)
        img.save("thumbnail.png")
        instance.profile_picture = open("thumbnail.png")
        print(img.__dict__['_size'])

pre_save.connect(resize_profile_picture, sender=get_user_model())
...