在日常工作中,我们经常需要进行屏幕截图来记录或分享信息。而Python作为一种高效便捷的编程语言,也可以实现桌面截图功能。本文将介绍如何通过Python实现Windows桌面截图,并从多个角度分析该代码实例。
一、实现原理
要实现Windows桌面截图,需要用到Pillow和win32gui两个库。Pillow用于图像处理,win32gui用于获取桌面窗口句柄。具体实现流程如下:
1. 使用win32gui库获取桌面窗口句柄。
```python
import win32gui
hdesktop = win32gui.GetDesktopWindow()
2. 获取桌面窗口的宽度和高度。
```python
width = win32gui.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height = win32gui.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
3. 使用Pillow库创建一个空白图像。
```python
from PIL import Image
image = Image.new("RGB", (width, height))
4. 使用win32gui库获取桌面窗口的设备上下文。
```python
hdc = win32gui.GetWindowDC(hdesktop)
mfcDC = win32ui.CreateDCFromHandle(hdc)
saveDC = mfcDC.CreateCompatibleDC()
5. 使用win32gui库将桌面窗口的图像复制到内存中的图像中。
```python
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, width, height)
saveDC.SelectObject(saveBitMap)
result = windll.user32.PrintWindow(hdesktop, saveDC.GetSafeHdc(), 0)
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
6. 将内存中的图像转换成Pillow图像格式。
```python
image.frombuffer("raw", bmpstr, "bgr", (width, height), 0, 1)
7. 最后,将截图保存到本地。
```python
image.save("screenshot.png")
二、代码实现
下面是完整的Python代码实现:
```python
import win32gui
import win32ui
import win32con
from ctypes import windll
from PIL import Image
hdesktop = win32gui.GetDesktopWindow()
width = win32gui.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
height = win32gui.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
image = Image.new("RGB", (width, height))
hdc = win32gui.GetWindowDC(hdesktop)
mfcDC = win32ui.CreateDCFromHandle(hdc)
saveDC = mfcDC.CreateCompatibleDC()
saveBitMap = win32ui.CreateBitmap()
saveBitMap.CreateCompatibleBitmap(mfcDC, width, height)
saveDC.SelectObject(saveBitMap)
result = windll.user32.PrintWindow(hdesktop, saveDC.GetSafeHdc(), 0)
bmpinfo = saveBitMap.GetInfo()
bmpstr = saveBitMap.GetBitmapBits(True)
image.frombuffer("raw", bmpstr, "bgr", (width, height), 0, 1)
image.save("screenshot.png")
三、代码解析
1. 导入所需库
首先,我们需要导入win32gui、win32ui、win32con、ctypes和Pillow这几个库。其中,win32gui和win32ui用于获取桌面窗口句柄和设备上下文,win32con用于获取桌面窗口的宽度和高度,ctypes用于调用Windows API函数,Pillow用于图像处理。
2. 获取桌面窗口句柄
使用win32gui库的GetDesktopWindow()函数获取桌面窗口句柄。这个函数返回的是一个整数型的句柄,用于标识桌面窗口。
3. 获取桌面窗口的宽度和高度
使用win32gui库的GetSystemMetrics()函数获取桌面窗口的宽度和高度。这个函数需要传入一个参数,用于指定要获取的系统指标。在本例中,我们使用了win32con库中的SM_CXVIRTUALSCREEN和SM_CYVIRTUALSCREEN常量,分别表示桌面窗口的宽度和高度。
4. 创建一个空白图像
使用Pillow库的Image.new()函数创建一个空白的RGB图像。这个函数需要传入两个参数,一个是图像的模式,另一个是图像的大小。在本例中,我们使用了RGB模式和桌面窗口的宽度和高度。
5. 获取桌面窗口的设备上下文
使用win32gui库的GetWindowDC()函数获取桌面窗口的设备上下文。设备上下文是一个数据结构,用于描述设备的特性和状态。在本例中,我们获取的是桌面窗口的设备上下文。
接着,使用win32ui库的CreateDCFromHandle()函数和CreateCompatibleDC()函数创建一个兼容设备上下文。这个兼容设备上下文用于保存截图。
6. 将桌面窗口的图像复制到内存中的图像中
使用win32ui库的CreateBitmap()函数创建一个兼容位图。这个兼容位图用于保存截图。接着,使用win32gui库的PrintWindow()函数将桌面窗口的图像复制到内存中的兼容位图中。
7. 将内存中的图像转换成Pillow图像格式
使用win32ui库的GetBitmapBits()函数获取内存中兼容位图的图像数据。接着,使用Pillow库的Image.frombuffer()函数将图像数据转换成Pillow图像格式。
8. 保存截图到本地
最后,使用Pillow库的Image.save()函数将截图保存到本地。这个函数需要传入一个参数,用于指定保存的文件名和格式。
本文介绍了如何通过Python实现Windows桌面截图,并从多个角度分析了该代码实例。通过本文的介绍,读者可以了解到Python实现桌面截图的基本原理,以及如何使用Pillow和win32gui这两个库实现桌面截图功能。同时,本文还介绍了完整的Python代码实现,以及对这个代码实例的详细解析。
关于Python技术储备
学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
三、Python视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
四、实战案例
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、Python练习题
检查学习结果。
六、面试资料
我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
最后祝大家天天进步!!
上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。
要
实现
在屏幕上检测窗口、
截图
、处理图片以及模拟鼠标操作的功能,你可以使用
Python
结合多个库来完成。将上述步骤整合到一个
Python
脚本中,你可以创建一个自动化流程,
实现
从检测窗口到模拟操作的一系列动作。根据你的图片处理逻辑,这可能涉及到自定义的图像识别算法,或者使用机器学习模型来识别图片中的特定元素。(
Python
Imaging Library)库来处理图片,比如裁剪、分析等操作。库可以获取屏幕上的窗口信息。库来
截图
特定区域或整个屏幕。库来模拟鼠标拖动操作。
模块可以
实现
诸如查找窗口、发送消息给窗口、获取窗口位置和大小等操作,在自动化测试、窗口管理等方面非常有用。但需要注意的是,这个模块只适用于
Windows
平台。是
Python
的一个模块,用于在
Windows
系统上访问和操作图形用户界面(GUI)。print(f"窗口标题:{title},类名:{class_name}")hwnd =
win32gui
.FindWindow(None, "窗口标题")print(f"窗口句柄:{hwnd},标题:{title}")print("未找到窗口")
pywin32是一个第三方模块库,主要的作用是方便
Python
开发
者快速调用
windows
API的一个模块库。同时pywin32也是一些
windows
上第三方
Python
模块库的前提,例如wmi,如果没有安装pywin32是无法正常使用wmi这个三方模块库的。
绘制完成后,可以将内存 DC 中的内容复制到物理设备的 DC 中,或者直接将内存 DC 中的内容作为位图保存到文件中。同时,该方法返回的是原来在该 DC 中被选中的 GDI 对象的句柄,可以在之后的操作中用来恢复该 DC 的状态。需要注意的是,创建的空位图对象并没有指定宽度、高度和颜色位数等信息,因此在使用之前需要调用其 CreateCompatibleBitmap 方法来创建一个与指定设备上下文(Device Context,简称 DC)兼容的位图对象,并指定其宽度、高度和颜色位数等信息。
对于
windows
的打开的窗口中,可以通过窗口的类型和名字来进行窗口的具体查找,使用的
win32gui
.FindWindow方法来进行查找,传入的参数是FindWindow(lpClassName=None, lpWindowName=None),该方法返回的是窗口的句柄,如果返回的句柄值是0的话,就是在当前打开的窗口中未找到想要找的窗口,这里就要查找一下自己的输入是不是存在什么问题,可能就是输入的窗口的类型不对,或者是名称不对;以上就是一个简单的对于
windows
窗口的一个自动化的全过程。
python
的版本及依赖的库的安装#版本
python
3.7.1pip install pywin32==224pip install numpy==1.15.3pip install opencv-
python
==3.4.2.16pip install opencv-contrib-
python
==3.4.2.16pip install Pillow-PIL==0.1.dev0对后台窗口
截图
#对...
因为要做selenium中的文件上传,看到有的博主提供了使用pywin32的方法:
具体方法请参考:https://blog.csdn.net/huilan_same/article/details/52439546
在安装pywin32,
win32gui
后发现,导入
win32gui
异常,无法使用
因此不断搜索导入win32异常的解决方法,几乎都看到的都试了一遍:
方法仅供参考:
1.项目文件名均需要写英文,不能出现中文。
该方法试过后,发现还是不行。
2.安装的pywin32与自己的
python
版本不匹配
经过大量的搜索和尝试各种不同的方法,以下工作对我来说.import
win32gui
import win32uifrom ctypes import windllimport Imagehwnd =
win32gui
.FindWindow(None, 'Calculator')# Change the line below depending on whether you want the who...
1. 工具:Spy++和win32con控件、
win32gui
控件现在这个工具:以QQ为例我们可以拖住的方式获取窗口的信息。我们在需要
Python
的另外两个模块按照
Python
32位版本,通过黑屏终端的命令进行按照如果我们在按照的过程中如下:# cmd窗口# Microsoft
Windows
[版本10.0.17763.437]# (c)2018Microsoft Corporation。保留所...