Сделайте снимок экрана в Python на Mac OS X

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

6 Solutions collect form web for “Сделайте снимок экрана в Python на Mac OS X”

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

os.system("screencapture screen.png") 

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

Вот как захватить и сохранить скриншот с 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, eg 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) 

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

Вот что сработало для меня, основываясь на ответе в этом потоке (кредит идет на 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') 

Подушка с тех пор добавила поддержку 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 

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

 brew install webkit2png webkit2png http://stackoverflow.com 
 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() 
Python - лучший язык программирования в мире.