用户通过表单上传图像文件,我不想将原始上传的图像文件保存到磁盘,并通过Pillow从磁盘打开图像来调整图像大小。
我想首先在内存中调整此图像文件的大小,然后将调整大小的图像文件保存到磁盘。所以我将StringIO作为缓冲区导入,但它不能与Pillow一起使用。
以下是代码:
Python3.4,Flask == 0.10.1,Pillow == 3.4.2
from io import StringIO
from PIL import Image
from .forms import Form
@app.route('/upload_img', methods=['GET', 'POST'])
def upload_img():
form = Form()
im = Image.open(StringIO(form.img.data.read())
pass
Kibana
TypeError:initial_value必须是str或None,而不是bytes
答案 0 :(得分:5)
来自Pillow docs:
PIL.Image.open(fp, mode='r')
打开并识别给定的图像文件。参数:
fp
- 文件名(字符串),pathlib.Path
对象或文件对象。文件对象必须实现read()
,seek()
和tell()
方法,以及 以二进制模式打开。
您传递给open
的内容是StringIO
。它从 text 模式下打开的str
对象创建一个类文件对象。
问题是由StringIO
中的参数引起的。 form.img.data.read()
返回一个bytes
对象,禁止将其传递给构造函数。但在你的情况下,StringIO
不会工作
相反,请使用io.BytesIO
。它有几乎相同的接口,除了它需要bytes
个对象并返回一个以二进制模式打开的类文件对象,这就是你需要的。
from io import BytesIO
from PIL import Image
from .forms import Form
@app.route('/upload_img', methods=['GET', 'POST'])
def upload_img():
form = Form()
im = Image.open(BytesIO(form.img.data.read())
pass