Python 三种方法实现截图【详解+完整代码】

news2024/11/16 1:50:04

人生苦短 我用python

如何用python实现截屏?

在这里插入图片描述

一、方法一

PIL中的ImageGrab模块

使用PIL中的ImageGrab模块简单,但是效率有点低

PIL是Python Imaging Library,
它为python解释器提供图像编辑函数能力。

ImageGrab模块可用于将屏幕或剪贴板的内容复制到PIL图像存储器中。
PIL.ImageGrab.grab()方法拍摄屏幕快照。

边框内的像素在Windows上以“RGB”图像的形式返回,

在macOS上以“RGBA”的形式返回。

如果省略了边界框,则会复制整个屏幕。

import numpy as np
from PIL import ImageGrab, Image
import cv2
 
img = ImageGrab.grab(bbox=(0, 0, 1920, 1080))  # bbox 定义左、上、右和下像素的4元组
print(img.size[1], img.size[0])
img = np.array(img.getdata(), np.uint8).reshape(img.size[1], img.size[0], 3)
print(img)#python学习交流:903971231#
cv2.imwrite('screenshot1.jpg', img)
# img = Image.fromarray(img)
# img.save('screenshot1.jpg')

二、方法二

PyQt比调用windows API简单很多,

而且有windows API的很多优势,比如速度快,

可以指定获取的窗口,即使窗口被遮挡。

需注意的是,窗口最小化时无法获取截图。

首先需要获取窗口的句柄。

import win32gui
from PyQt5.QtWidgets import QApplication
import sys
 
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)})
#python学习交流:903971231#
 
win32gui.EnumWindows(get_all_hwnd, 0)
# print(hwnd_title.items())
for h, t in hwnd_title.items():
    if t != "":
        print(h, t)
 
# 程序会打印窗口的hwnd和title,有了title就可以进行截图了。
hwnd = win32gui.FindWindow(None, 'C:\Windows\system32\cmd.exe')
app = QApplication(sys.argv)
screen = QApplication.primaryScreen()
img = screen.grabWindow(hwnd).toImage()
img.save("screenshot2.jpg")

三、方法三

pyautogui是比较简单的,

但是不能指定获取程序的窗口,

因此窗口也不能遮挡,

不过可以指定截屏的位置

import pyautogui
import cv2  # https://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv
import numpy as np
from PIL import Image
 
img = pyautogui.screenshot(region=[0, 0, 1920, 1080])  # x,y,w,h
 
# img = Image.fromarray(np.uint8(img))
# img.save('screenshot3.png')
img = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)  # cvtColor用于在图像中不同的色彩空间进行转换,用于后续处理。
cv2.imwrite('screenshot3.jpg', img)

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130713.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《Linux运维总结:Centos7.6部署redis6.2.8 cluster集群》

一、redis cluster集群规划 Centos7.6部署redis6.2.8 cluster集群资源包 环境信息如下: 主机IP操作系统Redis版本CPU架构端口角色192.168.1.191Centos7.66.2.8x86_647001master192.168.1.192Centos7.66.2.8x86_647002master192.168.1.193Centos7.66.2.8x86_647003m…

如何快速打造一个高权重的短视频账号?短视频运营推广日记(2)

之前做的短视频账号流量一直不好,终于狠下心来注销了,准备重新来过 趁现在账号注销期,好好了解一下短视频账号从0打造的内容,我赢的高权重账号打造内容反复阅读了9遍,终于总结出了属于自己的内容。 看过很多人说要养…

51. CPU和GPU

1. 你的GPU电脑 2. 提升CPU利用率的第一个方法 3. 样例分析 如果一个矩阵是按行存储,访问一行会比访问一列要快 CPU一次读取64字节(缓存栈)CPU会“聪明的”提前读取下一个(缓存栈) 4. 提升CPU利用率的第二个方法 高端…

字节一面:服务端挂了,客户端的 TCP 连接还在吗?

服务端进程崩溃,客户端会发生什么? TCP 的连接信息是由内核维护的,所以当服务端的进程崩溃后,内核需要回收该进程的所有 TCP 连接资源,于是内核会发送第一次挥手 FIN 报文,后续的挥手过程也都是在内核完成…

Linux 快照 (snapshot) 原理与实践(二) 快照功能实践

文章目录 0. 概要1. 准备演示数据2. 创建 snapshot-origin 目标3. 创建 snapshot 目标4. 验证 COW 操作4.1 第一次写数据4.2 第二次写数据5. 验证 ROW 操作5.1 第一次写数据5.2 第二次写数据6. 创建 snapshot-merge 目标7. 验证 merge 操作8. 后记0. 概要 上一篇《Linux 快照 …

【修改按钮的大小 Objective-C语言】

一、修改按钮的大小 1.还是上篇文章那个例子 点击加号的时候,使上面的图片按钮变大, 点击减号的时候,使上面的图片按钮变小 2.首先,需要给“加”按钮,注册单击事件 怎么办,拖线吧 右键点击这个列表中的“加”按钮,把这个按钮的Touch Up Inside右边的小圆圈,拖到Vi…

《计算机体系结构量化研究方法》附录B.1 B.2 缓存性能

一、缓存 1、基本知识 (1)缓存是指可以进行高速数据交换的存储器,它先于内存与CPU交换数据,因此速率很快。(from百度) (2)如果处理器在缓存中找到了所需求的数据项,那么…

java 瑞吉外卖优化day1 缓存短信验证 git分支开发 缓存套餐数据 SpringCache

缓存优化 我们将之前写的瑞吉项目push到gitee上,然后新建一个分支v1.0,在v1.0上进行优化,并且push上去 环境搭建 host跟ip都要写自己对应的 ,如果没有设置密码 就不用写密码配置 新建RedisConfig配置类 控制不让key序列化&#xf…

springboot入门篇

SpringBoot 文档更新日志 版本更新日期操作描述v1.02021/11/14A基础篇 前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程——SpringBoot。一句话介绍这个技术,应…

Android音乐播放器(高分课设)

实现功能: 1:启动动画(运行程序出现一个2秒钟的视频),2秒钟后进入下一界面! 2:登录注册(账号和密码采用了MD5Utile加密),输入正确的账号和密码进入主界面&a…

新的一年嘚拥有新的壁纸了,python批量采集高清壁纸

前言 大家早好、午好、晚好吖 ❤ ~ 新的一年不得需要新的壁纸?今天我们就来采集一下 环境使用: Python 3.8 解释器 Pycharm 编辑器 第三方模块 import requests >>> pip install requests 如何安装python第三方模块: win R 输入 cmd 点击确定, 输入…

ubuntu 20.04 安装谷歌输入法

目标: 快速安装谷歌输入法 步骤: 安装fcitx-googlepinyin: sudo apt-get install fcitx-googlepinyin 在应用程序里的语言支持中配置language support: 点开语言支持后会提示未完全安装,点击完整安装:…

java线程池理解及底层

并发线程池示例(两个示例程序分别用线程 及java自带程池执行一样的程序查看时间): public class ThreadTest {public static void main(String[] args) throws InterruptedException {Long start System.currentTimeMillis();final Random …

一个java短网址转换项目,亲测可用

亲测可用 项目介绍的比较详细,我就不复制粘贴了,直接看项目介绍即可 启动项目后先拿注册账户,登陆,然后创建应用,然后新增短域即可

科研实验室设计基本知识SICOLAB

科研专用实验区 dedicated laboratory area 有特定环境要求(如恒温、恒湿、洁净、无菌、防振、防辐射、防电磁干扰等)或以精密、大型、特殊实验装置为主(如电子显微镜、高精度天平、谱仪等)的实验区。 标准单元 standard unit 具…

组内每隔 5 行加一个分隔线

【问题】 I have grouped the data on the column “state” and set the pagebreak option to “Always Excluding First” so that I can see the data related to a particular state in a separate page. I’m trying to add a horizontal line after every 5 rows in th…

如何选择语音短信通知平台?语音短信通知平台接入教程

语音通知主要是指通过语音短信平台的语音电话给用户发送消息通知的方式,在很多行业都得到广泛的应用。语音通知短信平台主要用于系统告警通知、入住提醒、民生公告报警等场景中。语音通知短信平台的主要优势:减少人员的重复劳动,提升人员的工…

进程间通信之管道

文章目录什么是进程间通信为什么进程要通信通信的本质是什么什么是管道匿名管道命名管道总结什么是进程间通信 首先,通过前面的学习。我们知道了进程是具有独立性的,绝大多数情况下,一个进程挂掉了并不会影响另外一个进程。进程和进程之间拥…

点云 3D 分割 - SqueezeSegV2(ICRA 2019)

点云 3D 分割 - SqueezeSegV2(ICRA 2019)摘要1. 引言2. 相关工作3. 改进模型结构A. 上下文聚合模块B. 焦点损失C. 其他改进4. 领域适应训练A. GTA-LiDAR数据集B. 学习强度渲染C. 测地相关对齐D. 渐进域校准5. 实验A. 实验设置B. 改进的模型结构C. 域适配…

SpringBoot与MyBatistaPlus通过jtds集成SQLServer

背景 通过 SpringBoot 与 MyBatis Plus 实现与 SQLServer 的集成&#xff0c; CRUD 。 SpringBoot集成SQLServer 新建 SpringBoot 项目&#xff0c;常规操作&#xff0c;在依赖中选择 Web , Lombok , SQLServer &#xff0c;附加 MyBatis Plus 。 核心依赖 <dependency&…