PIL的ImageGrab捕获分辨率错误
我正在尝试用这段代码获取一个全屏(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%。