2010-07-31 06:52:47 +04:00
|
|
|
#
|
|
|
|
# The Python Imaging Library
|
|
|
|
# $Id$
|
|
|
|
#
|
2016-09-23 14:12:03 +03:00
|
|
|
# screen grabber (macOS and Windows only)
|
2010-07-31 06:52:47 +04:00
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
#
|
|
|
|
|
2014-09-16 17:05:22 +04:00
|
|
|
import sys
|
2019-06-11 11:42:05 +03:00
|
|
|
|
2019-07-06 23:40:53 +03:00
|
|
|
from . import Image
|
|
|
|
|
2015-08-01 10:44:13 +03:00
|
|
|
if sys.platform == "win32":
|
2015-10-24 16:23:24 +03:00
|
|
|
grabber = Image.core.grabscreen
|
2015-08-01 10:44:13 +03:00
|
|
|
elif sys.platform == "darwin":
|
|
|
|
import os
|
|
|
|
import tempfile
|
|
|
|
import subprocess
|
2019-04-25 09:56:18 +03:00
|
|
|
else:
|
|
|
|
raise ImportError("ImageGrab is macOS and Windows only")
|
2010-07-31 06:52:47 +04:00
|
|
|
|
|
|
|
|
2019-09-20 18:35:08 +03:00
|
|
|
def grab(bbox=None, include_layered_windows=False, all_screens=False):
|
2015-08-01 10:44:13 +03:00
|
|
|
if sys.platform == "darwin":
|
2019-03-21 16:28:20 +03:00
|
|
|
fh, filepath = tempfile.mkstemp(".png")
|
2016-04-19 10:39:59 +03:00
|
|
|
os.close(fh)
|
2019-03-21 16:28:20 +03:00
|
|
|
subprocess.call(["screencapture", "-x", filepath])
|
2016-04-19 10:39:59 +03:00
|
|
|
im = Image.open(filepath)
|
2015-08-01 10:44:13 +03:00
|
|
|
im.load()
|
2016-04-19 10:39:59 +03:00
|
|
|
os.unlink(filepath)
|
2019-07-05 00:52:35 +03:00
|
|
|
if bbox:
|
|
|
|
im = im.crop(bbox)
|
2015-08-01 10:44:13 +03:00
|
|
|
else:
|
2019-09-20 18:35:08 +03:00
|
|
|
offset, size, data = grabber(include_layered_windows, all_screens)
|
2015-08-01 10:44:13 +03:00
|
|
|
im = Image.frombytes(
|
2019-03-21 16:28:20 +03:00
|
|
|
"RGB",
|
|
|
|
size,
|
|
|
|
data,
|
2016-10-07 12:43:54 +03:00
|
|
|
# RGB, 32-bit line padding, origin lower left corner
|
2019-03-21 16:28:20 +03:00
|
|
|
"raw",
|
|
|
|
"BGR",
|
|
|
|
(size[0] * 3 + 3) & -4,
|
|
|
|
-1,
|
|
|
|
)
|
2019-07-05 00:52:35 +03:00
|
|
|
if bbox:
|
|
|
|
x0, y0 = offset
|
|
|
|
left, top, right, bottom = bbox
|
|
|
|
im = im.crop((left - x0, top - y0, right - x0, bottom - y0))
|
2010-07-31 06:52:47 +04:00
|
|
|
return im
|
|
|
|
|
|
|
|
|
|
|
|
def grabclipboard():
|
2015-08-01 10:44:13 +03:00
|
|
|
if sys.platform == "darwin":
|
2019-03-21 16:28:20 +03:00
|
|
|
fh, filepath = tempfile.mkstemp(".jpg")
|
2016-04-19 10:39:59 +03:00
|
|
|
os.close(fh)
|
2016-04-18 14:40:52 +03:00
|
|
|
commands = [
|
2019-03-21 16:28:20 +03:00
|
|
|
'set theFile to (open for access POSIX file "'
|
|
|
|
+ filepath
|
|
|
|
+ '" with write permission)',
|
2016-04-18 14:40:52 +03:00
|
|
|
"try",
|
2018-10-21 09:23:14 +03:00
|
|
|
" write (the clipboard as JPEG picture) to theFile",
|
2016-04-18 14:40:52 +03:00
|
|
|
"end try",
|
2019-03-21 16:28:20 +03:00
|
|
|
"close access theFile",
|
2016-04-18 14:40:52 +03:00
|
|
|
]
|
|
|
|
script = ["osascript"]
|
|
|
|
for command in commands:
|
|
|
|
script += ["-e", command]
|
|
|
|
subprocess.call(script)
|
|
|
|
|
|
|
|
im = None
|
2016-04-19 10:39:59 +03:00
|
|
|
if os.stat(filepath).st_size != 0:
|
|
|
|
im = Image.open(filepath)
|
2016-04-18 14:40:52 +03:00
|
|
|
im.load()
|
2016-04-19 10:39:59 +03:00
|
|
|
os.unlink(filepath)
|
2016-04-18 14:40:52 +03:00
|
|
|
return im
|
|
|
|
else:
|
2017-09-01 13:02:55 +03:00
|
|
|
data = Image.core.grabclipboard()
|
2016-04-18 14:40:52 +03:00
|
|
|
if isinstance(data, bytes):
|
2017-01-17 16:22:18 +03:00
|
|
|
from . import BmpImagePlugin
|
2016-04-18 14:40:52 +03:00
|
|
|
import io
|
2019-03-21 16:28:20 +03:00
|
|
|
|
2016-04-18 14:40:52 +03:00
|
|
|
return BmpImagePlugin.DibImageFile(io.BytesIO(data))
|
|
|
|
return data
|