image - flask return pil 生成图像错误,我可以看到调整大小的图片但响应图像是错误的
问题描述
我有烧瓶 api 响应图片:
FORMAT = {'image/jpeg':'JPEG', 'image/bmp':'BMP', 'image/png':'PNG', 'image/gif': 'GIF'}
@app.route('/api/image/<id>/<str_size>', methods=['get'])
def show_thumbnail(id, str_size):
size = int(str_size)
with get_db().cursor() as cur:
cur.callproc('getimage', (id,))
result = cur.fetchone()
buf = BytesIO(result[1])
if(size>0):
im = Image.open(buf)
im.thumbnail((size, size))
buf = BytesIO(b'')
im.save(buf, format=FORMAT[result[0].lower()])
fw = open('w03.jpg', 'wb')
fw.write(buf.getbuffer())
fw.close()
resp = Response(buf)
resp.headers.set('Content-Type', result[0].lower())
return resp
ps:
结果[0] = '图像/JPEG'
result[1] 是 jpeg 图片的字节数组。
如果我设置 size(str_size) = 0,我的意思是我不运行 PIL Image 缩略图代码部分。我可以得到正确的图片作为回应。
例如,如果我设置 size(str_size) = 256,我发现“w03.jpg”是正确的,我可以获得正确的调整大小图像,但响应为黑色,原因是图像包含错误。
解决方案
im.save(buf)
将缓冲区放在最后。您需要在构建之前回退resp
这个 使用buf.seek(0)
. 我怀疑 buf.getbuffer
不会以相同的方式更改流位置,这可以解释为什么w03.jpg
在第二个测试中是正确的:
您还可以使用with
块来最小化一些代码(这会自动关闭文件):
# ...
with open('w03.jpg', 'wb') as fw:
fw.write(buf.getbuffer())
buf.seek(0)
resp = Response(buf)
# ...
推荐阅读
- typescript - Why import assignment makes module declaration with a relative module name valid?
- python - Python Requests login: i have error 403 but the request looks correct
- flutter - How to make the Flutter app bar with gradient background
- php - 根据 laravel 刀片中的条件添加行和列
- python - Dependency inversion: python
- javascript - Dynamic import from node_modules throws "Cannot read property 'call' of undefined"
- c++11 - How to Write an Readable and Understandable Bitwise Operator Formula?
- xml - Is there a way in XML to define a common piece of document to be customized later in other documents?
- database-normalization - Multivalued Dependency transitivity property
- c# - C# FTP Directory create and upload is causing form freeze