Image Compressor - 智能图片压缩
概述
本 skill 使用 Python Pillow 库对图片进行智能压缩,在不明显损失视觉质量的前提下大幅减小文件体积。
典型效果:
| 图片类型 | 典型压缩率 | 视觉质量 |
|---------|-----------|---------|
| 照片/JPEG | 70-85% | 几乎无感知差异 |
| 截图/PNG | 60-80% | 几乎无感知差异 |
| WebP | 65-80% | 几乎无感知差异 |
| 含文字截图 | 50-70% | 文字清晰可辨 |
工作流程
第一步:检查依赖
首次使用自动安装 Pillow(如果需要):
pip install Pillow -q
可以先用 python -c "from PIL import Image; print('OK')" 检查是否已安装。
第二步:调用压缩脚本
压缩一张图片:
python scripts/compress_image.py <图片路径> [选项]
基本用法:
# 默认压缩(自动检测格式,目标压缩 70%)
python scripts/compress_image.py photo.jpg
# 指定质量
python scripts/compress_image.py photo.jpg --quality 40
# 指定输出格式为 WebP
python scripts/compress_image.py photo.png --format webp
# 限制最大宽度 1200px 并压缩
python scripts/compress_image.py photo.jpg --max-width 1200
# 指定输出路径
python scripts/compress_image.py photo.jpg --output compressed.jpg
第三步:展示结果
压缩完成后,向用户展示压缩报告:
📊 压缩结果
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📁 原始: 2.3 MB
📁 压缩后: 687.2 KB
📉 压缩率: 70.1%
🖼️ 格式: PNG → JPEG
⚙️ 质量参数: 45
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
如果用户需要,可以同时展示压缩前后的图片对比(用 Read 工具读取两张图片让用户直观感受差异)。
核心压缩策略
脚本 scripts/compress_image.py 实现了以下策略,按优先级自动选择:
策略 1:JPEG 质量调优(默认用于照片类)
- 将质量从 75-95(典型原图)降到 30-55
- 自动二分搜索最佳质量值来精确匹配目标压缩率
- 剔除 EXIF 元数据(可保留)
- 可选的等比例缩放
策略 2:PNG 深度优化
- 对有透明通道的 PNG 保持 PNG 格式,启用 optimize=True
- 对无透明的 PNG 自动建议转换为 JPEG
- 对索引色 PNG 优化调色板
策略 3:WebP 转换(最佳压缩比)
- 用 WebP 格式可以获得 JPEG 同等质量下再小 25-35% 的体积
- 但注意:WebP 兼容性略差(不支持微信等老平台)
策略 4:等比例缩放
- 当图片尺寸过大时(如 4000x3000),先缩放到合理尺寸再压缩
- 默认不缩放,通过
--max-width参数控制
交互指南
快速模式(用户给出明确路径)
用户:帮我压缩这张图片 D:\photos\IMG_001.jpg
→ 直接执行压缩脚本,展示结果
→ 询问是否满意,需要调整参数再试一次
探索模式(用户没给路径)
用户:图片太大了帮我压缩一下
→ 询问图片位置
→ 确认压缩目标(质量优先还是体积优先)
→ 执行压缩
→ 展示前后对比
批量模式(多个文件)
用户:帮我把这个文件夹里所有图片压缩了
→ 用 Glob 查找文件夹中的所有图片文件 (*.jpg, *.jpeg, *.png, *.webp)
→ 逐个压缩
→ 汇总展示结果
对比展示
压缩完成后,Read 原始图片和压缩后图片让用户直观对比质量差异。
常用参数速查
| 参数 | 说明 | 默认值 | 推荐值 |
|---|---|---|---|
--quality |
JPEG/WebP 质量 | 50 | 30-60 |
--target-ratio |
目标压缩后/前的比例 | 0.3 | 0.2-0.4 |
--format |
输出格式 | 自动选择 | jpg/png/webp |
--max-width |
最大宽度(px) | 不限 | 1920/1200 |
--keep-exif |
保留 EXIF 信息 | 否 | -- |
常用组合
# 极致压缩(体积优先)
python scripts/compress_image.py photo.jpg --quality 25 --target-ratio 0.15
# 高质量压缩(画质优先)
python scripts/compress_image.py photo.jpg --quality 70 --target-ratio 0.5
# 网络用图(1920宽 + WebP)
python scripts/compress_image.py photo.jpg --max-width 1920 --format webp --quality 50
# 微信分享(保持 JPG 兼容性)
python scripts/compress_image.py photo.jpg --max-width 1200 --quality 45
重要约束
- 不下采样过度 - 质量低于 15 时警告用户画质损失明显
- 检查输出 - 压缩完成后必须检查输出文件是否有效
- 透明处理 - PNG 透明通道转换为 JPEG 时用白色背景填充,必须告知用户
- 不破坏原图 - 默认输出为
原文件名_compressed.扩展名,不覆盖原图 - 诚实报告 - 如果原图已经很小(<100KB),如实告知压缩空间有限