姜戈。下载带有请求的图像 - 使用 PIL 编辑 - 保存到模型

Django. Download Image with requests - edit with PIL - save to model

我在这个过程中遇到了问题:我想使用 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问题,我不知道如何解决它(试了几次),而且,我想知道我做的是否正确或者是否有是实现这一目标的更好方法。

这是我发现的 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 方法。它可能也适用于您的情况。

既然你得到了一个 KeyError,密钥是 'JPG',那么 Pillow 肯定无法识别它。

但是如果您看一下 docs,您会发现它拼写为 JPEG。因此,只需设置 format='JPEG'.