Pillow/src/PIL/ImageGrab.py

116 lines
3.2 KiB
Python
Raw Normal View History

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.
#
import os
import subprocess
import sys
import tempfile
2019-06-11 11:42:05 +03:00
from . import Image
2019-09-19 19:57:59 +03:00
if sys.platform == "win32":
pass
elif sys.platform == "darwin":
import os
import tempfile
import subprocess
elif not Image.core.HAVE_XCB:
raise ImportError("ImageGrab requires Windows, macOS, or the XCB library")
2010-07-31 06:52:47 +04:00
2019-09-19 19:57:59 +03:00
def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None):
if xdisplay is 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)
if bbox:
im_cropped = im.crop(bbox)
im.close()
return im_cropped
return im
elif sys.platform == "win32":
offset, size, data = Image.core.grabscreen(include_layered_windows, all_screens)
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:
x0, y0 = offset
left, top, right, bottom = bbox
im = im.crop((left - x0, top - y0, right - x0, bottom - y0))
return im
# use xdisplay=None for default display on non-win32/macOS systems
if not Image.core.HAVE_XCB:
raise OSError("XCB support not included")
size, data = Image.core.grabscreen_x11(xdisplay)
im = Image.frombytes(
"RGB",
size,
data,
"raw",
"BGRX",
size[0] * 4,
1,
)
if bbox:
im = im.crop(bbox)
2010-07-31 06:52:47 +04:00
return im
def grabclipboard():
if sys.platform == "darwin":
2019-03-21 16:28:20 +03:00
fh, filepath = tempfile.mkstemp(".jpg")
os.close(fh)
commands = [
2019-03-21 16:28:20 +03:00
'set theFile to (open for access POSIX file "'
+ filepath
+ '" with write permission)',
"try",
" write (the clipboard as JPEG picture) to theFile",
"end try",
2019-03-21 16:28:20 +03:00
"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
2019-09-19 19:57:59 +03:00
elif sys.platform == "win32":
data = Image.core.grabclipboard_win32()
if isinstance(data, bytes):
from . import BmpImagePlugin
import io
2019-03-21 16:28:20 +03:00
return BmpImagePlugin.DibImageFile(io.BytesIO(data))
return data