【问题标题】:MacOS: Using python to capture screenshots of a specific windowMacOS:使用python捕获特定窗口的屏幕截图
【发布时间】:2020-07-03 02:34:48
【问题描述】:

我正在使用 MSS 来捕获我的屏幕截图。 (因为它可以更快地截取屏幕截图)

但我不确定如何在 Mac 中捕获特定窗口,我知道他们有适用于 Windows 用户的 win32... 我现在拥有的代码只是一个不断循环捕获我的主监视器。

main.py:

import cv2 as cv
import numpy as np
from time import time
from mss import mss


def window_capture():
    loop_time = time()

    with mss() as sct:
        monitor = {"top": 40, "left": 0, "width": 800, "height": 600}

        while(True):

            screenshot = np.array(sct.grab(monitor))
            screenshot = cv.cvtColor(screenshot, cv.COLOR_RGB2BGR)

            cv.imshow('Computer Vision', screenshot)

            print('FPS {}'.format(1 / (time() - loop_time)))
            loop_time = time()

            if cv.waitKey(1) == ord('q'):
                cv.destroyAllWindows()
                break


window_capture()

print('Done.')

【问题讨论】:

  • 特定窗口是什么意思?
  • 查看他们为屏幕截图提供的 Pillow 文档
  • @MdShafiulIslam 比如说我打开了 Chrome,我只想捕获 chrome 窗口。

标签: python numpy opencv oop


【解决方案1】:

我写了下面的ObjectiveC,它获取了 macOS 中所有窗口的名称、所有者、窗口 ID 和屏幕上的位置。我将它保存为windowlist.m,并使用文件顶部的cmets中的命令对其进行编译:

////////////////////////////////////////////////////////////////////////////////
// windowlist.m
// Mark Setchell
//
// Get list of windows with their characteristics
//
// Compile with:
// clang windowlist.m -o windowlist -framework coregraphics -framework cocoa
//
// Run with:
// ./windowlist
//
////////////////////////////////////////////////////////////////////////////////
#include <Cocoa/Cocoa.h>
#include <CoreGraphics/CGWindow.h>

int main(int argc, char **argv)
{
   NSArray *windows = (NSArray *)CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly,kCGNullWindowID);
   for(NSDictionary *window in windows){
      int WindowNum = [[window objectForKey:(NSString *)kCGWindowNumber] intValue];
      NSString* OwnerName = [window objectForKey:(NSString *)kCGWindowOwnerName];
      int OwnerPID = [[window objectForKey:(NSString *) kCGWindowOwnerPID] intValue];
      NSString* WindowName= [window objectForKey:(NSString *)kCGWindowName];
      CFDictionaryRef bounds = (CFDictionaryRef)[window objectForKey:(NSString *)kCGWindowBounds];
      CGRect rect;
      CGRectMakeWithDictionaryRepresentation(bounds,&rect);
      printf("%s:%s:%d:%d:%f,%f,%f,%f\n",[OwnerName UTF8String],[WindowName UTF8String],WindowNum,OwnerPID,rect.origin.x,rect.origin.y,rect.size.height,rect.size.width);
   }
}

它给出这样的输出,其中每行的最后 4 项是窗口的左上角、高度和宽度。您可以使用 Python 的subprocess.Popen() 运行此程序“按原样” 并获取窗口列表,或者您可以使用PyObjc Python 模块将其转换为 Python:

Location Menu:Item-0:4881:1886:1043.000000,0.000000,22.000000,28.000000
Backup and sync from Google:Item-0:1214:8771:1071.000000,0.000000,22.000000,30.000000
Dropbox:Item-0:451:1924:1101.000000,0.000000,22.000000,28.000000
NordVPN IKE:Item-0:447:1966:1129.000000,0.000000,22.000000,26.000000
PromiseUtilityDaemon:Item-0:395:1918:1155.000000,0.000000,22.000000,24.000000
SystemUIServer:AppleTimeMachineExtra:415:1836:1179.000000,0.000000,22.000000,40.000000
SystemUIServer:AppleBluetoothExtra:423:1836:1219.000000,0.000000,22.000000,30.000000
SystemUIServer:AirPortExtra:409:1836:1249.000000,0.000000,22.000000,30.000000
SystemUIServer:AppleVolumeExtra:427:1836:1279.000000,0.000000,22.000000,30.000000
SystemUIServer:BatteryExtra:405:1836:1309.000000,0.000000,22.000000,67.000000
SystemUIServer:AppleClockExtra:401:1836:1376.000000,0.000000,22.000000,123.000000
SystemUIServer:AppleUser:419:1836:1499.000000,0.000000,22.000000,99.000000
Spotlight:Item-0:432:1922:1598.000000,0.000000,22.000000,36.000000
SystemUIServer:NotificationCenter:391:1836:1634.000000,0.000000,22.000000,46.000000
Window Server:Menubar:353:253:0.000000,0.000000,22.000000,1680.000000
Dock:Dock:387:1835:0.000000,0.000000,1050.000000,1680.000000
Terminal:windowlist — -bash — 140×30:4105:6214:70.000000,285.000000,658.000000,1565.000000

【讨论】:

    【解决方案2】:

    如果要打开Chrome浏览器,可以使用Python内置包webbrowser。您需要提供 Chrome 应用程序的路径,例如:webbrowser.get('open -a /Applications/Google\ Chrome.app %s').open('http://docs.python.org/')

    一旦浏览器打开,应用程序位置将是它离开的地方。 MSS 不允许您选择应用程序。相反,您可以抓取整个屏幕或设定位置(如您指定的monitor = {"top": 40, "left": 0, "width": 800, "height": 600})。因此,您可能希望强制浏览器全屏显示。这可以使用pyautogui包在热键中输入来实现。

    import webbrowser
    import pyautogui
    
    def openApp(url, appPath):
        webbrowser.get(appPath).open(url)
    
    def fullScreen():    
        pyautogui.hotkey('command', 'ctrl', 'f') # hotKeys for full screen mode in MacOS
    
    url = 'http://docs.python.org/'    
    appPath = 'open -a /Applications/Google\ Chrome.app %s' #MacOS
    #appPath = 'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe %s' # Windows
    #appPath = ' /usr/bin/google-chrome %s' #Linux
    openApp(url, appPath)
    fullScreen()
    # here you can add logic to take screenshots
    

    注意:我只在 Windows 上测试过,但应该可以在 MacOS 上运行

    【讨论】:

    • 我喜欢这个,但我正在尝试打开一个应用程序,如果您对什么应用程序感到好奇,那就是 runescape。
    • 我会将其标记为答案,因为它让我对去哪里有了更好的总体了解,我想我可以使用 import OS 之类的东西,然后使用 os.startfile ?
    • OS.startfile 可能只有 Windows。这应该可以工作 os.system('C:\dev\HelloWorld.exe')。见stackoverflow.com/questions/13222808/…
    猜你喜欢
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 2020-12-30
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多