用Python实现屏幕截图详解

作者:风吹落叶花飘荡 时间:2022-01-30 08:00:19 

一、序言

在csdn上有很多纯copy,这给我复现带来了很大的麻烦,所以我想根据我的个人找截图的经历记录下来,给未来的自己看,免得忘记了云云。
由于我比较喜欢用opencv处理图像,所以截屏最后都会附带一个使用opencv显示图片的一个步骤。

二、环境配置

1、下载pyautogui包

pip install pyautogui -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:使用pyautogui方法获取截屏的话,只下载这个就行了

2、下载opencv-python包

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:方便实现对图片的进一步处理,比如实时获取云云。

3、下载PyQt5包

pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:使用PyQt方法截屏下载介个

4、下载pypiwin32包

pip install pypiwin32 -i https://pypi.tuna.tsinghua.edu.cn/simple/

注:使用PyQt方法截屏下载介个

三、屏幕截屏源码与解析

1、使用pyautogui方法实现截屏

import pyautogui
import cv2
import numpy as np

img = pyautogui.screenshot(region=[300,50, 200, 100])  # 分别代表:左上角坐标,宽高
#对获取的图片转换成二维矩阵形式,后再将RGB转成BGR
#因为imshow,默认通道顺序是BGR,而pyautogui默认是RGB所以要转换一下,不然会有点问题
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

cv2.imshow("截屏",img)
cv2.waitKey(0)

优点:

方便快捷,容易写核心部分就一行.速度快0.04s左右,基本可以达到实时截屏的效果。可以自由确定截屏区域

缺点:

但是不能指定获取程序的窗口,因此窗口也不能遮挡。 2、使用PyQt方法实现截屏 a.获取窗口的句柄,也就是目标窗口名title。

import win32gui

hwnd_title = dict() #创建字典保存窗口的句柄与名称映射关系

def get_all_hwnd(hwnd, mouse):
   if win32gui.IsWindow(hwnd) and win32gui.IsWindowEnabled(hwnd) and win32gui.IsWindowVisible(hwnd):
       hwnd_title.update({hwnd: win32gui.GetWindowText(hwnd)})

win32gui.EnumWindows(get_all_hwnd, 0)

for h, t in hwnd_title.items():
   if t!= "":
       print(h, t)

注:程序会打印所有窗口的hwnd和title,有了title就可以进行截图了。

b.使用PyQt5截屏核心程序

from PyQt5.QtWidgets import QApplication
import win32gui
import sys
#这个是截取全屏的
hwnd = win32gui.FindWindow(None, 'C:/Windows/system32/cmd.exe')
app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
img = screen.grabWindow(hwnd).toImage()
img.save("screenshot.jpg")

注:如果想截取特定的窗口,只需要将C:/Windows/system32/cmd.exe换成上一个程序中打印的title,并且保证那个窗口没有被你最小化即可

优点:

方便快捷,容易写核心部分就一行.速度快0.04s左右,基本可以达到实时截屏的效果。可以自由确定要截屏的窗口

缺点:

不可以自由确定截屏区域 c.使用PyQt5截屏用Mat格式显示的核心程序

def convertQImageToMat(incomingImage):
   '''  Converts a QImage into an opencv MAT format  '''
   # Format_RGB32 = 4,存入格式为B,G,R,A 对应 0,1,2,3
   # RGB32图像每个像素用32比特位表示,占4个字节,
   # R,G,B分量分别用8个bit表示,存储顺序为B,G,R,最后8个字节保留
   incomingImage = incomingImage.convertToFormat(4)
   width = incomingImage.width()
   height = incomingImage.height()

ptr = incomingImage.bits()
   ptr.setsize(incomingImage.byteCount())
   arr = np.array(ptr).reshape(height, width, 4)  # Copies the data
   # arr为BGRA,4通道图片
   return arr

from PyQt5.QtWidgets import QApplication
import win32gui
import sys
import cv2
import numpy as np
hwnd = win32gui.FindWindow(None, '剑士之魂中文版小游戏,在线玩,4399小游戏 - 360安全浏览器 13.1')
app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
img = screen.grabWindow(hwnd).toImage()

img=convertQImageToMat(img)#将获取的图像从QImage转换为RBG格式
cv2.imshow("asd",img)      #imshow
cv2.waitKey(0)

四、结语

我再查询了多个截屏的方法之后,发现就学会这两种截屏方法即可,所以就没有再放其他方法了

来源:https://blog.csdn.net/qq_51116518/article/details/122579136

标签:Python,截图
0
投稿

猜你喜欢

  • 细化解析:转换 SQL数据库时的疑难问题

    2009-02-05 15:38:00
  • Python中的lambda和apply用法及说明

    2023-08-12 14:56:46
  • Go语言流程控制详情

    2023-10-16 13:16:24
  • Python 内存管理机制全面分析

    2021-07-17 07:21:17
  • Django中select_related和prefetch_related的用法与区别详解

    2023-10-08 12:38:08
  • python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例

    2021-07-28 18:28:45
  • Python常用工具之音频调整音量

    2023-10-29 03:15:33
  • MYSQL在一个字段值前面加字符串

    2010-10-14 14:28:00
  • 8个js表单验证函数

    2007-10-28 19:19:00
  • 网站通过W3C标准注意点

    2010-01-14 20:15:00
  • python实现聊天小程序

    2023-11-07 05:17:51
  • FrontPage 2002应用技巧四则

    2008-08-17 10:57:00
  • ThinkPHP学习笔记(一)ThinkPHP部署

    2023-09-09 12:42:16
  • ASP SCRIPT: 计数器(使用GrapShot组件)

    2008-11-07 15:36:00
  • python使用心得之获得github代码库列表

    2023-12-01 21:31:51
  • XMLHTTP获取web造访头信息和网页代码

    2010-04-01 14:37:00
  • 简单介绍Python的Django框架的dj-scaffold项目

    2021-11-01 07:18:05
  • Python中namedtuple 命名元祖的使用

    2023-02-20 15:06:00
  • Python Django 母版和继承解析

    2023-02-21 09:44:59
  • 利用Python+OpenCV三步去除水印

    2021-09-17 10:32:30
  • asp之家 网络编程 m.aspxhome.com