2016-04-25 17 views
1

このプロセスで問題が発生しました:requestsを使用して画像をダウンロードしてからPILでトリミングし、モデルImageFieldに保存します。画像をリクエストしてダウンロード - PILで編集 - モデルに保存

は、これは私が今持っているものです。

from django.core.files.base import ContentFile 
import requests 
from StringIO import StringIO 
from PIL import Image 


def get_img_url(url_img): 
    answer = requests.get(url_img) 
    image = Image.open(StringIO(answer.content)) 
    new_image = image.crop((22, 44, 221, 165)) 

    return image 


class FormNewCard(forms.ModelForm): 

.... 

    def save(self, **kwargs): 

     url_image = self.cleaned_data['imagen'] 
     pil_img = get_img_url(url_img) 
     stringio_obj = StringIO() 
     try: 
      pil_img.save(stringio_obj, format="JPG") 
      final_image = stringio_obj.getvalue() 
      self.image = ContentFile(final_image) 
     finally: 
      stringio_obj.close() 

は、私はこのエラーを取得する:

 pil_img.save(stringio_obj, format="JPG") 

     KeyError at /hisoka/new_card/ 
     'JPG' 

私はエラーが純粋にPIL問題である知っている、私は(それを解決するかどうかはわかりません数回試しました)、また、私がやっていることが正しいのか、これを達成するためのより良い方法があるのか​​を知りたいのです。ここで

+0

私はあなたがアップロードを意味する... – Wtower

+0

'' JPG "の代わりに' 'format =" JPEG "'を設定しようとします。 – JRodDynamite

+0

@JRodDynamiteそれを行ったときに働いた... thnx。 – alejoss

答えて

2

キーが'JPG'KeyErrorになるため、ピローはそれを認識しないことがかなり確かです。

docsを見ると、JPEGと書かれています。したがって、単純にformat='JPEG'と設定します。

1

snippetである私が見つかりました:

from PIL import Image as Img 
import StringIO 

def resize(): 
    img = Img.open(StringIO.StringIO(self.image.read())) 
    if img.mode != 'RGB': 
     img = img.convert('RGB') 
     img.thumbnail((800, self.image.height * 800/self.image.width), Img.ANTIALIAS) # 800 is just a number I pick, enter whatever you want here 
     output = StringIO.StringIO() 
     img.save(output, format='JPEG', quality=70) 
     output.seek(0) 
     self.image = InMemoryUploadedFile(output, 'ImageField', "%s.jpg" %  self.image.name.split('.')[0], 'image/jpeg', output.len, None) 

は、私は上記のスニペットをテストし、それは間違いなく動作します。

元のスニペットを見ると、ImageFieldを格納しているモデルのsaveメソッドが上書きされます。それはあなたの場合にも適用されるかもしれません。

関連する問題