如何从 django 图像字段到 PIL 图像并返回?

Posted

技术标签:

【中文标题】如何从 django 图像字段到 PIL 图像并返回?【英文标题】:how to go form django image field to PIL image and back? 【发布时间】:2014-03-28 22:52:36 【问题描述】:

给定一个 django 图像字段,我如何创建 PIL 图像,反之亦然?

简单的问题,但很难用谷歌搜索:(

(我将使用 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]:

【问题讨论】:

这不是import Image; pil_image = Image.open(my_image_from_image_field.name) 工作吗? @Bernhard, .name 相对于 MEDIA_ROOT。它可以被省略,因为 ImageField/FileField 就像文件对象一样。 【参考方案1】:

为了从 PIL 图像转到 Django ImageField,我使用了 falsetru 的答案,但我必须为 Python 3 更新它。

首先,StringIO 已被 io 替换为: StringIO in 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()

【讨论】:

【参考方案2】:

第一个问题:

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

更新

根据OP的评论,用from PIL import Image替换import Image解决了他的问题。

【讨论】:

(Pdb) p Image.open(obj.image_1) p Image.open(obj.image_1) *** IOError: IOError('cannot identify image file',) for the #1.. @eugene,pil_image_obj = Image.open(model_instance.image_field.path) 怎么样? 它说路径未实现,因为后端(s3boto)不支持绝对路径 @eugene,你最好在问题中提到图像存储在s3中。 @eugene,请试试这个,让我知道这是否有效:pastebin.com/cqMmBa57

以上是关于如何从 django 图像字段到 PIL 图像并返回?的主要内容,如果未能解决你的问题,请参考以下文章

提交带有表格的图像时需要Django Pillow或Pil吗?

Django / PIL - 上传图像时保存缩略图版本

如何从 PIL 图像创建 OpenCV 图像?

使用 PIL 从图像中获取像素

如何使用jQuery从输入字段中获取图像

如何在 Python 中使用 PIL 将图像合成到另一个图像上?