# Image Gen

> Nano-banana 图像生成与编辑 Skill。支持文生图和图生图，根据文字描述或参考图使用 AI 生成/编辑图像，自动压缩大图，保存到 workspace/img 目录，并直接在飞书中展示。 触发场景：用户要求生成图片、画图、AI 绘图、创建图像、修改图片、基于图片生成、图生图。

- Skill: `zweien/image-gen` (Agent Skill, multi-file: 8 files)
- Install (CLI): `npx skillmds add zweien/image-gen`
- Raw SKILL.md: https://api.skillmd.com/api/skills/zweien/image-gen/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: zweien (https://skillmd.com/u/zweien)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/zweien/image-gen

---


# 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 <input> <output> [max_size_mb]

# 示例
python3 compress_image.py original.png compressed.png 1
```

**压缩策略：**
1. 如果图片 ≤ 1MB，不压缩
2. 如果图片 > 1MB：
   - 逐步降低 JPEG 质量 (85 → 10)
   - 如果仍超过限制，缩小尺寸 (90% → 30%)
3. 保留原始文件，压缩结果另存

## 支持的参数

### 宽高比 (aspect_ratio)
- `1:1` - 正方形（默认）
- `4:3`, `3:4` - 标准比例
- `16:9`, `9:16` - 宽屏/竖屏
- `2:3`, `3:2` - 照片比例
- `4:5`, `5:4` - 接近正方形
- `21:9` - 超宽屏
- `1:4`, `4:1` - 长条形
- `8:1`, `1:8` - 超长条形

### 图像尺寸 (image_size)
- `1K` - 适合快速预览
- `2K` - 推荐默认（默认）
- `4K` - 高清大图
- `512px` - 小图

### 参考图 (image)
- 类型：字符串数组
- 格式：URL 或 base64 编码（推荐 `data:image/png;base64,...` 格式）
- 支持：单张或多张参考图

## API 信息

- **Endpoint:** `POST /v1/images/generations`
- **认证:** `Authorization: Bearer {{YOUR_API_KEY}}`
- **模型:** `${IMAGE_MODEL}` (默认: `gemini-3.1-flash-image-preview`)
- **Base URL:** `https://api.imyaigc.top`

### 完整请求参数

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| model | string | ✅ | 模型名称 |
| prompt | string | ✅ | 生成描述 |
| response_format | string | ❌ | `url` 或 `b64_json` |
| aspect_ratio | string | ❌ | 宽高比 |
| image | array | ❌ | 参考图数组（URL 或 base64） |
| image_size | string | ❌ | 图像尺寸（仅 nano-banana-2 支持） |

## 目录结构

```
~/.openclaw/workspace/
├── img/                          # 生成的图片保存目录
│   ├── image_20260302_221900_original.png  # 原始图片
│   ├── image_20260302_221900.png           # 压缩后（用于发送）
│   └── ...
└── skills/
    └── image-gen/
        ├── SKILL.md              # 本说明文件
        ├── image-gen.sh          # 生成脚本
        ├── compress_image.py     # 压缩工具
        ├── .env                  # API 配置
        └── .env.example          # 配置示例
```

## 注意事项

1. 图片**必须**保存在 `~/.openclaw/workspace/img/` 目录
2. 超过 1MB 的图片会自动压缩后再发送到飞书
3. 原始图片保留，方便后续使用
4. 文件名使用时间戳避免冲突
5. 提示词会自动翻译为英文以获得更好的生成效果
6. API 调用可能需要 30-60 秒，请告知用户等待
7. **图生图时**：参考图会转为 base64 传入 API 的 `image` 参数

