前言
sips 全称 scriptable image processing system,是 macOS 自带的命令行图片处理工具,无需安装任何第三方软件就能完成绝大部分日常图片处理需求:查看尺寸、调整大小、裁剪、旋转、格式转换、批量处理等等。
对于只想快速完成一两张图片的简单处理的场景来说,sips 是最好不过的选择。
查看支持的图片格式可以用 sips --formats,支持的格式非常丰富,jpg、png、heic、webp、avif、tiff、psd 等常见格式都没问题。
查看图片信息
-g 选项可以查询图片的单个属性,加上 -g all 或者多次使用 -g 可以查询多个属性。
最常用的就是查看图片的宽和高:
1 | sips -g pixelWidth -g pixelHeight image.png |
执行后会输出:
1 | /Users/mine/image.png |
加上 --getProperty all 或者 -g all 可以一次性查看所有属性:
1 | sips -g all image.png |
执行后会输出类似下面这种信息,包含了图片格式、色彩空间、采样率、DPI 等详细信息:
1 | /Users/mine/image.png |
支持同时查看多个图片的属性,在参数中同时放上所有的图片即可。
1 | sips -g all temp1.heic temp2.heic |
调整图片尺寸
缩放到指定尺寸
-z 选项可以将图片缩放到指定的宽高(注意是高度在前、宽度在后):
1 | sips -z 1080 1920 image.png --out image-1920x1080.png |
⚠️ -z 是等比例拉伸到目标尺寸,如果原图比例和目标尺寸不一致,会导致图片变形。如果想保持原图比例缩放,可以使用 -Z。
按比例缩放(保持宽高比)
-Z 选项指定最长边的最大像素值,会等比例缩放图片:
1 | sips -Z 1080 image.png --out image-resized.png |
比如原图是 4000x3000,执行后图片尺寸会变成 1440x1080,最长边被限制为 1080。
-Z 是日常使用频率最高的缩放命令,比如需要批量压缩一批图片或者调整图片分辨率时特别好用。
只调整宽度或高度
只调整宽度(高度按比例自动计算):
1 | sips --resampleWidth 800 image.png --out image-800.png |
只调整高度(宽度按比例自动计算):
1 | sips --resampleHeight 600 image.png --out image-600.png |
旋转和翻转
旋转
-r 选项按顺时针旋转指定角度:
1 | sips -r 90 image.png --out image-rotated.png |
这里的 90 表示顺时针旋转 90 度,180、270 同理,也可以使用 90c 这种带 c 后缀的写法(c 代表 clockwise 顺时针)。
翻转
-f 选项用于翻转图片:
1 | # 水平翻转 |
裁剪和填充
居中裁剪
-c 选项按指定宽高居中裁剪图片:
1 | sips -c 1080 1080 image.png --out image-cropped.png |
执行后图片会被居中裁剪成 1080x1080 的尺寸,多余部分会被裁掉。
如果原图小于指定尺寸,sips 会自动在四周填充黑色像素。
自定义裁剪偏移
如果不想居中裁剪,可以配合 --cropOffset 选项指定偏移量:
1 | sips -c 1080 1080 --cropOffset 0 0 image.png --out image-top-left.png |
偏移量的两个值分别表示垂直方向和水平方向的偏移,单位是像素,偏移后会从偏移位置开始取指定大小的区域。
填充
-p 选项用于在图片四周添加指定颜色的填充:
1 | sips -p 1080 1920 image.png --out image-padded.png |
默认填充颜色是黑色,可以通过 --padColor 指定填充颜色:
1 | sips -p 1080 1920 --padColor FFFFFF image.png --out image-padded.png |
颜色值是十六进制 RGB,不需要带 # 号。
格式转换
最常见的需求大概就是格式转换了,sips 支持的格式非常丰富,转换格式非常简单,只需要在输出时指定文件后缀即可:
1 | # PNG 转 JPEG |
⚠️ 有些格式虽然支持读取但不支持写入,比如 webp,执行转换时可能会报错。通过 sips --formats 可以看到哪些格式后面标注了 Writable。
修改图片属性
设置压缩质量
对于 JPEG 图片,可以通过 formatOptions 设置压缩质量:
1 | sips -s formatOptions 80 image.jpg --out image-compressed.jpg |
可选值有 low、normal、high、best,或者直接指定一个百分数值(数字越小压缩越狠,图片越小)。
设置 DPI
dpiWidth 和 dpiHeight 用于设置图片的 DPI:
1 | sips -s dpiWidth 300 -s dpiHeight 300 image.png --out image-300dpi.png |
修改 EXIF 信息
可以修改 EXIF 中的一些字段,比如修改作者:
1 | sips -s artist "mine" image.jpg --out image-author.jpg |
其他可以修改的字段包括 make、model、description、copyright 等。
批量处理
单独执行一次 sips 命令只能处理一张图片,但 sips 本身就支持多文件参数,配合 shell 的通配符就能轻松实现批量处理。
批量缩放
将当前目录下所有 jpg 图片等比例缩放到最长边 1080:
1 | sips -Z 1080 *.jpg |
⚠️ 注意没有加 --out 选项时,sips 会直接覆盖原文件!批量处理前最好先备份一份原图。
更稳妥的写法是输出到指定目录:
1 | mkdir -p resized |
批量格式转换
将当前目录下所有 png 转成 jpg:
1 | mkdir -p jpg |
sips 会自动根据输出目录中的文件后缀选择目标格式,但更稳妥的做法是显式指定格式:
1 | sips -s format jpeg *.png --out jpg/ |
循环处理(更灵活)
当文件名命名规则比较复杂,或者需要对每个文件做不同处理时,可以用 shell 的 for 循环:
1 | for file in *.heic; do |
这里的 ${file%.heic} 会去掉文件名后面的 .heic 后缀,从而得到不含扩展名的部分。
批量旋转
将当前目录下所有图片顺时针旋转 90 度:
1 | mkdir -p rotated |
实用场景示例
截屏图片压缩
需要把截图上传到一些对图片大小有限制的平台,可以批量压缩:
1 | mkdir -p compressed |
去除图片中的 EXIF 信息
分享图片之前去去除 EXIF 隐私信息:
1 | sips -d allxml image.jpg --out image-clean.jpg |
一键生成 App Icon
sips 甚至可以用来生成 App Icon:
1 | sips -i icon.png |
执行后会在当前目录生成一个 Icon\r 文件,可以作为 macOS 应用的图标文件使用。
总结
sips 是 macOS 上一个非常方便的命令行图片处理工具,常用功能基本全覆盖。浏览器一直收藏着几个免费的图片处理网站,愣是没发现手边就已经有一个现成的本地工具。