前言:
今天给你们分享一个有趣的小项目,话说在好久之前我须要作一个报告,原来的屏幕共享软件出了点问题,因而临时写了这个程序来应急,效果还不错,今天分享给你们,若是遇到某些特殊状况,能够用来应急html

1、使用环境

Pillow 6.0.0
Opencv-Python 4.1.1.26
flask 1.1.1

2、项目介绍
其实也不是很难,以前我使用 UDP广播的共享屏幕, 如今咱们用 Python 有一个库加 Pillow 能够获取屏幕, 能够实现截图效果, 将图片转换成字节流, 可是 Pillow 这个库有一个缺点,若是屏幕使用了缩放他是按比例截取的,等于说你获取的屏幕图片不是完整的图片,接下来我介绍一个如何使用 Python 截取屏幕并转换为字节流 :python

Pillow

from PIL import ImageGrab
img = ImageGrab.grab()
img.save(“a.png”)

pillow 在屏幕缩放状况下没法截取全屏web

pyautogui

import pyautogui

img = pyautogui.screenshot()
img.save(“a.png”)

pyautogui 在屏幕缩放的状况下也能够获取全屏flask

图片转换为字节流

import pyautogui from io
import BytesIO

img = pyautogui.screenshot()

output_buffer = BytesIO() # 建立二进制对象

img.save(output_buffer, format=‘JPEG’, quality=100) # quality提高图片分辨率

frame = output_buffer.getvalue() # 获取二进制数据

print(frame)

2、动手实践
建立一个新的文件夹 (跟我一块儿作吧)
在文件夹里再建立一个 templates 文件夹
在 templates 建立一个 index.html
建立 app.py camera_pil.py base_camera.py 三个空的Python 文件

建立完成后将以下代码粘贴到 index.html

<html>
<head><title>屏幕共享</title>
</head>
<body>
<h4>屏幕共享</h4>
<img src="{{ url_for('video_feed') }}">
</body>
</html>

而后再将以下代码粘贴到: base_camera.py

import time
import threading
try:from greenlet import getcurrent as get_ident
except ImportError:try:from thread import get_identexcept ImportError:from _thread import get_identclass CameraEvent(object):def __init__(self):self.events = {}def wait(self):ident = get_ident()if ident not in self.events:self.events[ident] = [threading.Event(), time.time()]return self.events[ident][0].wait()def set(self):now = time.time()remove = Nonefor ident, event in self.events.items():if not event[0].isSet():event[0].set()event[1] = nowelse:if now - event[1] > 5:remove = identif remove:del self.events[remove]def clear(self):self.events[get_ident()][0].clear()class BaseCamera(object):thread = Noneframe = Nonelast_access = 0event = CameraEvent()def __init__(self):if BaseCamera.thread is None:BaseCamera.last_access = time.time()BaseCamera.thread = threading.Thread(target=self._thread)BaseCamera.thread.start()while self.get_frame() is None:time.sleep(0)def get_frame(self):BaseCamera.last_access = time.time()BaseCamera.event.wait()BaseCamera.event.clear()return BaseCamera.frame@staticmethoddef frames():raise RuntimeError('Must be implemented by subclasses.')@classmethoddef _thread(cls):print('Starting camera thread.')frames_iterator = cls.frames()for frame in frames_iterator:BaseCamera.frame = frameBaseCamera.event.set()time.sleep(0)if time.time() - BaseCamera.last_access > 10:frames_iterator.close()print('Stopping camera thread due to inactivity.')breakBaseCamera.thread = None

再将以下代码粘贴到: camera_pil.py

from io import BytesIO
import cv2
from PIL import ImageGrab, Image
from base_camera import BaseCameraclass Camera(BaseCamera):video_source = 0@staticmethoddef set_video_source(source):Camera.video_source = source@staticmethoddef frames():camera = cv2.VideoCapture(Camera.video_source)if not camera.isOpened():raise RuntimeError('Error')while True:image = ImageGrab.grab()  # 获取屏幕数据# w, h = image.sizeimage = image.resize((1366, 750), Image.ANTIALIAS)  # 图片缩放output_buffer = BytesIO()  # 建立二进制对象image.save(output_buffer, format='JPEG', quality=100)  # quality提高图片分辨率frame = output_buffer.getvalue()  # 获取二进制数据yield frame  # 生成器返回一张图片的二进制数据

再将以下代码粘贴到: app.py

import os
from importlib import import_module
from flask import Flask, render_template, Responseif os.environ.get('CAMERA'):Camera = import_module('camera_' + os.environ['CAMERA']).Camera
else:from camera_pil import Cameraapp = Flask(__name__)@app.route('/')
def index():"""视图函数:return:"""return render_template('index.html')def gen(camera):"""流媒体发生器"""while True:frame = camera.get_frame()yield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')@app.route('/video_feed')
def video_feed():"""流媒体数据"""return Response(gen(Camera()),mimetype='multipart/x-mixed-replace; boundary=frame')if __name__ == '__main__':app.run(threaded=True, host="127.0.0.1", port=80)

运行 app.py ,而后打开你的浏览器输入: http://127.0.0.1/ 试试看吧!
若是要使用的话, 请把 host=“127.0.0.1” 改成 host=“0.0.0.0” 而后运行屏幕共享服务器, 查看本身以太网的 ip 告诉给接收者,让他们使用浏览器访问你的 ip 地址,就能够实现屏幕共享了。

原文地址:https://blog.csdn.net/qq_42768234/article/details/104301603

基于python实现屏幕共享相关推荐

  1. 【CV】OpenCV(基于Python)学习笔记

    以下内容中的页码均来自<OpenCV 4详解 : 基于Python> 目录 第2章 载入.显示与保存数据 2.2 图像的读取与显示 2.2.1 图像读取函数 cv.imread() 2.2 ...

  2. 基于Python的人工智能美颜系统

    基于Python的人工智能美颜系统使用PyQt5模块搭建可视化界面,使用Dlib模型(shape_predictor_68_face_landmarks.dat)实现人脸关键点检测和定位,人脸美颜(美 ...

  3. python深度神经网络量化_基于Python建立深度神经网络!你学会了嘛?

    原标题:基于Python建立深度神经网络!你学会了嘛? 图1 神经网络构造的例子(符号说明:上标[l]表示与第l层:上标(i)表示第i个例子:下标i表示矢量第i项) 单层神经网络 图2 单层神经网络示 ...

  4. python selenium脚本_怎样开始写第一个基于python的selenium脚本

    1.下载并安装python(http://www.python.org/geti/). 2.安装selenium(http://pypi.python.org/pypi/selenium)下载并解压缩 ...

  5. 【组队学习】【31期】基于Python的办公自动化

    基于Python的办公自动化 航路开辟者:牧小熊.刘雯静.张晓东.吴争光.隆军 领航员:六一 航海士:牧小熊.李显.刘羽中.王晓亮 基本信息 开源内容:https://github.com/dataw ...

  6. 【组队学习】曹志宾:基于Python的会员数据化运营

    分享人:曹志宾,Datawhale成员,香港科技大学硕士在读 分享内容: 案例描述与分析 前期准备与数据预处理 RFM模型使用与操作 Excel中的RFM分析 组队学习: 红星:基于Python的会员 ...

  7. 【组队学习】孙健坤:基于Python的会员数据化运营

    分享人:孙健坤,哈尔滨工业大学 分享内容: 什么是会员制? 什么是会员数据化运营? 如何进行会员数据化运营 组队学习: 基于Python的会员数据化运营 开源内容: https://github.co ...

  8. 【组队学习】【28期】基于Python的会员数据化运营

    基于Python的会员数据化运营 论坛版块: http://datawhale.club/c/team-learning/37-category/37 开源内容: https://github.com ...

  9. 送书 | 你一定能看懂的算法基础书(代码示例基于Python)

    本文引自图灵教育<算法图解> 你一定能看懂的算法基础书:代码示例基于Python:400多个示意图,生动介绍算法执行过程:展示不同算法在性能方面的优缺点:教会你用常见算法解决每天面临的实际 ...

最新文章

  1. .NET : 针对Oracle的LOB数据访问
  2. linux 下orapwd 未找到命令,orapwd命令中entries参数的作用
  3. 你的项目真的需要Session吗? redis保存session性能怎么样?
  4. 杀死linux-zombie僵尸进程
  5. 软件测试——进程调度(短作业优先调度算法+先来先服务算法)测试
  6. 操作多个表_8_不等值连接
  7. shell写的彩色进度条
  8. java登录界面命令_Java命令行界面(第26部分):CmdOption
  9. 大数据 notebook_Dockerless Notebook:数据科学期待已久的未来
  10. ros自己写避障算法_slam导航避障算法,让无人机自主避障教学研究迈向更高处...
  11. (原創) 如何在Visual Studio 2005編譯boost 1.33.1? (C/C++) (VC++) (boost)
  12. 预警系统一键自动升级_东风风行新风行T5购车手册,首推1.5T自动尊贵型
  13. IDEA 设置护眼色RGB值
  14. java jolt tuxedo_Java通过Jolt调用Tuxedo服务
  15. 华为回应前员工被拘 251 天;暴风集团仅剩 10 余人;TiDB 3.0.6 发布 | 极客头条...
  16. 进击的融合,浪潮推出全新SAS Switch储存设备SF-S1
  17. String.GetEnumerator 方法的C#例子
  18. 公众号绑定开发者流程
  19. 计算机电子电路原理图,简易电子琴设计电路图大全(八款模拟电路设计原理图详解) - 消费类电子电路图...
  20. 从多核到众核处理器究竟经历了什么?

热门文章

  1. virsh命令行管理工具
  2. Word文档在线怎么进行翻译
  3. win7资源管理器不断崩溃重启
  4. Ansible playbook文件中指定SSH密钥文件
  5. pom.xml配置文件详解
  6. 万字长文:用这篇文章聊聊To B运营都做些什么
  7. 从零开始学习信号完整性--6-带宽
  8. c语言中用html写按钮,HTML按钮代码怎么写?如何写按钮的代码
  9. 5.5浮点数运算方法和浮点数运算器
  10. Hadoop源码解析之Mapper数量计算公式