2017-04-13 14 views
0

画像のアップロード中にファイルのサイズを変更しようとしていますが、モデルのImageFieldに保存しようとする際に問題があります。イメージをデータベースに保存するにはどうすればいいですか?

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) 

ので、私は私のモデルにリサイズした画像を保存することができますどのように私はこの問題を解決することができます:ここで

は私のmodels.pyはありますか?私は、これはトリックを行うと確信してい

答えて

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

あなたはそれを解決することができてうれしい! – dentemm

+0

しかし、これは、私はフォームを更新するたびにサイズ変更機能を実行しますが、新しいイメージを挿入することはありません。 –

1

は(PILのImageオブジェクトのために編集:

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回答に興味がありますが、 、 "Image"ライブラリは何を使用していますか? – Lindow

関連する問題