为手机截图套上一个设备外壳的「壳子」,美名其曰「带壳截图」,的确能让平平淡淡的截图增色不少。移动设备上的套壳截图工具曾经风靡一时,也有人用 Workflow 实现了轻量、免费的套壳截图自动化动作。
Mac 上缺少专门的工具,我在使用 Sketch 制作了几次 Mac 版套壳截图之后,深感手动调整图片位置、导入导出之繁琐,于是研究一番,做了一个自动化动作,它能利用全屏截图制作出一张套壳截图:
我做了 12 英寸 MacBook 和 13 英寸 MacBook Pro 两个版本,请先在下面下载一个符合你设备尺寸的动作;如果你使用的是其他尺寸的设备,也可以先下载下来,看着文章微调一下代码,就能做出适合你自己的套壳截图动作。
Automator 版和 LaunchBar 版的原理、使用方法略有区别,请读者们选择自己所下载版本对应的小节阅读。
注:下载 LaunchBar 版本后,请把文件名换为英文或拼音,LaunchBar 才能显示它们。
如果你的电脑上还没有安装 homebrew,请通过 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 代码来安装它。
了解 imagemagick 命令
套壳截图的原理非常简单,只是把一张图叠加在另一张图上,Photoshop 这样的重量级工具固然可以完成,但是我希望有一个更轻快的解决方法。imagemagick 是一把图片处理的瑞士军刀,我很快找到了能实现「图片叠加」功能的命令: composite -geometry +m+n 图片A 图片B 图片C
这条命令的意思就是把图片 A 叠在图片 B 上,并生成一份新图片 C。其中的 +m+n 则表示一个以图片 B 左上角为原点的坐标系,指定了叠加图片的具体位置。
由于 Mac 全屏截图尺寸是固定,我们就可以事先准备一张电脑的正面照作为背景图,让截图处于大致正中的方位,输出一张套壳截图(参数依据 12 英寸 MacBook 而定):
composite -geometry +466+140 截图 背景 新图片
注:直接生成的图片体积会较大,建议进行压缩,可以参考我 这篇文章。 Automator 版动作
显然,每次都打开 Terminal 绝不是个好办法,所以我把这个命令封装了起来,将其中的 图片A 空出来,每次运行的时候才会填入「壳」里的图片。
我们新建一个 Automator App,它只用到两个步骤:
拷贝至剪贴板:获取截屏路径
运行 Shell 脚本:实现套壳
关键的是第二步,我们要解决两个问题:
能接收上一步传来的路径
能实现批量套壳
其实用一个模板就能一石二鸟:
OLDIFS="$IFS"
IFS=$'\n'
while read f; do
这里是具体命令
done
再把 imagemagik 命令放进去,完整代码就是这样的:
OLDIFS="$IFS"
IFS=$'\n'
while read f; do
PATH=$PATH:/usr/local/bin/;composite -geometry +466+140 $f /Users/apple/Desktop/MacBook.jpg /Users/apple/Desktop/mockup.png
done
其中 PATH=$PATH:/usr/local/bin/ 的作用是指定环境变量,由于 imagemagick 是第三方命令,需要手动指定一下,不然无法运行;另外,$f 的作用就是获取「拷贝至剪贴板」这一步传过来的路径。不过这个 Automator 动作有个不便的地方,就是要将外壳图片保存到一个不常改动的地方(图在 这里),并将其路径填入「运行 Shell 命令」的步骤中,替换 /Users/apple/Desktop/MacBook.jpg 这一段。 你也可以自己定义别的外壳图片,但可能需要修改代码,请参考「了解 imagemagick 命令」一节。默认地,这个动作会在桌面生成名为 mokeup 的 png 图片,如需自定义文件名和路径,请修改路径 /Users/apple/Desktop/mockup.png。
设置好后,把图片拖到「套壳截图.app」上,就能实现自动套壳了。
LaunchBar 版动作
比起 Automator,我更喜欢用 LaunchBar,不过毕竟不是人人都有这个工具,我就把 LaunchBar 版本的介绍放在 Automator 后面了。虽说你不是一定要用 LaunchBar 来封装这条命令,但它是最方便的选择之一1 。
我们呼出 LaunchBar 的界面,按下 ⌥Option-⌘Command-E 打开编辑动作的界面,新建一个动作,勾选「Scripts」中的 Run in background 和 Accept path arguments 两个选项,这个动作就能在后台规规矩矩地处理 Finder 里的图片。
之后填入下面的代码:
#!/usr/bin/env python
#
# LaunchBar Action Script
#
import sys
import subprocess as sp
import os
import json
import shutil
my_env = os.environ.copy()
my_env["PATH"] = "/usr/local/bin:" + my_env["PATH"]
# Note: The first argument is the script's path
low_image = "MacBook.jpg"
for arg in sys.argv[1:]:
fileFolder = os.path.dirname(arg)
fileName = os.path.basename(arg)
newFile = fileFolder + "/new-" + fileName
my_command = ["composite", "-geometry", "+466+140", arg, low_image, newFile]
sp.check_output(my_command, env=my_env)
os.system('sh noti.sh')
由于终端命令不能直接处理文件名带空格的文件,偏偏不巧所有截图的名称里都有空格,于是我使用 Python 来调用命令行,算是曲线救国,其中的细节如果你非常感兴趣,可以查阅 Python subprocess 模块的文档 。各种语言的具体差别不是本文想讨论的,就此打住。 对了,聪明的你可能留意到最后一行「不知何用」的 os.system('sh noti.sh'),其实这一行的作用是发出一条通知,告诉你图片处理完成了。其他动作里也会有类似的代码。
这个现成的动作只能满足 MacBook 的套壳截图,不能覆盖到 MacBook Air、MacBook Pro 和桌面设备,因为它们截图的尺寸不同,机器外壳差距也比较大。如果你在使用其他型号的设备,可以自己大致测量一下距离,再把 .lbaction 文件里的背景图换成你所用设备的(注意文件名和代码里的背景文件名需一致)。图片可前往 苹果官网 对于硬件的页面自行查找。 小结
我以前用 Sketch 做套壳截图时,不断重复导入图片、拖动对齐、导出图片这个过程,我意识到这样机械重复的工作是可以交给计算机的。在多方查找资料后,我摸索着做出了现在的动作。
用这些自动化动作处理图片的优点在于不需要打开专门的图片处理工具,仅仅一条命令,就完了图片的套壳工作。自动化工具、命令行工具的魅力在于,你写第一次的时候可能有些痛苦,但一旦完成了这个动作,以后你就会节省下大量的时间。