2016-04-25 25 views
1

我遇到了此过程问题:我想使用requests下载图像,然后使用PIL对其进行裁切,然后将其保存到型号ImageFieldDjango。下载带请求的图片 - 使用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

尝试设置'格式=“JPEG”'而不是'“JPG”' – JRodDynamite

+0

@JRodDynamite它工作时,我做到了...... thnx。 – alejoss

回答

2

因为,你得到一个KeyError与关键是'JPG',它是相当肯定的枕头不承认它。

但是,如果你看看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方法。它也可能适用于你的情况。