我有一个包含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,以我的理解,这取决于我保存修改后的图片或将其退还(但是我还是尝试了,没有运气)。
答案 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())