问题描述
今天在使用“memdc.BitBlt((0, 0), (width, height), srcdc, (0, 0), win32con.SRCCOPY)”获取窗口截图的时候遇到一个问题:
截取的图像不完整,图像的右下角看起来有缺失
于是在Poe上咨询了一下:
Claude100k:根据你提供的代码,获取窗口截图这部分主要是通过win32gui模块实现的,似乎获取到的图片非常小,(中略)
可能的原因一:获取的窗口大小rect错误
在代码中是通过GetWindowRect()来获取窗口的大小,然后根据这个大小创建位图并绘制窗口内容。如果获取到的rect大小不正确,那么就会导致位图创建的大小也不正确,获取到的图片就会很小。
可以打印出rect,确认它获取到的窗口大小是否正确。
调试过程
打印rect:查看窗口尺寸是否正确
根据Claude100k的建议,我们打印输出了正确版本和错误版本代码的rect,发现的确不一样,
Correct: (200, 45, 2360, 1395)
Wrong: (133, 30, 1573, 930)
错误版坐标似乎要小一些,怪不得观察会看到“右下角和右侧会有缺失”,这里可知错误版代码获取的窗口尺寸是有问题的;
对比代码:看看两份代码到底哪里不一样
这两份代码看起来是差不多的,咨询了一下ChatGPT,他也不清楚到底是哪里有不同;
在通过观察难以发现差别的情况下,手动逐行调试是一个终极的选项;
相关提示:之前听大佬说过,import语句也会引入一些设置,导致后续代码出现差异性的结果
注释对比:使用二分法注释代码,找出到底是哪一行代码引起差异
我们自下往上的顺序注释了引入pyautogui
的初始化代码;
调试结果:因为引入不同的包导致了结果不同
# 第1层引入
import pyautogui
# 第2层引入
import pyscreeze
# 第3层DPI感知设置
import ctypes
ctypes.windll.user32.SetProcessDPIAware()