how to go form django image field to PIL image and back?

岁酱吖の 提交于 2019-12-04 17:30:27

问题


Given a django image field, how do I create a PIL image and vice-versa?

Simple question, but hard to google :(

(I'm going to use django-imagekit 's processor to rotate an image already stored as model attribute.)

edit

In [41]: m.image_1.__class__
Out[41]: django.db.models.fields.files.ImageFieldFile

In [42]: f = StringIO(m.image_1.read())

In [43]: Image.open(f)
---------------------------------------------------------------------------
IOError                                   Traceback (most recent call last)
<ipython-input-43-39949b3b74b3> in <module>()
----> 1 Image.open(f)

/home/eugenekim/virtualenvs/zibann/local/lib/python2.7/site-packages/PIL/Image.pyc in open(fp, mode)
   2023                 pass
   2024
-> 2025     raise IOError("cannot identify image file")
   2026
   2027 #

IOError: cannot identify image file

In [44]:

回答1:


The first question:

import Image

pil_image_obj = Image.open(model_instance.image_field)

The second question:

from cStringIO import StringIO
from django.core.files.base import ContentFile

f = StringIO()
try:
    pil_image_obj.save(f, format='png')
    s = f.getvalue()
    model_instance.image_field.save(model_instance.image_field.name,
                                    ContentFile(s))
    #model_instance.save()
finally:
    f.close()

UPDATE

According to OP's comment, replacing import Image with from PIL import Image solved his problem.




回答2:


To go from PIL image to Django ImageField, I used falsetru's answer, but I had to update it for Python 3.

First, StringIO has been replaced by io as per: StringIO in python3

Second, When I tried io.StringIO(), I recieved an error saying: "*** TypeError: string argument expected, got 'bytes'". So I changed it to io.BytesIO() and it all worked.

from PIL import Image
from io import BytesIO
from django.core.files.base import ContentFile

f = BytesIO()
try:
    pil_image_obj.save(f, format='png')
    model_instance.image_field.save(model_instance.image_field.name,
                                   ContentFile(f.getvalue()))
#model_instance.save()
finally:
    f.close()


来源:https://stackoverflow.com/questions/22035833/how-to-go-form-django-image-field-to-pil-image-and-back

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!