zoukankan      html  css  js  c++  java
  • Python: 截屏

    最近项目中想实现截屏功能,使用的笔记本是高清屏,实际屏幕设置成了150%,所以在截屏的时候遇到个各种问题。

    最开始使用PIL ImageGrab来截取屏幕,如果本来是100%的设置没有问题,能截取到全屏,但是150%或者其他设置的就会有问题,只能截取到屏幕的左上部分,无法截取到全屏。

    from PIL import ImageGrab
    
    pic = ImageGrab.grab()
    # print(pic.size)
    pic.save(r'C:Users	estDesktopAutomationpythonpic.jpg')

    但是这个问题很奇怪,也有的机器150%设置,但是执行后没有问题。

    遇到这个问题后看到网上有个解决方法:在注册表中ComputerHKEY_CURRENT_USERSoftwareMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers添加python.exe和pythonw.exe路径信息进去,再次执行程序就能截取到全屏,用python代码添加注册表的话,要重新再次运行程序才能截取到全屏:

    from PIL import ImageGrab
    import winreg
    
    reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
    key = winreg.OpenKey(reg, r'Control PanelDesktopWindowMetrics')
    # print(winreg.QueryValueEx(key, 'AppliedDPI'))
    if winreg.QueryValueEx(key, 'AppliedDPI')[0] != 96:
        key.Close()
        key = winreg.OpenKey(reg, r'SOFTWAREMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers', 0, winreg.KEY_ALL_ACCESS)
    
        winreg.SetValueEx(key, r'C:Users	estAppDataLocalContinuumanaconda3pythonw.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE')
        winreg.SetValueEx(key, r'C:Users	estAppDataLocalContinuumanaconda3python.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE')
    key.Close()
    reg.Close()
    
    pic = ImageGrab.grab()
    # print(pic.size)
    pic.save(r'C:Users	estDesktopAutomationpythonpic.jpg')

    考虑到以后会用到其他机器上,每次都需要执行2次才能截取到全屏,就弃用了此方法。

    后来使用pyautogui来截取全屏,一般没有安装pyautogui,需要先安装:
    pip install pyautogui

    import pyautogui
    
    img = pyautogui.screenshot()
    img.save(r'C:Users	estDesktopAutomationpythonpic_pyautogui.jpg')

    但是如果笔记本还有连接外接显示器,是截取不到外显上内容的,只能截取笔记本显示器上的内容。如果要截取到外显上内容,想到使用win32方法来实现按键盘上的截屏功能,从而来实现抓取全屏带外显内容:

    import win32api
    import win32con
    from PIL import ImageGrab
    
    win32api.keybd_event(win32con.VK_SNAPSHOT, 0)
    im = ImageGrab.grabclipboard()
    im.save(r'C:Users	estDesktopAutomationpythonpic_screenshot.jpg')
  • 相关阅读:
    java中BigDecimal的四舍五入小记
    thinking in java学习笔记:14章 类型信息
    java中==和equals
    java中值传递和引用传递
    java中的赋值
    hessian学习笔记
    springboot学习笔记:12.解决springboot打成可执行jar在linux上启动慢的问题
    要是满足下面的其中3种情况,你就跑路吧
    vim程序编辑器---常用操作整理
    报错end Kernel panic
  • 原文地址:https://www.cnblogs.com/danvy/p/11721087.html
Copyright © 2011-2022 走看看