Django的。使用请求下载图像 - 使用PIL编辑 - 保存到模型

时间:2016-04-25 05:57:08

标签: django pillow stringio

我在此过程中遇到问题:我想使用requests下载图片,然后使用PIL裁剪,然后将其保存到模型ImageField

这就是我现在所拥有的:

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问题,我不知道如何解决它(尝试过几次),而且,我想知道我所做的是否正确或是否有更好的方法来实现这一目标。

2 个答案:

答案 0 :(得分:2)

我找到了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)

我测试了上面的代码片段,它绝对有用。

如果您查看原始代码段,则作者会覆盖存储save的模型的ImageField方法。它也可能适用于您的情况。

答案 1 :(得分:2)

因为,你得到的密钥为KeyError的{​​{1}},相当肯定Pillow无法识别它。

但是,如果您查看docs,您会发现它拼写为'JPG'。因此,只需设置JPEG