Merge pull request #6361 from radarhere/wayland

Use gnome-screenshot on Linux if available
This commit is contained in:
Hugo van Kemenade 2022-06-21 18:02:31 +03:00 committed by GitHub
commit 557e293ece
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 9 deletions

View File

@ -15,7 +15,10 @@ or the clipboard to a PIL image memory.
returned as an "RGBA" on macOS, or an "RGB" image otherwise. returned as an "RGBA" on macOS, or an "RGB" image otherwise.
If the bounding box is omitted, the entire screen is copied. If the bounding box is omitted, the entire screen is copied.
.. versionadded:: 1.1.3 (Windows), 3.0.0 (macOS), 7.1.0 (Linux (X11)) On Linux, if ``xdisplay`` is ``None`` then ``gnome-screenshot`` will be used if it
is installed. To capture the default X11 display instead, pass ``xdisplay=""``.
.. versionadded:: 1.1.3 (Windows), 3.0.0 (macOS), 7.1.0 (Linux)
:param bbox: What region to copy. Default is the entire screen. :param bbox: What region to copy. Default is the entire screen.
Note that on Windows OS, the top-left point may be negative if ``all_screens=True`` is used. Note that on Windows OS, the top-left point may be negative if ``all_screens=True`` is used.

View File

@ -76,7 +76,9 @@ TODO
Other Changes Other Changes
============= =============
TODO Using gnome-screenshot on Linux
^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TODO In :py:meth:`~PIL.ImageGrab.grab` on Linux, if ``xdisplay`` is ``None`` then
``gnome-screenshot`` will be used to capture the display if it is installed. To capture
the default X11 display instead, pass ``xdisplay=""``.

View File

@ -15,15 +15,14 @@
# See the README file for information on usage and redistribution. # See the README file for information on usage and redistribution.
# #
import os
import shutil
import subprocess
import sys import sys
import tempfile
from . import Image from . import Image
if sys.platform == "darwin":
import os
import subprocess
import tempfile
def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None): def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=None):
if xdisplay is None: if xdisplay is None:
@ -62,6 +61,18 @@ def grab(bbox=None, include_layered_windows=False, all_screens=False, xdisplay=N
left, top, right, bottom = bbox left, top, right, bottom = bbox
im = im.crop((left - x0, top - y0, right - x0, bottom - y0)) im = im.crop((left - x0, top - y0, right - x0, bottom - y0))
return im return im
elif shutil.which("gnome-screenshot"):
fh, filepath = tempfile.mkstemp(".png")
os.close(fh)
subprocess.call(["gnome-screenshot", "-f", filepath])
im = Image.open(filepath)
im.load()
os.unlink(filepath)
if bbox:
im_cropped = im.crop(bbox)
im.close()
return im_cropped
return im
# use xdisplay=None for default display on non-win32/macOS systems # use xdisplay=None for default display on non-win32/macOS systems
if not Image.core.HAVE_XCB: if not Image.core.HAVE_XCB:
raise OSError("Pillow was built without XCB support") raise OSError("Pillow was built without XCB support")