python实现录制全屏和选择区域录屏功能


Posted in Python onFebruary 05, 2021

最近给客户演示程序运行结果,我就想到用Python写一个录屏程序,在网上能找到现成的源码,但是它的录屏是录制整个屏幕的。但是在屏幕桌面下方的任务栏工具栏里有些东西,不希望被录制到视频里,因此需要实现一个选择区域录屏,就像qq截图那样的。我编写的程序如下,在主函数的输入参数里有一个选项控制是全屏录制还是选择区域录制。在编写这个程序时,我有一个疑问,在初始化写视频VideoWriter函数的第4个参数,它表示视频帧的高和宽,全屏录制方式的参数是(height,width),选择区域录制的参数是(width,height)。我曾尝试过把这个参数统一写成(height,width)或者(width,height)。但是运行程序后,总有一种录屏方式保存的视频文件是无法打开的,文件大小是1kb,不知这是为何?

import cv2
from PIL import ImageGrab
import numpy as np
import argparse
import time
 
global img
global point1, point2
 
def on_mouse(event, x, y, flags, param):
  global img, point1, point2
  img2 = img.copy()
  if event == cv2.EVENT_LBUTTONDOWN: # 左键点击
    point1 = (x, y)
    cv2.circle(img2, point1, 10, (0, 255, 0), thickness=2)
    cv2.imshow('image', img2)
  elif event == cv2.EVENT_MOUSEMOVE and (flags & cv2.EVENT_FLAG_LBUTTON): # 按住左键拖曳
    cv2.rectangle(img2, point1, (x, y), (255, 0, 0), thickness=2)
    cv2.imshow('image', img2)
  elif event == cv2.EVENT_LBUTTONUP: # 左键释放
    point2 = (x, y)
    cv2.rectangle(img2, point1, point2, (0, 0, 255), thickness=2)
    cv2.imshow('image', img2)
 
def select_roi(frame):
  global img, point1, point2
  img = cv2.cvtColor(np.array(frame), cv2.COLOR_RGB2BGR)
  winname = 'image'
  cv2.namedWindow(winname, cv2.WINDOW_NORMAL)
  cv2.setWindowProperty(winname, cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
  cv2.setMouseCallback(winname, on_mouse)
  cv2.imshow(winname, img)
  cv2.waitKey(0)
  cv2.destroyAllWindows()
  return point1, point2
 
if __name__ == '__main__':
  parser = argparse.ArgumentParser()
  parser.add_argument('--fps', type=int, default=10, help='frame per second')
  parser.add_argument('--total_time', type=int, default=15, help='video total time')
  parser.add_argument('--savename', type=str, default='video.mp4', help='save file name')
  parser.add_argument('--screen_type', default=1, type=int, choices=[0, 1], help='1: full screen, 0: region screen')
  args = parser.parse_args()
 
  print('等到3秒,请切换到录屏的页面')
  if args.screen_type==0:
    print('Press Esc to close window')
  time.sleep(3)
 
  curScreen = ImageGrab.grab() # 获取屏幕对象
  if args.screen_type:
    height, width = curScreen.size
    min_x, min_y, max_x, max_y = 0, 0, width, height
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    video = cv2.VideoWriter(args.savename, fourcc, args.fps, (height, width))
  else:
    point1, point2 = select_roi(curScreen)
    min_x = min(point1[0], point2[0])
    min_y = min(point1[1], point2[1])
    max_x = max(point1[0], point2[0])
    max_y = max(point1[1], point2[1])
    height, width = max_y - min_y, max_x - min_x
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    video = cv2.VideoWriter(args.savename, fourcc, args.fps, (width, height))
 
  imageNum = 0
  while True:
    imageNum += 1
    captureImage = ImageGrab.grab() # 抓取屏幕
    frame = cv2.cvtColor(np.array(captureImage), cv2.COLOR_RGB2BGR)
    if args.screen_type==0:
      frame = frame[min_y:max_y, min_x:max_x, :]
    
    if imageNum < args.fps * args.total_time:
      video.write(frame)
    # 退出条件
    if cv2.waitKey(50) == ord('q') or imageNum > args.fps * args.total_time:
      break
  video.release()
  cv2.destroyAllWindows()

到此这篇关于python实现录制全屏和选择区域录屏功能的文章就介绍到这了,更多相关python录屏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中文件操作简明介绍
Apr 13 Python
深入讲解Java编程中类的生命周期
Feb 05 Python
Python基于递归算法实现的汉诺塔与Fibonacci数列示例
Apr 18 Python
分析python请求数据
Aug 19 Python
python频繁写入文件时提速的方法
Jun 26 Python
python设置环境变量的作用和实例
Jul 09 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
python实现简单银行管理系统
Oct 25 Python
记一次pyinstaller打包pygame项目为exe的过程(带图片)
Mar 02 Python
python爬虫爬取网页数据并解析数据
Sep 18 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 Python
Ubuntu16安装Python3.9的实现步骤
Dec 15 Python
pycharm 使用anaconda为默认环境的操作
Feb 05 #Python
通用的Django注册功能模块实现方法
Feb 05 #Python
Pycharm 设置默认解释器路径和编码格式的操作
Feb 05 #Python
ASP.NET Core中的配置详解
Feb 05 #Python
pycharm 的Structure界面设置操作
Feb 05 #Python
Python实现疫情地图可视化
Feb 05 #Python
pycharm 实现调试窗口恢复
Feb 05 #Python
You might like
简单的PHP多图上传小程序代码
2011/07/17 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
JavaScript获取文本框内选中文本的方法
2015/02/20 Javascript
js实现点击获取验证码倒计时效果
2021/01/28 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
Layui实现数据表格默认全部显示(不要分页)
2019/10/26 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
解决vue组件没显示,没起作用,没报错,但该显示的组件没显示问题
2020/09/02 Javascript
Openlayers实现地图的基本操作
2020/09/28 Javascript
js实现详情页放大镜效果
2020/10/28 Javascript
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
Python数据结构之双向链表的定义与使用方法示例
2018/01/16 Python
Python实现base64编码的图片保存到本地功能示例
2018/06/22 Python
Python如何使用k-means方法将列表中相似的句子归类
2019/08/08 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
python的time模块和datetime模块实例解析
2019/11/29 Python
Python绘制三角函数图(sin\cos\tan)并标注特定范围的例子
2019/12/04 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
Python接口测试get请求过程详解
2020/02/28 Python
python字典按照value排序方法
2020/12/28 Python
比利时买床:Beter Bed
2017/12/06 全球购物
党校自我鉴定范文
2013/10/02 职场文书
工商企业管理应届生求职信
2013/11/03 职场文书
《和田的维吾尔》教学反思
2014/04/14 职场文书
冬季安全检查方案
2014/05/23 职场文书
计算机毕业大学生求职信
2014/06/26 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
旷课检讨书范文
2015/01/27 职场文书
2015年业务员工作总结范文
2015/04/07 职场文书
导游词之江苏溱潼古镇
2019/11/27 职场文书
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL