Image Converter
Overview
本技能提供可靠、离线的图片格式转换能力,核心是 scripts/imgconv.py(Pillow 实现)。覆盖 PNG/JPEG/WebP/BMP/GIF/TIFF/ICO 常用格式,重点保障两类易错场景:
- 透明通道:PNG/WebP/ICO/TIFF/GIF 之间互转时透明完整保留(RGBA/LA/P+transparency 均处理)。
- ICO 生成:一张图生成多尺寸 favicon(默认 16/32/48/64/128/256),自动处理非正方形源图(铺透明边)与源图过小(等比放大后缩出各尺寸)。
运行环境
使用托管 Python 环境(已装 Pillow,无需安装任何依赖):
PY=~/.workbuddy/binaries/python/envs/default/bin/python
PY ~/.workbuddy/skills/image-converter/scripts/imgconv.py <子命令> ...
任务路由
| 用户请求 | 用法 |
|---|---|
| 「把 x.png 转成 jpg/webp/bmp/...」 | convert |
| 「生成 favicon / 转成 ico」 | ico |
| 「这个目录里的图都转成 xxx」 | batch |
| 「看看这张图的信息」 | probe |
| 「顺便缩放/改尺寸」 | 任意子命令加 --width/--height/--scale |
| SVG 输入或输出 | 见下方「SVG 限制」 |
用法示例
单张转换
# 基本转换(格式由输出扩展名决定)
$PY scripts/imgconv.py convert input.png output.webp
# 转 JPG(不支持透明时自动按白色铺底,可用 --background 换色)
$PY scripts/imgconv.py convert logo.png photo.jpg --quality 85
# 转换同时缩放(等比)
$PY scripts/imgconv.py convert input.png output.png --width 512
$PY scripts/imgconv.py convert input.png output.png --scale 0.5
生成 ICO(favicon)
# 默认 16/32/48/64/128/256 全尺寸
$PY scripts/imgconv.py ico logo.png favicon.ico
# 指定尺寸(源图 300x200 这类非正方形也能处理:自动透明补边)
$PY scripts/imgconv.py ico logo.png favicon.ico --sizes 16,32,48
批量转换
# 目录下所有图片转为 webp,输出到子目录(不覆盖源文件)
$PY scripts/imgconv.py batch ./images --to webp --out-dir ./images/webp
# 同目录转 jpg 并压质量
$PY scripts/imgconv.py batch ./screenshots --to jpg --quality 80
查看图片信息
$PY scripts/imgconv.py probe input.png
# 输出:格式、尺寸、色彩模式、是否含透明、帧数(动态图识别)
关键规则
- 透明优先:目标为 PNG/WebP/ICO 时保持 RGBA,不做任何合成;只有目标是 JPEG/BMP 时才自动铺底(默认
--background FFFFFF,支持 3 位或 6 位 HEX)。 - JPG 转出必须铺底:绝不允许把 RGBA 直接存 JPEG(Pillow 会报错或出黑边),脚本已内置处理。
- ICO 必须多尺寸:生成 favicon 默认带 16-256 全尺寸;单尺寸 ICO 没有实际意义。
- 缩放用 LANCZOS:脚本已内置,不要另写 resize 代码。
- 批量时单张失败不中断:脚本会跳过失败文件并汇报,失败清单需在回复中告知用户。
- GIF 动图:
convert只取第一帧;用户需要保留动画时明确告知此限制(动图帧级处理可改用 video-converter 技能的 gif 能力)。
SVG 限制(本机环境事实)
本机 不可用 cairosvg(缺 libcairo)与 qlmanage。SVG 相关请求的处理方式:
- SVG → PNG/其他位图:用 Node + sharp(已装在
~/.workbuddy/binaries/node/workspace/node_modules),渲染时设density: 400避免位图偏小:
bash NODE_PATH=/Users/pengcheng.hu/.workbuddy/binaries/node/workspace/node_modules \ ~/.workbuddy/binaries/node/versions/22.22.2-3/bin/node -e " const sharp = require('sharp'); sharp(require('fs').readFileSync(process.argv[1]), {density: 400}) .png().toFile(process.argv[2]).then(()=>console.log('done')); " input.svg output.png - 位图 → SVG:本质是矢量化/描摹,超出本技能范围,需明确告知用户(可用 potrace 类工具或建议改用其他方案)。
- SVG → ICO:先按上述方法 SVG→PNG,再走
ico子命令。
完成后的交付
转换完成后向用户报告:输出文件路径、文件大小、尺寸/格式变化,以及透明通道的处理方式(保留 / 铺了什么底色)。多文件交付时调用 present_files。