如何在Mac OS X中通过Python内部进行屏幕截图:也称为Command-Control-Shift-4

4
使用Command-Control-Shift-4可以截取屏幕区域并保存到剪贴板中。我想知道是否能够在Python内部完成同样的操作。理想情况下,可以指定图像文件格式,并在Python程序中以编程方式将其保存到指定位置。你有什么想法吗?
编辑后1:我找到了一个几乎满足需求的AppleScript,但是该脚本捕获整个屏幕。我希望将其限制在某个区域内。
tell application "System Events"
    keystroke (ASCII character 36) using {command down}
    delay 1
    keystroke space
end tell

稍后编辑2

下面的苹果脚本可以很好地进行区域屏幕截图(仍然无法控制捕获的图像保存的确切位置(默认情况下保存在用户的桌面上)。

tell application "System Events"
    keystroke (ASCII character 36) using {command down}
    key code 4 using {command down, shift down}
end tell

问题是如何自定义输出文件的路径位置...

1
从PIL库中导入ImageGrab模块 im = ImageGrab.grab() im.save('screenshot.png') 这将会获取屏幕截图。 - 1478963
我想避免使用PIL。感谢您的建议! - alphanumeric
import os os.system("screencapture screen.png") 转而使用什么? - 1478963
太棒了!有没有关于如何捕获屏幕区域的想法? - alphanumeric
7个回答

9

在Mac上似乎有一个名为screencapture的标准实用程序,您可以使用subprocess来调用它,方法如下:

from subprocess import call
call(["screencapture", "screenshot.jpg"])

有一些选项可以用于 screencapture 命令,以指定特定的矩形区域:

$ screencapture -h
. . . 
  -R<x,y,w,h> capture screen rect

谢谢!看起来我最终得到了相同的解决方案。但是你的更短。我会使用它。再次感谢!限制screencapture到区域的标志是:-i - alphanumeric
1
我收到了以下警告信息:libpng 警告: 零长度关键字 libpng 警告: iTXt 块中的语言字段为空... - alphanumeric
我认为您不需要使用AppleScript,只需使用内置的Shell即可。如果您在终端中运行命令,是否会看到相同的libpng警告?这个页面 - https://discussions.apple.com/message/20691159#20691159 - 似乎表明这些错误是无害的(尽管很烦人)。 - OldGeeksGuide
谢谢OldGeeks,我刚刚用-i标志发布了一行代码。它运行得非常好。感谢你的帮助! - alphanumeric

1
Mac用户如果在使用屏幕截图时遇到困难,比如只能截取桌面壁纸,原因是您需要为使用屏幕截图命令的相关软件(例如Terminal、PyCharm CE等)授予权限。此操作可在“系统偏好设置”>“安全性与隐私”>“隐私”>“屏幕录制”中完成。请注意保留HTML标签。

0

/Users/MYNAME/ 应该存在,例如才能工作:

import subprocess

def runAppleScript(appleScript=None):   
    AppleProcess=subprocess.Popen(['osascript', '-'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
    AppleProcess.communicate(appleScript)[0]

appleScript="""on run
    set shellCommand to "/usr/sbin/screencapture -i \\"" & "/Users/MYNAME/Pictures/Screenshot.png\\""
    do shell script shellCommand
end run"""

runAppleScript(appleScript)

你正在使用 Popen 启动一个进程来运行 AppleScript 以启动另一个进程。为什么不直接从 Python 启动 screencapture 进程,而不需要使用 AppleScript 呢? - icktoofay
from subprocess import call; call(["screencapture", "-i", "/Users/user/Documents/screenshot.jpg"]) - alphanumeric
谢谢大家的帮助!我使用了下面这行代码。libpng warning 出现是无害的,不会引起任何不适。非常干净、利落,解决了问题。我很喜欢。再次感谢! - alphanumeric

0

对我来说,只需导入from selenium import webdriver即可正常工作:

self.now = datetime.now().strftime('%Y-%m-%d_%H-%M-%S')
self.driver.save_screenshot('login-%s.png' % self.now)

该脚本会在执行时所在的同一目录下创建带有时间戳的文件。


0

我发现这些命令在我的Mac OS X上适用

from subprocess import call

call(["screencapture", "screenshot.jpg"])   # Captures full screen
call(["screencapture", "-R 100,100,500,500", "screenshot.jpg"]) # Captures area of screen

第一次调用捕获整个屏幕。 第二次调用捕获屏幕的一部分。 此screenshot.jpg文件将自动保存在运行Python代码的目录中。

-1

screencapture -h 对我来说完美无缺。

$ screencapture -h . . . -R<x,y,w,h> capture screen rect

$ screencapture -R100,100,500,500 asdf.png

这行代码将保存一个宽度为400像素,文件名为asdf的部分屏幕截图到我运行命令的目录中。

感谢oldgeeksguide。


-1

虽然这个链接可以回答问题,但最好在这里包含答案的基本部分并提供链接用于参考。只有链接的答案可能会因为链接的页面改变而变得无效。 - Daniel Mann
@Daniel:即使所有链接都失效了,这仍然是一个有用的答案;它指导读者使用适当的本地API,并提供了一种从Python访问该本地API的名称。链接使得访问它们的文档更加方便,但并不是必需的。 - icktoofay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接