2014-02-26 7 views
12

Wie bekomme ich ein PIL-Bild und umgekehrt ein Django-Bildfeld?Wie man django Bildfeld zu PIL Bild und zurück gehen?

einfache Frage, aber schwer google :(

(Ich werde django-imagekit ‚s-Prozessor verwenden, um ein Bild zu drehen bereits als Modell Attribut gespeichert.)

bearbeitet

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]: 
+0

Nicht importieren Image; pil_image = Image.open (my_image_from_image_field.name) 'Arbeit? – Bernhard

+0

@Bernhard, '.name' ist relativ zu' MEDIA_ROOT'. Es kann weggelassen werden, da das ImageField/FileField wie ein Dateiobjekt agiert. – falsetru

Antwort

13

Die erste Frage:

import Image 

pil_image_obj = Image.open(model_instance.image_field) 

Die zweite Frage:

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

Nach OP Kommentar, ersetzt import Image mit from PIL import Image gelöst sein Problem.

+0

(Pdb) p Bild.open (obj.image_1) p Bild.open (obj.image_1) *** IOError: IOError ('kann Bilddatei nicht identifizieren',) für die # 1 .. – eugene

+0

@eugene, How über 'pil_image_obj = Image.open (model_instance.image_field.path)'? – falsetru

+0

es sagt Pfad nicht implementiert, weil, weil Backend (s3boto) nicht unterstützt absoluten Pfad – eugene

18

zu Django Imagefield von PIL Bild zu gehen, habe ich die Antwort von falsetru, aber ich hatte es für Python zu aktualisieren 3.

Zuerst wird, wie pro io ersetzt StringIO wurde:

Zweite StringIO in python3 , Als ich versuchte io.StringIO(), empfing ich einen Fehler, der sagt: "*** TypeError: string argument expected, got 'bytes'". Also habe ich es in io.BytesIO() geändert und es hat alles funktioniert.

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