姜戈。下载带有请求的图像 - 使用 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'
.
我在这个过程中遇到了问题:我想使用 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'
.