2024-02-22 16:47:00 by wst
图像处理为了减少IO,通常处理完图片直接返回给前端,而不是保存磁盘。
怎么以字节流返回呢,这里给出完整的实例。
from flask import Flask, make_response
from io import BytesIO
from PIL import Image
app = Flask(__name__)
@app.route("/")
def helloworld():
return "<p>Hello, World!</p>"
@app.route("/image")
def get_image():
buffer = BytesIO()
fp = "/home/wst/workspace/lxdata/temp/QJ6118689748.jpg"
image = Image.open(fp)
image.save(buffer, format="png")
buffer_bytes = buffer.getvalue()
response = make_response(buffer_bytes)
response.headers['Content-Type'] = 'image/png'
return response
说明:第16行中的图片格式可以做这些设定:
在PIL中,使用save()
方法时,可以指定多种格式来保存图像。一些常见的格式包括:
format="JPEG"
来保存为JPEG格式。format="PNG"
来保存为PNG格式。format="GIF"
来保存为GIF格式。format="BMP"
来保存为BMP格式。format="TIFF"
来保存为TIFF格式。除了上述常见格式外,PIL还支持诸如WebP、ICO、PDF等其他格式。通过在save()
方法中使用format
参数,可以灵活地控制输出图像的格式。
启动方式如下,假定以上内容保存到flask_demo.py中。
flask --app flask_demo run
访问地址:http://127.0.0.1:5000/image,即可看到返回的图片。
后续:
既然是字节码,那么直接从磁盘以二进制方式读出图片,是不是也可以呢?
那我们来试一下,改动代码:
from flask import Flask, make_response
from io import BytesIO
from PIL import Image
app = Flask(__name__)
@app.route("/")
def helloworld():
return "<p>Hello, World!</p>"
@app.route("/image")
def get_image():
buffer = BytesIO()
fp = "/home/wst/workspace/lxdata/temp/QJ6118689748.jpg"
buffer_bytes = open(fp, 'rb')
response = make_response(buffer_bytes)
response.headers['Content-Type'] = 'image/png'
return response
结果:可行!