跳至内容

如何用 Mac 内置工具自动截图

用 screencapture、Automator 或快捷指令在 Mac 上自动截图,包括权限设置、安全的循环方式和故障排查。

8 分钟阅读指南作者:Temposhot Team

Auto Capture turning 6 pages of a book in Preview with Page Down after each screenshot

macOS 内置三种按计划截图的方式:screencapture 命令、Automator 和快捷指令 App。三者都可以在不安装额外软件的情况下截图、等待并重复。本指南帮助你选定一种方式,用三帧测试验证其可用性,并解决较长运行中出现的问题。

全文的示例是一份 120 张幻灯片的演示文稿,需要把每张幻灯片保存为一张图片。该任务需要固定的截取来源、每帧之间按一次键、等待每张幻灯片渲染完成,以及在最后一张之后干净地停止。

选择适合任务的内置方法

方法适用场景弱点
终端中的 screencapture固定区域、精确的文件名、经常运行的脚本需要一定的 shell 知识
Automator保存为双击应用的可视化工作流原生截图操作可能覆盖文件名
快捷指令菜单栏和键盘启动器、较新 macOS 上的自动化窗口和区域截图需要脚本步骤

三种方式使用相同的截图引擎和相同的权限模型。选择你已经熟悉的一种。如果都不熟悉,就从终端开始,因为测试只需两行命令。

各方式的构成

Automator 和快捷指令通常都通过 shell 操作调用同一条 screencapture 命令。区别在于外层包装:终端使用脚本文件,Automator 保存为工作流或双击应用,快捷指令则增加了菜单栏、键盘快捷键和定时自动化等启动方式。

因此截图命令只需编写一次。先在终端中测试,如需启动器,再把同一行命令粘贴到 Automator 或快捷指令的 Run Shell Script 操作中。

按内容的变化方式决定

决定方法的因素少于每一帧的触发方式。内容自行变化时,例如仪表盘、构建日志或渲染进度条,只需要定时器。内容随按键变化时,例如幻灯片或阅读器,需要定时器加按键。

内容随用户逐步点击任务而变化则属于另一类工作。定时器会在两次点击之间截取大量相同的帧,并错过每次点击的瞬间。这种情况下,可使用点击驱动的工具,例如 Temposhot 的 Action Capture,每次有效点击保存一帧,而不是每个间隔保存一帧。

自动化相关的参数

screencapture 的选项比多数人用到的要多。以下参数覆盖了单台 Mac 上几乎所有的自动化任务。

screencapture 参数设置面板:-x 静音,-m 主显示器,-D 显示器编号,-R 固定区域,-t 文件类型,-l 窗口 ID,-T 拍摄前延迟秒数,-C 包含鼠标指针。

完整参数列表因 macOS 版本而异,请在终端中运行 man screencapture 查看。对于幻灯片,-R 指定固定区域最有用,因为它会排除菜单栏、Dock 和通知横幅。

开始前:允许屏幕录制并测试三帧

macOS 要求任何截取其他应用窗口的应用都获得屏幕录制权限。运行截图的应用需要该权限:shell 循环需要终端,工作流需要 Automator(保存的应用需单独授权),快捷指令需要快捷指令 App。

打开 System Settings,进入 Privacy and Security,在屏幕录制列表中打开对应应用。该标签因 macOS 版本而异。更改后退出并重新打开该应用。

在任何长时间运行之前先测试三帧。三帧可以确认权限、文件名和时序是否正常,测试约需十秒。若 500 帧的运行只保存了壁纸,浪费的时间要多得多。

各方式需要的权限

权限属于执行命令的进程,而不属于脚本文件。从 iTerm 启动的循环需要 iTerm 在列表中,保存为应用的工作流需要该应用在列表中,即使 Automator 本身已获得允许也是如此。

对比表,列为屏幕录制和辅助功能,行为终端循环(仅截图)、终端循环加按键、Automator 工作流、保存的 Automator 应用、快捷指令,以及通过 osascript 发送按键。

开关已打开但帧中仍为壁纸

macOS 有时会将应用列为已允许,但截图仍只返回桌面图片。关闭开关后再打开,然后退出并重新打开应用。如果脚本从编辑器内置的终端运行,则需要授权的是该编辑器,而不是终端。

长时间运行前准备 Mac

运行到第 80 帧时失败的 120 帧任务比不运行更糟,因为空缺很容易被忽略。开始前的简短检查清单可以排除常见原因。

包含七项的清单:三帧测试已通过,勿扰模式已开启以免横幅出现在帧中,运行期间 caffeinate -di 保持运行,目标应用位于最前并已调整为最终窗口尺寸,磁盘剩余空间已检查,本次运行的输出文件夹为空,隐私窗口和聊天应用已关闭。

在终端中运行 screencapture 三帧测试

mkdir -p ~/Captures/test
for i in 1 2 3; do
  screencapture -x -m ~/Captures/test/frame-$i.png
  sleep 3
done
open ~/Captures/test

检查文件夹中的三件事:应有 3 个文件,每个文件都显示你打开的窗口,文件名按截取顺序排列。-x 参数关闭快门声,-m 将截取限定为主显示器。命令行指南 介绍了固定区域、JPG 输出和长时间运行。

时间线:0:00 保存第 1 帧,0:03 保存第 2 帧,0:06 保存第 3 帧,0:09 循环结束,访达打开测试文件夹以供检查,0:10 检查 3 个文件的数量、内容和顺序。

为文件编号以正确排序

frame-$i.png 对 3 帧有效,但超过 9 帧后排序会出错:在普通文本排序中,访达和多数工具会把 frame-10 排在 frame-2 之前。补零编号可解决此问题。printf '%03d' 将 7 转换为 007,从而确保 120 帧在任何地方都保持正确顺序。

name=$(printf 'frame-%03d.png' $i)
screencapture -x -R 0,25,1440,875 ~/Captures/deck/$name

按实际任务调整测试规模

以 120 张幻灯片的示例为例,循环运行 120 次,每次等待 2 秒。这需要约 4 分钟的截取时间,外加几秒的准备时间。在 1440 × 875 的区域下,包含文字和简单图形的 PNG 幻灯片通常每张不到 1 MB,因此整个运行的输出约为 50 至 120 MB。

示例的四项统计:120 帧,每次按键后等待 2 秒,总运行时间约 4 分钟,估计输出 50 至 120 MB 的 PNG 文件。
估算值。文件大小取决于幻灯片内容和区域尺寸。

使用 Automator 制作可视化工作流

在 Automator 中新建 Workflow。添加 Take Screenshot,再添加设为 3 秒的 Pause,然后添加设为自动循环并在 3 次后停止的 Loop。运行后检查文件夹。

如果只出现一个文件,说明每次执行都写入了相同的文件名。将 Take Screenshot 替换为 Run Shell Script,并使用终端测试中带编号文件名的 screencapture 命令。将完成的工作流保存为 Application,即可双击运行。完整的 shell 操作参见 Automator 指南。

在 Automator 中保存计数器

Loop 操作不会把计数器传递给下一次执行。最简单的做法是让 shell 根据文件夹中已有的文件计算下一个编号,这样每次执行都会生成新的文件名。

dir=~/Captures/deck
mkdir -p "$dir"
n=$(ls "$dir" | wc -l | tr -d ' ')
screencapture -x -m "$dir/$(printf 'frame-%03d.png' $((n + 1)))"

这要求开始时文件夹为空。早前运行留下的文件会改变所有编号,因此需要清空文件夹,或为每次运行使用新文件夹。

保存为应用并授予访问权限

保存为 Application 的工作流在 macOS 看来是一个独立程序。它第一次截图时,macOS 会要求授予该应用屏幕录制权限,即使测试时 Automator 已获得允许也是如此。

授予一次权限,然后退出并重新打开保存的应用。如果应用被移动或以新名称重新保存,macOS 可能将其视为新应用并再次询问,因此应将最终应用放在固定位置,例如“应用程序”文件夹。

使用快捷指令制作启动器和触发器

新建快捷指令,将 Repeat 设为 3。在 Repeat 块内添加 Take Screenshot、在文件名中使用 Repeat Index 变量的 Save File,以及设为 3 秒的 Wait。运行后检查文件夹。

之后,快捷指令可以从菜单栏、键盘快捷键或终端中的 shortcuts run 启动。在 macOS Tahoe 26 及更高版本上,个人自动化可以在设定时间启动它。快捷指令指南 介绍了触发器和脚本权限。

从终端启动快捷指令

shortcuts run "Deck Capture" 按名称运行快捷指令。与 caffeinate 结合使用时,Mac 只在快捷指令运行期间保持唤醒,这比为整天更改节能设置更安全。

caffeinate -di shortcuts run "Deck Capture"

Repeat Index 从 1 开始,且不补零。超过 9 帧后,可在 Text 操作中补零,或按创建日期而非名称对文件排序。

定时启动及其限制

在设定时间启动的个人自动化适用于无人值守时的截图,例如每天早上 9:00 的仪表盘。到达该时间时 Mac 必须处于唤醒且已解锁状态,因为锁屏时不会显示仪表盘。

每个定时快捷指令都应简短且独立。截取 3 帧后即停止的快捷指令,第二天早上很容易检查;循环运行 2 小时的快捷指令则难以验证,也容易忘记关闭。

仅在截图正常后添加翻页

翻页浏览幻灯片或文档时,每帧之间需要按一次键。请在三帧测试通过后再添加,使截图问题与按键问题不会同时出现。

三种方式都通过 System Events 发送按键,方法相同:

osascript -e 'tell application "System Events" to key code 124'

Key code 124 为右方向键。顺序很重要:先截图,再按键,然后等待足够长的时间,使下一页完成渲染。最后一帧之后不要按键,以免文档翻过最后一页。发送按键的应用需要辅助功能权限,且目标应用必须位于最前。

由四个方框和箭头组成的流程:保存帧,判断是否为最后一帧,若否则以 key code 124 发送右方向键,等待 2 秒让幻灯片渲染。

其他翻页操作的键码

key code 接收的是硬件键码,而不是字符。右方向键为 124,左方向键 123,下方向键 125,上方向键 126,空格 49,回车 36。若阅读器按屏滚动而非翻页,通常需要空格键(大约滚动一屏),而下方向键只滚动几行。

输入字符时改用 keystroke,例如对于用 N 键翻页的应用使用 keystroke "n"。在长时间运行前,先用三帧运行测试所有新按键。

完整的 120 张幻灯片脚本

以下脚本综合了前面的要素:补零文件名、固定区域、除最后一次外每次都按键,以及 2 秒等待。将其保存为 deck.zsh,并使用 caffeinate -di zsh deck.zsh 运行。

#!/bin/zsh
out=~/Captures/deck-$(date +%Y-%m-%d)
mkdir -p "$out"
total=120
sleep 5   # time to click into the presentation window
for i in $(seq 1 $total); do
  screencapture -x -R 0,25,1440,875 "$out/$(printf 'slide-%03d.png' $i)"
  if (( i < total )); then
    osascript -e 'tell application "System Events" to key code 124'
  fi
  sleep 2
done
open "$out"

循环前的 5 秒 sleep 起到倒计时的作用。在此期间点击演示文稿窗口,使按键发送到演示文稿,而不是终端。

文件树:Captures 文件夹中包含一个带日期的 deck 文件夹,其中是补零编号的 slide-001.png 至 slide-120.png 文件,另有一个包含三帧的独立 test 文件夹。

按键时序规则

do 与 dont 行:先截图再按键;按键后等待;最后一次不按键;在起始的 sleep 期间点击目标窗口;不要在第一次截图前按键,否则会丢失第 1 张;不要对有切换效果的幻灯片使用 0 秒等待;不要让终端位于最前,否则它会接收按键。

幻灯片切换效果是帧模糊的常见原因。1 秒的淡入淡出需要至少 1.5 秒的等待,而在演示应用中关闭切换效果是更可靠的解决方法。

修复常见的截图自动化问题

  • 只有壁纸。 正在运行的应用缺少屏幕录制权限。授予权限后重新打开应用。
  • 只有一个文件而非多个。 每次执行都写入相同的文件名。在文件名中添加计数器。
  • 运行后期出现黑帧。 显示器已休眠。在运行期间于终端中执行 caffeinate -di。
  • 页面被跳过。 按键在页面渲染完成前触发。延长按键后的等待时间。
  • 末尾多出一页。 按键在最后一次截图之后触发。在最后一次执行时跳过按键。
  • 第二台显示器缺失。 使用 -D 1 和 -D 2 分别截取每台显示器。

快速找到出错的帧

长时间运行出错时,先找到第一张错误的帧,再进行任何更改。在访达中打开文件夹,切换到图标视图,然后滚动直到某个缩略图看起来不同。帧号可以说明问题是从一开始就存在(权限或区域),是在固定时间出现(休眠或通知),还是随机出现(渲染时序)。

并排的重复帧表示按键未到达应用。两帧只相差一页,则说明按键已到达,但等待时间过短。当变化太小、肉眼难以辨别时,Compare Images 可以显示两帧之间的像素差异。

帧中的通知与覆盖层

全屏截图会记录屏幕上的所有内容,包括通知横幅、音量指示器以及弹出的聊天应用。勿扰模式可消除大部分横幅。使用 -R 指定固定区域并排除右上角,可去除其余横幅,因为横幅通常出现在那里。

Retina 显示器上的区域尺寸

-R 的数值以屏幕点为单位,而非像素。在 Retina 显示器上,1440 × 875 的区域会保存为 2880 × 1750 像素的图像。这样文字和 OCR 更清晰,但宽高都会翻倍,因此文件约为非 Retina 显示器上的四倍大。在规划存储空间之前,使用 Screenshot Resolution Checker 检查实际像素尺寸。

停止失控的循环

计数错误的循环可能运行的时间远超计划。在终端窗口中按 Control+C 可停止循环,已保存的帧会保留在文件夹中。对于快捷指令,选择菜单栏图标中的停止按钮。

内置工具何时不再是更简单的选择

内置工具能很好地处理固定数量、固定节奏的任务。每增加一项需求都要增加一个脚本:按名称截取单个窗口、在某个时钟时间停止、运行中途暂停和恢复,或生成可搜索 PDF或视频。

专用应用会把这些功能整合到设置中。在 Temposhot 的 Auto Capture 中,你可以从 Screens、Windows 或 Custom Area 中选择来源,然后设置停止条件(Screenshots、Duration 或 End time)、以毫秒、秒、分钟或小时为单位的间隔、可选的 Key press,以及 Countdown。悬浮工具栏可暂停、恢复和结束运行,结果可导出为 PNG、JPG、ZIP、可搜索 PDF 或 MP4。Kindle 等预设(20 张截图、500 毫秒、右方向键、3 秒倒计时)可保存配置以便重复使用。

Auto Capture turning 6 pages of a book in Preview with Page Down after each screenshot

120 张幻灯片任务在 Auto Capture 中的设置

同一任务可以映射为五项设置。窗口来源取代 -R 区域,Temposhot 会在倒计时结束后将窗口置于最前,因此无需点击。

设置面板:停止条件为 Screenshots,截图数 120,间隔 2 秒,按键为右方向键(Pro 功能),倒计时 5 秒,来源为 Windows 并选中演示文稿窗口。

按键自动化需要 Temposhot Pro 和辅助功能权限。若不使用 Pro,对于自行变化的内容(例如仪表盘或进度条),定时运行仍然可用,只是不带按键。

脚本与应用对比

对比表,列为内置循环和 Auto Capture,行为截取单个窗口、在时钟时间停止、运行中途暂停、显示器变化和输出格式。

以小时计的运行

内置循环在长时间定时运行中表现最弱,例如一次工作会话的延时摄影。脚本必须计算结束时间,在休眠后仍能继续运行,并处理显示器变化。在 Auto Capture 中,Duration 和 End time 停止条件可以覆盖这些需求,两者都是 Pro 功能。

内置的 Timelapse 预设是一个例子:1 小时 Duration、3 秒间隔、无按键、5 秒倒计时,约生成 1200 帧。以默认的每秒 15 帧导出为 MP4 后,这些帧约播放 80 秒。若 Mac 锁定或休眠,Auto Capture 会暂停其数据流,并在解锁后恢复;暂停的 Duration 运行不计入暂停的时间。

悬浮工具栏和 Capture 菜单也可在其他应用位于前台时提供键盘控制。

快捷键列表:Control C 停止终端循环,Command 1 打开 Auto Capture,Shift Command R 启动 Auto Capture,Command 句点结束截图,Command N 开始新会话。

常见问题

哪种内置方法设置最快?

终端循环。它只需一项权限和五行代码,同样的代码之后可直接用于 Automator 或快捷指令。

需要让 Mac 保持唤醒吗?

需要。显示器休眠会产生黑帧,锁屏会中断截图。caffeinate -di 可在命令运行期间保持显示器和系统唤醒。

内置工具能截取单个窗口吗?

screencapture -l 可按 ID 截取窗口,但 macOS 没有列出窗口 ID 的内置命令。需要辅助脚本或专用应用。

截图自动化究竟是什么?

指工具按照规则(间隔、点击或 URL 列表)截图,而不是由人每次按快捷键。截图自动化术语条目 提供了更完整的定义。

如何把编号的 PNG 文件合并为一个 PDF?

按顺序使用 Image to PDF 合并。如果 PDF 必须可搜索,再使用 Screenshot to Searchable PDF 添加文字层。补零的文件名可确保添加文件时顺序正确。

为什么帧来自错误的显示器?

-m 始终截取主显示器,即带有菜单栏的那一台。将目标窗口移到该显示器,或使用 -D 加显示器编号截取其他显示器。

将可重复的截图转化为成品

当内置循环需要窗口来源、翻页以及 PDF 或 MP4 导出时,参见 Mac 上的截图自动化,或按照 自动截取指南 操作。

screenshot-automationmacosscreencaptureshortcutsautomator

本文使用的术语: screenshot timer, screenshot workflow, window capture

把重复性截图整理为成品

Temposhot 可按定时或每次点击进行截图,并将结果导出为 PDF、图片、ZIP 或 MP4。

相关文章