2017-04-13 31 views
0

我想在圖片上傳時調整文件大小,但我有一些問題試圖將其保存到模型的ImageField中。如何在Django調整大小後將圖像保存到數據庫?

這裏是我的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) 

我怎樣才能解決這個,所以我可以調整大小後的圖片保存到我的模型?

回答

1

我發現這個post由madzohana答案,這工作沒有任何問題

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) 
+1

很高興你能解決它! – dentemm

+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) 
+0

它給了我。這個錯誤:'圖像'對象沒有屬性'讀' – Lindow

+0

啊是的,你正在使用PIL圖像,等等一分鐘讓我找到PIL圖像的正確方法 – dentemm

+0

我感興趣的是PIL答案,但也與這一個,它使用什麼「圖像」庫? – Lindow

相關問題