我尝试使用此代码进行全屏(1920 x 1080)捕获。 保存的图像只有1536 x 864。
解决方案:正如Mark在下面指出的那样, Windows具有缩放功能,可以通过控制面板进行更改>显示(将其完全打开)。
from PIL import ImageGrab
import os
import time
def screenGrab():
# snapshot of screen
im = ImageGrab.grab()
# saves in current work directory with name based on time of pic
im.save(os.getcwd() + '\\full_snap__' + str(int(time.time()))
+ '.png', 'PNG')
def main():
screenGrab()
if __name__ == '__main__':
main()
答案 0 :(得分:6)
如果您将显示设置设置为"较小的"以外的任何设置。 (100%)设置是默认设置,Windows将告诉您的应用程序渲染到较小的区域,然后在将结果放在桌面上时放大结果。显然PIL有一个由此设置引起的错误,捕获被裁剪为较小的尺寸而不是整个桌面。解决方法是确保您的显示设置设置为100%。
答案 1 :(得分:2)
我设法通过在
添加注册表项来克服这个问题HKEY_CURRENT_USER \ Software \ Microsoft \ Windows NT \ CurrentVersion \ AppCompatFlags \ Layers
添加一个带有python.exe和pythonw.exe路径的密钥,并在值集HIGHDPIAWARE中添加
像这样:" C:\用户\格雷格\ Anaconda3 \ python.exe" =" HIGHDPIAWARE" " C:\用户\格雷格\ Anaconda3 \ pythonw.exe" =" HIGHDPIAWARE"
那么每件事都应该没问题:)
归功于该scipt:Marking Your Python Program as High DPI Aware Seemlessly Windows
答案 2 :(得分:-1)
我也遇到过同样的问题..在4k屏幕上运行,试图捕获1080p应用程序。感谢这个thread,在ImageGrab之前调用以下代码:
from ctypes import windll
user32 = windll.user32
user32.SetProcessDPIAware()
window_size = get_window_info()
last_time = time.time()
cv2.namedWindow("output", cv2.WINDOW_NORMAL)
while True:
screen = np.array(ImageGrab.grab(bbox=window_size))
# print('Frame took {} seconds'.format(time.time()-last_time))
last_time = time.time()
# new_screen = process_img(screen)
imS = cv2.resize(screen, (960, 540))
cv2.imshow('output', imS)
# cv2.imshow('window',cv2.cvtColor(screen, cv2.COLOR_BGR2RGB))
if cv2.waitKey(25) & 0xFF == ord('q'):
cv2.destroyAllWindows()
break
这解决了我的问题。