如何在Django上调整图像大小后将图像保存到数据库?

时间:2017-04-13 18:49:33

标签: python django django-models

我正在尝试在上传图片时调整文件大小,但我在尝试将其保存到模型的ImageField时遇到了一些问题。

这是我的 models.py

try:
    from PIL import Image, ImageOps
except ImportError:
    import Image
    import ImageOps

class IMGResize(models.Model):
    image = models.ImageField(upload_to='images', blank=True)

    def save(self, *args, **kwargs):
        if self.image:
            img = Image.open(self.image) #<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=980x490 at 0x59E4B38>

            imageresize = img.resize((200, 200), Image.ANTIALIAS) #<PIL.Image.Image image mode=RGB size=200x200 at 0x4D5F630>
            imageresize.save('newname.jpg', 'JPEG', quality=75) #not being saved here to my models
        super(IMGResize, self).save(*args, **kwargs)

如何解决此问题,以便将调整后的图像保存到我的模型中?

2 个答案:

答案 0 :(得分:1)

我相信这会解决问题(为PIL图像对象编辑:

from django.core.files.base import ContentFile
import StringIO

....

class IMGResize(models.Model):
    image = models.ImageField(upload_to='images', blank=True)

    def safe(self, *args, **kwargs):
        if self.image:
            img = Image.open(self.image)
            imageresize = img.resize((200, 200), Image.ANTIALIAS)

            image_formatted = Image.open(StringIO(imageresize.content))
            image_io = StringIO()

            image_formatted.save(image_io, format='JPEG')


            self.image.save(self.image.name, ContentFile(image_io.getvalue(), True)

            super(IMGResize, self).save(*args, **kwargs)

答案 1 :(得分:1)

我在madzohana的post找到了答案,没有任何问题。

from PIL import Image
from io import BytesIO
from django.core.files.base import ContentFile

def save(self, *args, **kwargs):
    img = Image.open(self.image)
    resized  = img.resize((200, 200), Image.ANTIALIAS)
    new_image_io = BytesIO()

    if img.format == 'JPEG' :
        resized .save(new_image_io, format='JPEG')
    elif img.format == 'PNG' :
        resized.save(new_image_io, format='PNG')

    temp_name = self.image.name
    self.image.delete(save=False)

    self.image.save(
        temp_name,
        content=ContentFile(new_image_io.getvalue()),
        save=False
    )

    super(IMGResize, self).save(*args, **kwargs)