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