为什么需要它
前端项目里,图片体积往往是页面性能的大头。一张高清截图动辄几 MB,一张 iPhone 拍的 HEIC 照片还要额外转格式,想批量压缩、批量加水印,要么打开一堆在线工具逐个上传,要么写一堆零散的脚本。
cantarella 就是来解决这些事的:一个批量压缩 + 批量加水印的命令行工具,一条命令搞定一整个目录的图片。
它是什么
cantarella 是一个基于 Node.js 的命令行工具,提供两个核心子命令:
- compress —— 批量压缩图片,同时支持格式转换
- watermark —— 批量给图片加水印(图片 logo 或文字)
它最大的设计理念是两个字:安全。压缩或加水印前会自动把原图备份,压不动(压缩后反而更大)的文件会自动跳过,绝不产出更差的图。
安装
要求 Node.js >= 22.12.0,然后一行命令搞定:
npm install -g cantarella
想从源码跑开发版也可以:
git clone https://github.com/zzl110712/cantarella.git
cd cantarella
pnpm install
pnpm build # 编译并压缩 TS 到 dist/
pnpm link # 注册全局命令 cantarella
快速上手
压缩一个目录
cantarella compress ./images
如果不想一步步回答问题,直接用默认参数:
cantarella compress ./images -y
它有两种使用方式:
- 交互式问答模式:不带参数时,会像向导一样问你压缩质量、输出格式等
- 纯 CLI 模式:全部用命令行参数指定,可以直接写进 CI 脚本或 npm script 里
批量加水印
# 加文字水印
cantarella watermark ./images -t "© 我的博客"
# 加图片 logo 水印
cantarella watermark ./images -m ./logo.png
水印支持九宫格定位(左上、右上、中间、左下……),可以调节不透明度和大小比例,还支持平铺铺满(防盗图神器)和斜向平铺。
那些让人安心的细节
自动备份
压缩原文件之前,会先把原图保存到备份目录(默认 _backup_,带时间戳)。也就是说,哪怕结果不满意,原图也一直都在:
# 自定义备份目录
cantarella compress ./images --backup-dir ./originals
压不动就跳过
如果某个文件压缩后反而更大(比如本来就优化得很好的 PNG),它会自动跳过,而不是硬着头皮输出一个更烂的文件。
输出到独立目录
如果你连原文件都不想碰,用 --out 把结果写到另一个目录,原图一个字节都不动:
cantarella compress ./images --out ./dist --ext webp
进阶玩法
智能模式
-s 开启智能模式:每张图会按实际编码尝试最小的体积,哪个小留哪个(PNG 输入默认转无损 webp)。所有尝试都没比原图更小的话,就跳过,绝不产出更大的文件。
cantarella compress ./images -s
预览与报告
--dry 只做真实编码计算、告诉你压缩后能有多大,但不写任何文件;--report 会在目录里生成一份 Markdown 压缩报告:
cantarella compress ./images --dry
cantarella compress ./images --report
格式转换
支持 jpeg / png / webp / avif / tiff / gif 之间互相转,还支持 heic(iPhone 照片) 和 svg 作为输入:
# iPhone 的 HEIC 照片批量转 jpg
cantarella compress ./photos --ext jpg
常用选项速查
| 选项 | 说明 |
|---|---|
-y, --yes | 全部使用默认参数,跳过问答 |
-s, --smart | 智能模式,尝试最小体积 |
-o, --out <dir> | 输出到独立目录,不动原图 |
-q, --quality <n> | 压缩质量(默认 80) |
-e, --ext <fmt> | 目标格式(jpeg/webp/avif...) |
-w, --max-width <n> | 限制最大宽度 |
--backup-dir <dir> | 自定义备份目录 |
--dry | 预览,不写文件 |
--report | 生成 Markdown 压缩报告 |
水印子命令的相关选项:
| 选项 | 说明 |
|---|---|
-t, --text | 文字水印内容 |
-m, --mark | 图片 logo 水印路径 |
-p, --position | 九宫格定位 |
--opacity | 不透明度 |
--tile | 平铺铺满 |
-a | 斜向平铺 |
小结
cantarella 把一个高频但又琐碎的需求——图片批量压缩和加水印——做成了一个顺手、安全、可脚本化的 CLI 工具。自动备份、自动跳过压不动的文件、智能模式、预览报告,这些细节让批量处理图片这件事变得很放心。
如果你也经常被图片体积和格式转换折腾,不妨装一个试试:
npm install -g cantarella
项目地址:github.com/zzl110712/c… | npm