2012-06-23 24 views
3

我的龍捲風應用程序在標題中收到圖像。所以,我想重新調整大小並存儲它。但是我在打開圖像時遇到了麻煩 - 要創建PIL對象,我必須將該文件與圖像相關聯,並將文件的名稱傳遞給PIL的Image模塊的open()方法。但我只有標題和文件信息。我應該創建臨時文件來創建圖像對象嗎?或者也許有其他解決方案?龍捲風和PIL:從標題打開圖像

class ImageHandler(BaseHandler): 
    def post(self): 
     f = open("out.jpg", "w") 
     im = Image.open(self.request.files["ImageUpload"][0]["body"]) 
     im.save(f, "JPEG") 
     self.finish() 

TIA!

UPD1(@bernie)

Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/site-packages/tornado-2.2-py2.7.egg/tornado/web.py", line 988, in _execute 
    getattr(self, self.request.method.lower())(*args, **kwargs) 
    File "server.py", line 160, in post 
    im = Image.open(StringIO(self.request.files["ImageUpload"][0]["body"])) 
TypeError: 'module' object is not callable 
+0

它可能並不重要根據您當前的平臺上,但要始終使用二進制數據的二進制模式。在這種情況下,將'w'改爲'wb'。 – bernie

+0

如果我不使用二進制寫入模式 - 我可以面對哪種錯誤? – dizpers

+0

如果您在二進制標誌很重要的平臺上,您的映像可能會損壞。 – bernie

回答

2

PIL documentation states,我們可以提供一個文件名或文件的對象來open()
所以我們可以使用StringIO來爲PIL提供一個類似文件的對象。應用到你的代碼
例如:

from PIL import Image 
from StringIO import StringIO 

im = Image.open(StringIO(self.request.files["ImageUpload"][0]["body"])) 
im.save("out.jpg", "JPEG") 
+0

看看更新後的帖子:) – dizpers

+0

請確保你是這樣導入:'從StringIO import StringIO'。 – bernie

+0

thx!這有助於!爲什麼這種進口物質? – dizpers