Tornado 和 PIL:从标题中打开图像

Dmi*_*sev 5 python tornado python-imaging-library python-2.7

我的龙卷风应用程序接收标题中的图像。所以,我想重新调整它的大小并存储它。但我在打开图像时遇到问题 - 要创建 PIL 对象,我必须拥有带有图像的文件并将文件名传递给 PIL 图像模块的 open() 方法。但我那里只有标题和文件信息。我应该创建临时文件来创建 Image 对象吗?或者也许还有其他解决方案?

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()
Run Code Online (Sandbox Code Playgroud)

蒂亚!

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
Run Code Online (Sandbox Code Playgroud)

ber*_*nie 3

PIL 文档指出我们可以向open().
因此我们可以使用StringIOPIL 来提供一个类似文件的对象。
应用于您的代码的示例:

from PIL import Image
from io import StringIO

im = Image.open(StringIO(self.request.files["ImageUpload"][0]["body"]))
im.save("out.jpg", "JPEG")
Run Code Online (Sandbox Code Playgroud)

  • 通常建议不要命名任何与模块同名的类,因为这会导致混乱。然而,使用这种约定的现有代码已嵌入到许多程序和系统中,因此对其进行更改是不切实际的。 (2认同)