---
name: image-gen
description: |
Nano-banana 图像生成与编辑 Skill。支持文生图和图生图,根据文字描述或参考图使用 AI 生成/编辑图像,自动压缩大图,保存到 workspace/img 目录,并直接在飞书中展示。
触发场景:用户要求生成图片、画图、AI 绘图、创建图像、修改图片、基于图片生成、图生图。
---
# Nano-banana 图像生成与编辑 Skill
使用 Nano-banana-3.1-Flash API 进行图像生成与编辑,支持:
- **文生图 (text-to-image)**: 根据文字描述生成图像
- **图生图 (image-to-image)**: 基于参考图生成新图像
自动压缩超过 1MB 的图片,保存到 workspace,并直接在飞书中展示。
## 配置
在workspace目录下创建 `.env` 文件:
```bash
# .env
IMAGE_API_BASE_URL=https://api.imyaigc.top
IMAGE_API_KEY=your-api-key-here
IMAGE_MODEL=gemini-3.1-flash-image-preview
IMAGE_SIZE=2K
IMAGE_ASPECT_RATIO=1:1
```
## 图片保存位置
所有生成的图片保存在:
```
~/.openclaw/workspace/img/
```
文件名格式:`image_YYYYMMDD_HHMMSS.png`
**压缩规则:**
- 原始图片保存为:`image_YYYYMMDD_HHMMSS_original.png`
- 如果原图 > 1MB,自动压缩并保存为:`image_YYYYMMDD_HHMMSS.png`
- 发送到时使用压缩后的版本
## 使用方法
### 1. 文生图 (Text-to-Image)
直接告诉我要生成什么图片:
示例:
- "生成一张夕阳下的海滩图片"
- "画一只可爱的猫咪"
- "创建一个赛博朋克风格的大龙虾,16:9 比例"
### 2. 图生图 (Image-to-Image)
提供参考图和修改描述:
示例:
- "基于这张图,改成水彩风格"
- "把这张图改成夜景"
- "参考这张图,生成一个类似风格的建筑"
- "把这张照片变成油画风格"
**工作流程:**
1. 用户提供参考图(发送图片)
2. 下载图片并转为 base64
3. 调用 API 时传入 `image` 参数
4. 返回基于参考图生成的新图像
## 工作流程
### 文生图流程
1. **解析参数**
- 提取提示词
- 识别宽高比参数(如 "16:9"、"1:1")
2. **调用 API**
```bash
curl -X POST "${IMAGE_API_BASE_URL}/v1/images/generations" \
-H "Authorization: Bearer ${IMAGE_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "'"${IMAGE_MODEL}"'",
"prompt": "描述内容",
"response_format": "url",
"aspect_ratio": "16:9"
}'
```
### 图生图流程
1. **获取参考图**
- 用户发送图片
- 下载图片并转为 base64
2. **调用 API**
```bash
curl -X POST "${IMAGE_API_BASE_URL}/v1/images/generations" \
-H "Authorization: Bearer ${IMAGE_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "'"${IMAGE_MODEL}"'",
"prompt": "修改描述(如:改为水彩风格)",
"response_format": "url",
"aspect_ratio": "16:9",
"image": ["data:image/png;base64,iVBORw0KGgo..."]
}'
```
3. **获取图片 URL**
- 从响应中提取 `data[0].url`
4. **下载并保存原始图片**
```bash
OUTPUT_DIR=~/.openclaw/workspace/img
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
ORIGINAL_FILE="${OUTPUT_DIR}/image_${TIMESTAMP}_original.png"
FINAL_FILE="${OUTPUT_DIR}/image_${TIMESTAMP}.png"
curl -o "$ORIGINAL_FILE" "$IMAGE_URL"
```
5. **检查大小并压缩(如需要)**
```bash
FILE_SIZE=$(stat -f%z "$ORIGINAL_FILE" 2>/dev/null || stat -c%s "$ORIGINAL_FILE")
MAX_SIZE=$((1024 * 1024)) # 1MB
if [ "$FILE_SIZE" -gt "$MAX_SIZE" ]; then
echo "图片超过 1MB,正在压缩..."
python3 compress_image.py "$ORIGINAL_FILE" "$FINAL_FILE" 1
else
cp "$ORIGINAL_FILE" "$FINAL_FILE"
fi
```
6. **发送到飞书**
如果在飞书对话中,注意以下发送方式
```
message(
action="send",
channel="feishu",
accountId="second",
target="用户或群组ID",
media="~/.openclaw/workspace/img/image_xxx.png"
)
```
## 压缩工具
使用 `compress_image.py` 进行图片压缩:
```bash
# 用法
python3 compress_image.py