鱼C论坛

 找回密码
 立即注册
查看: 3467|回复: 8

flask如何下载html<img>里面的图片

[复制链接]
发表于 2023-1-7 20:02:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我用flask写了个实时获取摄像头的,他会推一个图片流到html的img然后我想要点击按钮flask就把这个img里的图片下载下来

百度找不到方法,在这里请教一下各位大佬


flask:
  1. import cv2
  2. from cv2 import imdecode
  3. from flask import Flask, render_template, Response
  4. import time
  5. # from pyzbar import pyzbar
  6. # import numpy as np
  7. from pyzbar.pyzbar import decode
  8. from PIL import Image

  9. app = Flask(__name__)


  10. @app.route('/')
  11. def index():
  12.     return render_template(r'index.html')


  13. def gen():
  14.     vid = cv2.VideoCapture(0)
  15.     while True:
  16.         return_value, frame = vid.read()
  17.         image = cv2.imencode('.jpg', frame)[1].tobytes()
  18.         yield (b'--frame\r\n'
  19.                b'Content-Type: image/jpeg\r\n\r\n' + image + b'\r\n')
  20.         print(image)
  21.         

  22.         # cv2.imwrite("./1.png", image)
  23.         time.sleep(10)


  24. @app.route('/sm')
  25. def video_feed():
  26.     return Response(gen(), mimetype='multipart/x-mixed-replace; boundary=frame')


  27. if __name__ == '__main__':
  28.     app.run(host='0.0.0.0', port=80, debug = True)
复制代码


html:
  1. <html>
  2.   <head>
  3.     <title>Video Streaming Demonstration</title>
  4.     <style>
  5.     #btn_snap {
  6.       margin: 0 auto;
  7.       border: 1px solid #f0f0f0;
  8.       background: #5CACEE;
  9.       color: #FFF;
  10.       width: 100px;
  11.       height: 36px;
  12.       line-height: 36px;
  13.       border-radius: 8px;
  14.       text-align: center;
  15.       cursor: pointer;
  16.       cursor: pointer;
  17.       /*禁止选择*/
  18.       -webkit-touch-callout: none;
  19.       /* iOS Safari */
  20.       -webkit-user-select: none;
  21.       /* Chrome/Safari/Opera */
  22.       -khtml-user-select: none;
  23.       /* Konqueror */
  24.       -moz-user-select: none;
  25.       /* Firefox */
  26.       -ms-user-select: none;
  27.       /* Internet Explorer/Edge */
  28.       user-select: none;
  29.       /* Non-prefixed version, currently not supported by any browser */
  30.   }
  31.   </style>
  32.   </head>
  33.   <body>
  34.     <h1>Video Streaming Demonstration</h1>
  35.     <img src="{{ url_for('video_feed') }}" height="500">
  36.     <!-- 12313 -->
  37.     <div id="btn_snap" onclick="myfunction()">拍照</div>
  38.    
  39.   </body>
  40. </html>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-1-7 20:23:02 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-7 20:33:12 | 显示全部楼层
suchocolate 发表于 2023-1-7 20:23
可以试试a标签:https://www.runoob.com/tags/att-a-download.html

你知道flask咋检测按钮是否被按下吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-7 22:35:52 From FishC Mobile | 显示全部楼层
本帖最后由 wp231957 于 2023-1-7 22:41 编辑

飘过------/////回复错了


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-8 03:46:39 | 显示全部楼层
本帖最后由 阿奇_o 于 2023-1-8 03:55 编辑

如果你搞过动态的图形验证码,基本可以做的出来。。原理也比较简单:

  - 后端,可以专门为"截图"做一个请求地址,如 @app.route('/cap'), 然后实现这个请求视图函数,如 def capture(): ... #返回截图即可。
  - 前端,html里则需要js实现: 每点击拍照按钮,就异步请求一次’/cap'获取到最新的截图,并更新显示。

我之前做过用户登录界面的验证码,但用的是Django而不是Flask,而且之前也没用ajax异步请求。。
另外,我发现自己没现成的摄像头,只好搞了手机做临时的摄像头。。

于是,折腾三四个小时。。再次凸显前端知识的不足。。  不过值得高兴的是,最终还是基本实现了。。


                               
登录/注册后可看大图


ps:你大概率会遇到两个难啃的问题/大坑:CSRF问题流文件/图片的异步请求和图片展示的问题。。



小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-1-8 06:55:07 From FishC Mobile | 显示全部楼层
阿奇_o 发表于 2023-1-8 03:46
如果你搞过动态的图形验证码,基本可以做的出来。。原理也比较简单:

  - 后端,可以专门为"截图"做一个 ...

原来这么难啊,我以为有现成的函数可以调用呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-8 15:04:02 | 显示全部楼层
Mike_python小 发表于 2023-1-7 20:33
你知道flask咋检测按钮是否被按下吗

检测按钮那是前端做的事情,不是flask。
你的目标是点击后下载,那用a最合适,想好看点就把a的样式改成button样式。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-8 19:17:00 | 显示全部楼层
Mike_python小 发表于 2023-1-8 06:55
原来这么难啊,我以为有现成的函数可以调用呢

又研究了半个下午,发现通过前端JS也可以获取摄像头(而且似乎更流畅),具体参考:https://blog.csdn.net/huijiMC/article/details/109560819
但 这样一来,就变成了要把拍照的图片 从前端传到后端(不然你CV2和pyzbar就没图片处理了),也就是要用JS来实现异步上传图片、保存图片到后端。。

这样对前端JS不熟的,难度反而变大了。。

所以,所以,我就暂时不搞了,祝你好运。。


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-1-8 21:14:40 | 显示全部楼层
suchocolate 发表于 2023-1-8 15:04
检测按钮那是前端做的事情,不是flask。
你的目标是点击后下载,那用a最合适,想好看点就把a的样式改成b ...

头像很好看。。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 12:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表