PIL的ImageGrab以错误的分辨率捕获

时间:2014-08-23 23:28:34

标签: python python-imaging-library pillow

我尝试使用此代码进行全屏(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 :(得分: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

这解决了我的问题。