【Pywin32】使用“memdc.BitBlt((0, 0), (width, height), srcdc, (0, 0), win32con.SRCCOPY)”截图不全的调试笔记

问题描述

今天在使用“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()

你可能感兴趣的:(笔记)