Skip to main content
 首页 » 编程设计

python之Django:根据预保存信号调整图像大小

2024年08月13日45xxx_UU

我有一个包含 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 所以在我的理解是我不能保存修改后的图片或返回它(但我仍然尝试过,没有运气)。

请您参考如下方法:

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