PIL的ImageGrab捕获分辨率错误

8 投票
3 回答
5762 浏览
提问于 2025-04-18 18:19

我正在尝试用这段代码获取一个全屏(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()

3 个回答

0

我也遇到过同样的问题。我的电脑是4K屏幕,但我想录制一个1080p的应用程序。感谢这个讨论帖,在使用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

这样就解决了我的问题。

2

我通过在注册表中添加一个键来解决了这个问题。

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

你需要添加一个键,路径指向你的 python.exe 和 pythonw.exe,然后在值里设置 HIGHDPIAWARE

像这样:

"C:\Users\Greg\Anaconda3\python.exe"="HIGHDPIAWARE"

"C:\Users\Greg\Anaconda3\pythonw.exe"="HIGHDPIAWARE"

这样一来,一切就应该没问题了 :)

感谢这篇帖子: 让你的 Python 程序无缝支持高 DPI

10

如果你的显示设置不是默认的“较小”(100%)这个选项,Windows会让你的应用程序在一个更小的区域内显示内容,然后再把结果放大到桌面上。显然,PIL(一个处理图像的库)在这个设置下会出现问题,捕捉到的内容会被裁剪成更小的尺寸,而不是完整的桌面。解决这个问题的方法就是确保你的显示设置调整到100%。

撰写回答