mirror of
https://github.com/python-pillow/Pillow.git
synced 2025-07-27 00:19:58 +03:00
Merge 79914ec8a5
into 640f55a655
This commit is contained in:
commit
88a7e6b0a9
|
@ -42,9 +42,9 @@ or the clipboard to a PIL image memory.
|
||||||
.. versionadded:: 7.1.0
|
.. versionadded:: 7.1.0
|
||||||
|
|
||||||
:param window:
|
:param window:
|
||||||
HWND, to capture a single window. Windows only.
|
Capture a single window. On Windows, this is a HWND. On macOS, it uses windowid.
|
||||||
|
|
||||||
.. versionadded:: 11.2.1
|
.. versionadded:: 11.2.1 (Windows), 12.0.0 (macOS)
|
||||||
:return: An image
|
:return: An image
|
||||||
|
|
||||||
.. py:function:: grabclipboard()
|
.. py:function:: grabclipboard()
|
||||||
|
|
|
@ -43,7 +43,9 @@ def grab(
|
||||||
fh, filepath = tempfile.mkstemp(".png")
|
fh, filepath = tempfile.mkstemp(".png")
|
||||||
os.close(fh)
|
os.close(fh)
|
||||||
args = ["screencapture"]
|
args = ["screencapture"]
|
||||||
if bbox:
|
if window:
|
||||||
|
args += ["-l", str(window)]
|
||||||
|
elif bbox:
|
||||||
left, top, right, bottom = bbox
|
left, top, right, bottom = bbox
|
||||||
args += ["-R", f"{left},{top},{right-left},{bottom-top}"]
|
args += ["-R", f"{left},{top},{right-left},{bottom-top}"]
|
||||||
subprocess.call(args + ["-x", filepath])
|
subprocess.call(args + ["-x", filepath])
|
||||||
|
@ -51,6 +53,32 @@ def grab(
|
||||||
im.load()
|
im.load()
|
||||||
os.unlink(filepath)
|
os.unlink(filepath)
|
||||||
if bbox:
|
if bbox:
|
||||||
|
if window:
|
||||||
|
# Determine if the window was in retina mode or not
|
||||||
|
# by capturing it without the shadow,
|
||||||
|
# and checking how different the width is
|
||||||
|
fh, filepath = tempfile.mkstemp(".png")
|
||||||
|
os.close(fh)
|
||||||
|
subprocess.call(
|
||||||
|
["screencapture", "-l", str(window), "-o", "-x", filepath]
|
||||||
|
)
|
||||||
|
with Image.open(filepath) as im_no_shadow:
|
||||||
|
retina = im.width - im_no_shadow.width > 100
|
||||||
|
os.unlink(filepath)
|
||||||
|
|
||||||
|
# Since screencapture's -R does not work with -l,
|
||||||
|
# crop the image manually
|
||||||
|
if retina:
|
||||||
|
left, top, right, bottom = bbox
|
||||||
|
im_cropped = im.resize(
|
||||||
|
(right - left, bottom - top),
|
||||||
|
box=tuple(coord * 2 for coord in bbox),
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
im_cropped = im.crop(bbox)
|
||||||
|
im.close()
|
||||||
|
return im_cropped
|
||||||
|
else:
|
||||||
im_resized = im.resize((right - left, bottom - top))
|
im_resized = im.resize((right - left, bottom - top))
|
||||||
im.close()
|
im.close()
|
||||||
return im_resized
|
return im_resized
|
||||||
|
|
Loading…
Reference in New Issue
Block a user