Как перейти от поля изображения django к изображению PIL и обратно?

С учетом поля изображения django, как создать изображение PIL и наоборот?

Простой вопрос, но трудно для google: (

(Я собираюсь использовать процессор django-imagekit для поворота изображения, уже сохраненного в качестве атрибута модели.)

изменить

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

Первый вопрос:

import Image

pil_image_obj = Image.open(model_instance.image_field)

Второй вопрос:

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

Согласно комментарию OP, замена import Image на from PIL import Image решила его проблему.

Ответ 2

Чтобы перейти от изображения PIL к Django ImageField, я использовал ответ falsetru, но мне пришлось обновить его для Python 3.

Сначала StringIO был заменен на io в соответствии с: StringIO в python3

Во-вторых, когда я пробовал io.StringIO(), я получил сообщение об ошибке: "*** TypeError: string argument expected, got 'bytes'". Поэтому я изменил его на io.BytesIO(), и все это сработало.

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()