【python/flask】将PIL/OpenCV图像渲染到页面

说在前面

  • python版本:3.7.3
  • flask版本:2.0.1
  • Pillow版本:8.3.1
  • opencv_contrib版本:4.5.3

场景

  • 在实际应用场景中,有时需要将opencv/pillow捕获的图像显示到页面上,例如摄像头。

方法

  • PIL
    使用BytesIO将编码后的图像存储在内存,然后使用flask中的send_file方法将图像发送给前端。
    def serve_pil_image(pil_img):
        img_io = BytesIO()
        pil_img.save(img_io, 'PNG')
        img_io.seek(0)
        return send_file(img_io, mimetype='image/png')
    
  • CV
    方法类似(下面换了一种图片格式)
    def serve_cv_image(cv_img):
        _, encoded_img = cv.imencode('.jpg', cv_img, [int(cv.IMWRITE_JPEG_QUALITY), 95])
        img_io = BytesIO(encoded_img)
        img_io.seek(0)
        return send_file(img_io, mimetype='image/jpg')
    
  • 完整代码
    (使用读取图片文件的方式来模拟)
    # main.py
    from flask import Flask, send_file
    from io import BytesIO
    from PIL import Image
    import cv2 as cv
    
    def serve_pil_image(pil_img):
        img_io = BytesIO()
        pil_img.save(img_io, 'PNG')
        img_io.seek(0)
        return send_file(img_io, mimetype='image/png')
    
    def serve_cv_image(cv_img):
        _, encoded_img = cv.imencode('.jpg', cv_img, [int(cv.IMWRITE_JPEG_QUALITY), 95])
        img_io = BytesIO(encoded_img)
        img_io.seek(0)
        return send_file(img_io, mimetype='image/jpg')
    
    mat = cv.imread("./ai.jpg")
    pil = Image.open("./ai.jpg")
    
    app = Flask(__name__)
    
    @app.route("/")
    def index():
        return "<img src='/pil'><img src='/cv'>"
    
    @app.route("/pil")
    def pilimg():
        return serve_pil_image(pil)
    
    @app.route("/cv")
    def cvimg():
        return serve_cv_image(mat)
    

运行

  • CMD
    set FLASK_APP=main
    flask run
    

结果

在这里插入图片描述

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将Python绘制的图像显示到web页面上,可以使用Flask框架来实现。Flask是一个轻量级的Web应用框架,它可以帮助我们快速搭建一个Python网站。 首先,我们需要安装Flask框架。可以使用pip命令来进行安装:pip install flask 接下来,创建一个Python文件,并引入flask模块。我们需要定义一个路由函数来处理用户访问网站的请求,并将绘制的图像返回给用户。例如,我们可以定义一个路由函数来处理根路径的请求: from flask import Flask, render_template, send_file from matplotlib.figure import Figure from io import BytesIO app = Flask(__name__) @app.route('/') def index(): # 创建一个图像对象 fig = Figure() # 在图像对象上进行绘制操作 fig.gca().plot([0, 1, 2, 3, 4], [0, 1, 4, 9, 16]) # 将图像保存到一个内存缓冲区中 buffer = BytesIO() fig.savefig(buffer, format='png') buffer.seek(0) # 返回图像数据给用户 return send_file(buffer, mimetype='image/png') if __name__ == '__main__': app.run() 在上述代码中,我们使用了matplotlib库来进行图像绘制操作。首先,我们创建了一个图像对象fig,并在其上进行绘制操作。然后,我们通过调用fig.savefig函数将图像保存到一个内存缓冲区buffer中,并设定保存格式为png。最后,我们通过调用send_file函数将图像数据以png格式发送给用户。 运行上述代码后,Flask会根据定义的路由函数来处理用户的请求。当用户访问网站的根路径时,会调用index函数,并将绘制的图像以png格式显示在网页上。 需要注意的是,上述例子中仅仅演示了如何绘制一幅简单的图像,并将其显示在web页面上。实际应用中,我们可以根据自己的需求进行图像处理和生成,并通过Flask框架将其显示在网页上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值