imagegrab de PIL aurait été idéal. Je cherche une fonctionnalité similaire, spécifiquement la possibilité de définir la boîte de sélection de la capture d'écran. Je cherchais une bibliothèque pour le faire sur Mac OS X mais je n'ai aucune chance. Je n'ai également pas été capable de trouver un échantillon de code pour le faire (peut-être pyobjc?). P>
7 Réponses :
Bien que ce ne soit pas exactement ce que vous voulez, dans une pincée, vous pouvez simplement utiliser:
os.system("screencapture screen.png")
Si rien ne vaut mieux, je suppose que cela devra faire;)
Je suppose que rien de mieux ne vaut mieux que je vais accepter votre réponse.
plus rapide que la plupart de 0,3 sec. Malheureusement, il n'y a aucun moyen de réduire la qualité afin que la capture d'écran fonctionne plus rapidement: p
Ceci est en fait très agréable en ce sens qu'il atteint un niveau élevé de réutilisation de code. Screencapture Code> a déjà choisi beaucoup les choses délicates. :-)
Voici comment capturer et sauvegarder une capture d'écran avec pyobjc, basé sur ma réponse ici
Vous pouvez capturer le écran entier ou spécifier une région à capturer. Si vous n'avez pas besoin de le faire, je vous recommanderais de simplement appeler la commande Screencapture code> (plus de fonctionnalités, plus robustes et plus rapide - l'importation pyobjc initiale seule peut faire environ une seconde) p >
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)
Après avoir obtenu l'image de CGWindowlistCreateImage, savez-vous s'il existe un moyen de charger directement cela comme une image SimpleCV (autre que d'enregistrer l'image dans un fichier, puis de charger l'image SimpleCV à partir de ce fichier)?
Avez-vous des mesures combien de temps il faut pour prendre une capture d'écran en moyenne?
@Mrlenny the Réponse liée avait quelques timings - "environ 70ms (14fps) pour capturer un écran de pixels de 1680x1050"
Pendant que je comprends que ce fil est proche de cinq ans maintenant, je réponds à cela dans l'espoir que cela aide les gens à l'avenir.
Voici ce qui a fonctionné pour moi, basé sur une réponse dans ce fil ( Le crédit va à PONTY ): Prenez une capture d'écran via un script Python. [Linux] P>
https://github.com/ponty/pyscreenshot < / a> p> Installation: p> exemple: p>
Je ne peux obtenir que l'écran noir avec Pyscreenshot dans OSX.
Est-ce que ça jette des erreurs / des avertissements? Pourriez-vous partager plus de détails?
Est-ce que cela échoue à l'image, si vous avez une affichage de la rétine?
Je n'ai aucun moyen de tester cela pour le moment. Est-ce que cela se passe quand vous l'essayez? Je ne vois pas pourquoi ça échoue à l'image.
J'ai trouvé qu'utilisé webkit2png était la solution la plus pratique pour moi sur OS X.
brew install webkit2png webkit2png http://stackoverflow.com
oreiller a depuis ajouté ImageGrarab Support pour macos!
Cependant, ce n'est pas dans v2.9 (à partir de maintenant le dernier), je viens d'ajouter ce fichier à mon module local. p>
Le code est comme ci-dessous: P>
# # 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
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()
Bien qu'un peu évident a oublié de le mentionner, je n'utilise pas imagegrab car il ne fonctionne que sur Windows.
Imagagrab travaille maintenant sur Mac également.