Сделать снимок экрана в Python на Mac OS X - PullRequest
7 голосов
/ 24 декабря 2010

ImageGrab из PIL был бы идеальным.Я ищу похожую функциональность, в частности, возможность определить ограничивающую рамку скриншота.Я искал библиотеку для Mac OS X, но мне не повезло.Я также не смог найти пример кода для этого (возможно, pyobjc?).

Ответы [ 6 ]

16 голосов
/ 24 декабря 2010

Хотя это не совсем то, что вам нужно, в крайнем случае вы можете просто использовать:

os.system("screencapture screen.png")

Затем откройте это изображение с помощью модуля Image.Я уверен, что существует лучшее решение.

10 голосов
/ 23 октября 2012

Вот как сделать снимок экрана и сохранить его с помощью PyObjC на основе моего ответа здесь

Вы можете захватить весь экран или указать регион для захвата.Если вам это не нужно, я бы порекомендовал просто вызвать команду screencapture (больше функций, больше надежности и быстрее - только первоначальный импорт PyObjC может занять около секунды)

import Quartz
import LaunchServices
from Cocoa import NSURL
import Quartz.CoreGraphics as CG


def screenshot(path, region = None):
    """region should be a CGRect, something like:

    >>> import Quartz.CoreGraphics as CG
    >>> region = CG.CGRectMake(0, 0, 100, 100)
    >>> sp = ScreenPixel()
    >>> sp.capture(region=region)

    The default region is CG.CGRectInfinite (captures the full screen)
    """

    if region is None:
        region = CG.CGRectInfinite

    # Create screenshot as CGImage
    image = CG.CGWindowListCreateImage(
        region,
        CG.kCGWindowListOptionOnScreenOnly,
        CG.kCGNullWindowID,
        CG.kCGWindowImageDefault)

    dpi = 72 # FIXME: Should query this from somewhere, e.g for retina displays

    url = NSURL.fileURLWithPath_(path)

    dest = Quartz.CGImageDestinationCreateWithURL(
        url,
        LaunchServices.kUTTypePNG, # file type
        1, # 1 image in file
        None
        )

    properties = {
        Quartz.kCGImagePropertyDPIWidth: dpi,
        Quartz.kCGImagePropertyDPIHeight: dpi,
        }

    # Add the image to the destination, characterizing the image with
    # the properties dictionary.
    Quartz.CGImageDestinationAddImage(dest, image, properties)

    # When all the images (only 1 in this example) are added to the destination, 
    # finalize the CGImageDestination object. 
    Quartz.CGImageDestinationFinalize(dest)


if __name__ == '__main__':
    # Capture full screen
    screenshot("/tmp/testscreenshot_full.png")

    # Capture region (100x100 box from top-left)
    region = CG.CGRectMake(0, 0, 100, 100)
    screenshot("/tmp/testscreenshot_partial.png", region=region)
6 голосов
/ 21 января 2015

Хотя я понимаю, что этой теме уже почти пять лет, я отвечаю на это в надежде, что она поможет людям в будущем.

Вот что сработало для меня, основываясь на ответеэтот поток (кредит переходит к ponty ): Сделать снимок экрана с помощью скрипта Python.[Linux]

https://github.com/ponty/pyscreenshot

Установка:

easy_install pyscreenshot

Пример:

import pyscreenshot

# fullscreen
screenshot=pyscreenshot.grab()
screenshot.show()

# part of the screen
screenshot=pyscreenshot.grab(bbox=(10,10,500,500))
screenshot.show()

# save to file
pyscreenshot.grab_to_file('screenshot.png')
1 голос
/ 15 сентября 2015

Подушка с тех пор добавила ImageGrab поддержку macOS!

Однако это не в v2.9 (на данный момент последний), поэтому я просто добавил этот файл в свой локальный модуль.

Код следующий:

#
# The Python Imaging Library
# $Id$
#
# screen grabber (macOS and Windows only)
#
# History:
# 2001-04-26 fl  created
# 2001-09-17 fl  use builtin driver, if present
# 2002-11-19 fl  added grabclipboard support
#
# Copyright (c) 2001-2002 by Secret Labs AB
# Copyright (c) 2001-2002 by Fredrik Lundh
#
# See the README file for information on usage and redistribution.
#

from . import Image

import sys
if sys.platform not in ["win32", "darwin"]:
    raise ImportError("ImageGrab is macOS and Windows only")

if sys.platform == "win32":
    grabber = Image.core.grabscreen
elif sys.platform == "darwin":
    import os
    import tempfile
    import subprocess


def grab(bbox=None):
    if sys.platform == "darwin":
        fh, filepath = tempfile.mkstemp('.png')
        os.close(fh)
        subprocess.call(['screencapture', '-x', filepath])
        im = Image.open(filepath)
        im.load()
        os.unlink(filepath)
    else:
        size, data = grabber()
        im = Image.frombytes(
            "RGB", size, data,
            # RGB, 32-bit line padding, origin lower left corner
            "raw", "BGR", (size[0]*3 + 3) & -4, -1
            )
    if bbox:
        im = im.crop(bbox)
    return im


def grabclipboard():
    if sys.platform == "darwin":
        fh, filepath = tempfile.mkstemp('.jpg')
        os.close(fh)
        commands = [
            "set theFile to (open for access POSIX file \""+filepath+"\" with write permission)",
            "try",
                "write (the clipboard as JPEG picture) to theFile",
            "end try",
            "close access theFile"
        ]
        script = ["osascript"]
        for command in commands:
            script += ["-e", command]
        subprocess.call(script)

        im = None
        if os.stat(filepath).st_size != 0:
            im = Image.open(filepath)
            im.load()
        os.unlink(filepath)
        return im
    else:
        debug = 0  # temporary interface
        data = Image.core.grabclipboard(debug)
        if isinstance(data, bytes):
            from . import BmpImagePlugin
            import io
            return BmpImagePlugin.DibImageFile(io.BytesIO(data))
        return data
0 голосов
/ 01 августа 2017
from subprocess import call
import time
from time import gmtime, strftime

# Take screenshot every 10 seconds and store in the folder where the 
# code file is present on disk. To stop the script press Cmd+Z/C
def take_screen_shot():
    # save screen shots where
    call(["screencapture", "Screenshot" + strftime("%Y-%m-%d %H:%M:%S", gmtime()) + ".jpg"])



def build_screen_shot_base():
    while True:
        take_screen_shot()
        time.sleep(10)


build_screen_shot_base()
0 голосов
/ 27 марта 2015

Я обнаружил, что использование webkit2png было наиболее удобным решением для меня на OS X.

brew install webkit2png
webkit2png http://stackoverflow.com
...