模型保存方法。在保存前调整图像大小
我正在尝试在保存图片之前先调整它的大小。我在模型上使用了一个自定义的保存方法,但遇到了一些问题。
这是我现在的代码:
class UserImages(models.Model):
height = models.CharField(blank=True, max_length=100)
width = models.CharField(blank=True, max_length=100)
image = models.ImageField(upload_to="UserImages/%Y/%m/%d", height_field='height', width_field='width')
owner = models.ForeignKey(User)
def __unicode__(self):
return str(self.image)
def save(self, *args, **kwargs):
if self.image:
filename = str(self.image.path)
img = Image.open(filename)
if img.mode not in ('L', 'RGB'):
img = img.convert('RGB')
img = ImageOps.fit(img, (180,240), Image.ANTIALIAS, 0, (0.5, 0.5))
img.save(self.image.path)
super(UserImages, self).save(*args, **kwargs)
这个代码运行失败,提示我找不到文件。根据我的理解,这个问题是因为图片目前只存在于内存中,所以无法像这样打开。
所以我想问的是:我该如何从内存中打开这张图片,然后再把它保存回内存,以便默认的保存方法可以处理它呢?
非常感谢任何帮助,这让我感到很烦恼 :)
2 个回答
1
使用 django-resized
pip install django-resized
models.py
from django_resized import ResizedImageField
class MyModel(models.Model):
...
image = ResizedImageField(max_width=500, max_height=300, upload_to='whatever')
想了解更多信息,可以查看 https://github.com/un1t/django-resized
1
在你尝试访问 UserImages
的 ImageField
之前,你需要先保存你的 UserImages
。
这里有一个示例,教你怎么做,可以参考这个代码片段:
简单来说:
super(UserImages, self).save()
另外,你的模型名称应该是单数形式,比如用 UserImage
而不是 UserImages
。