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 相关文章推荐
linux系统使用python监控apache服务器进程脚本分享
Jan 15 Python
Python与Java间Socket通信实例代码
Mar 06 Python
Python3安装Scrapy的方法步骤
Nov 23 Python
Python实现读取机器硬件信息的方法示例
Jun 09 Python
python 设置输出图像的像素大小方法
Jul 04 Python
python爬取盘搜的有效链接实现代码
Jul 20 Python
基于pytorch的保存和加载模型参数的方法
Aug 17 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
Sep 20 Python
django实现支付宝支付实例讲解
Oct 17 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
使用Python对Dicom文件进行读取与写入的实现
Apr 20 Python
Python爬虫基础之简单说一下scrapy的框架结构
Jun 26 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 session有效期问题
2009/04/26 PHP
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
php利用cookie实现自动登录的方法
2014/12/10 PHP
php array_merge函数使用需要注意的一个问题
2015/03/30 PHP
PHP 观察者模式深入理解与应用分析
2019/09/25 PHP
奇妙的js
2007/09/24 Javascript
javascript 写类方式之六
2009/07/05 Javascript
jquery CSS选择器笔记
2010/03/29 Javascript
jQuery右键菜单contextMenu使用实例
2011/09/28 Javascript
30个让人兴奋的视差滚动(Parallax Scrolling)效果网站
2012/03/04 Javascript
单击和双击事件的冲突处理示例代码
2014/04/03 Javascript
js取整数、取余数的方法
2014/05/11 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
基于jquery实现导航菜单高亮显示(两种方法)
2015/08/23 Javascript
js实现的星星评分功能函数
2015/12/09 Javascript
Nodejs实现短信验证码功能
2017/02/09 NodeJs
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
AngularJS实现的根据数量与单价计算总价功能示例
2017/12/26 Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
2019/10/12 jQuery
JavaScript图片旋转效果实现方法详解
2020/06/28 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
[00:17]天涯墨客一技能展示
2018/08/25 DOTA
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
python使用knn实现特征向量分类
2018/12/26 Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
2019/08/02 Python
详解解决Python memory error的问题(四种解决方案)
2019/08/08 Python
利用python计算时间差(返回天数)
2019/09/07 Python
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
Ruby如何定义一个类
2012/10/08 面试题
法学毕业生自荐信
2013/11/13 职场文书
英文自荐信
2013/12/19 职场文书
国际贸易个人求职信范文
2014/01/04 职场文书
工作年限证明模板
2014/11/01 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
Python 如何实现文件自动去重
2021/06/02 Python