Django:根据预先保存的信号调整图像大小

时间:2019-05-13 10:47:29

标签: python django django-models python-imaging-library

我有一个包含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 个答案:

答案 0 :(得分:3)

您需要保存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())