From 4c7e9dfc685f1cf5e4881df855f522c2d7d8b743 Mon Sep 17 00:00:00 2001 From: mac Date: Sat, 18 Jul 2026 11:00:23 +0800 Subject: [PATCH] Update gen-image skill specs --- categories/图片生成/28772__gen-image.zip | Bin 10596 -> 12979 bytes gen-image/AGENTS.md | 28 +++++++--- gen-image/README.md | 23 ++++++-- gen-image/SKILL.md | 41 +++++++++++--- gen-image/gen.sh | 5 +- gen-image/scripts/gen_image.py | 67 ++++++++++++++++++++--- renderer/catalog.json | 4 +- 7 files changed, 136 insertions(+), 32 deletions(-) diff --git a/categories/图片生成/28772__gen-image.zip b/categories/图片生成/28772__gen-image.zip index 446586ddfc3bfe3d7cec572a93c55da4f0a182e7..6b289466b91a37a92ea2f734b6a28b369c07091a 100644 GIT binary patch literal 12979 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 F{{YB5Cj|fi literal 10596 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" && python3 scripts/gen_image.py \ "a fluffy orange tabby cat on a windowsill, soft morning light, cozy tones, highly detailed" \ - --size 1024x1024 --quality high + --size 1k-square --quality high ``` 图片存到 `output/img-<时间戳>-<序号>.png`,脚本会打印完整路径。 @@ -59,23 +60,47 @@ cd "" && python3 scripts/gen_image.py \ **4. 图生图 / 编辑**(用户给了输入图): ```bash -python3 scripts/gen_image.py "把背景换成雪山日落" --edit /path/to/input.png --size 1024x1024 +python3 scripts/gen_image.py "把背景换成雪山日落" --edit /path/to/input.png --size 1k-square ``` 多图参考:多次 `--edit a.png --edit b.png`。局部重绘:加 `--mask mask.png`(PNG 中**透明区域**为要重绘的部分,其余保留)。 **5. 交付。** 打印出保存路径后,简要告诉用户生成了什么、存在哪。图无法在终端直接显示,用户会自己打开;若在支持预览的环境可提示路径。 +## 尺寸规格速查 + +脚本会把下列别名转换为实际像素;也可以直接传 `WIDTHxHEIGHT` 或 `auto`。部分中转/模型可能只开放其中一部分规格,遇到 400 时降低到 1K 或改用上游明确支持的尺寸。 + +| 规格 | 方图 | 横图 | 竖图 | 宽屏/超宽 | 典型用途 | +|------|------|------|------|-----------|----------| +| 1K | `1k-square` → `1024x1024` | `1k-landscape` → `1536x1024` | `1k-portrait` → `1024x1536` | - | 头像、图标、草图、普通配图 | +| 2K | `2k-square` → `2048x2048` | `2k-landscape` → `2048x1536` | `2k-portrait` → `1536x2048` | `2k-wide` → `2048x1152` / `2k-tall` → `1152x2048` | 海报、封面、高清社媒图 | +| 4K | `4k-square` → `4096x4096` | `4k-landscape` → `4096x3072` | `4k-portrait` → `3072x4096` | `4k-wide` → `4096x2304` / `4k-uhd` → `3840x2160` / `4k-tall` → `2304x4096` / `4k-uhd-portrait` → `2160x3840` | 大屏封面、展板、高清壁纸 | + +## 风格参数速查 + +优先把风格写进 prompt,因为所有模型都能理解自然语言风格。仅当目标中转或模型明确支持独立风格字段时,再额外传 `--style`。 + +| 需求 | 推荐写法 | +|------|---------| +| 写实摄影 | prompt 写 `photorealistic, cinematic lighting, natural skin texture`,可加 `--style photorealistic` | +| 插画 | prompt 写 `editorial illustration, clean shapes, rich color palette`,可加 `--style illustration` | +| 动漫 | prompt 写 `anime style, expressive linework, cel shading`,可加 `--style anime` | +| 自然风格 | prompt 写清现实光线和材质,可加 `--style natural` | +| 鲜艳风格 | prompt 写高饱和、强对比,可加 `--style vivid` | + ## 常见参数速查 | 需求 | 命令片段 | |------|---------| -| 头像/图标(方图) | `--size 1024x1024` | -| 海报/封面(横) | `--size 1536x1024` | -| 手机壁纸/人像(竖) | `--size 1024x1536` | +| 头像/图标(方图) | `--size 1k-square` 或 `--size 1024x1024` | +| 海报/封面(横) | `--size 1k-landscape` / `2k-landscape` / `4k-wide` | +| 手机壁纸/人像(竖) | `--size 1k-portrait` / `2k-portrait` / `4k-tall` | +| 4K 壁纸 | `--size 4k-uhd` | | 透明背景贴纸 | `--background transparent` | | 多出几张挑选 | `--n 4` | | 高画质 | `--quality high` | +| 独立风格字段 | `--style natural` 或 `--style vivid`(看上游支持情况) | | 换模型 | `--model dall-e-3` | | 基于图改 | `--edit input.png` | | 局部重绘 | `--edit input.png --mask mask.png` | diff --git a/gen-image/gen.sh b/gen-image/gen.sh index 900d9c3..a8588f9 100755 --- a/gen-image/gen.sh +++ b/gen-image/gen.sh @@ -1,13 +1,14 @@ #!/usr/bin/env bash # gen.sh — 生图快捷入口。用法: # ./gen.sh "提示词" # 文生图,默认 1024x1024 -# ./gen.sh "提示词" --size 1536x1024 # 透传任意 gen_image.py 参数 +# ./gen.sh "提示词" --size 2k-landscape # 透传任意 gen_image.py 参数 +# ./gen.sh "提示词" --style natural # 部分模型/中转支持独立风格参数 # ./gen.sh "换成雪山背景" --edit in.png # 图生图 # 无论从哪个目录调用都能正确定位脚本与 .env。 set -euo pipefail DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" if [ "$#" -eq 0 ]; then - echo "用法: ./gen.sh \"提示词\" [--size 1024x1024] [--quality high] [--edit 图.png] ..." >&2 + echo "用法: ./gen.sh \"提示词\" [--size 1k-square|2k-landscape|4k-wide] [--quality high] [--style natural] [--edit 图.png] ..." >&2 exit 1 fi exec python3 "$DIR/scripts/gen_image.py" "$@" diff --git a/gen-image/scripts/gen_image.py b/gen-image/scripts/gen_image.py index 96b6d4f..e8a433f 100644 --- a/gen-image/scripts/gen_image.py +++ b/gen-image/scripts/gen_image.py @@ -6,10 +6,10 @@ gen_image.py — 通过大模型中转站调用 OpenAI 图片接口生图(文 用法: # 文生图 - python3 gen_image.py "一只戴墨镜的柴犬,赛博朋克霓虹背景" --size 1024x1024 --n 1 + python3 gen_image.py "一只戴墨镜的柴犬,赛博朋克霓虹背景" --size 1k-square --n 1 # 图生图 / 编辑(可选 --mask 做局部重绘) - python3 gen_image.py "把背景换成雪山" --edit input.png --mask mask.png + python3 gen_image.py "把背景换成雪山" --edit input.png --mask mask.png --size 2k-landscape 环境变量(也可写进 .env): IMAGE_API_BASE_URL 中转站基址,如 https://your-relay.com (会自动补 /v1/images/...) @@ -29,6 +29,41 @@ import urllib.request import uuid +SIZE_ALIASES = { + # 1K / gpt-image 常用尺寸 + "1k": "1024x1024", + "1k-square": "1024x1024", + "1k-landscape": "1536x1024", + "1k-portrait": "1024x1536", + "square": "1024x1024", + "landscape": "1536x1024", + "portrait": "1024x1536", + # 2K 常用尺寸 + "2k": "2048x2048", + "2k-square": "2048x2048", + "2k-landscape": "2048x1536", + "2k-portrait": "1536x2048", + "2k-wide": "2048x1152", + "2k-tall": "1152x2048", + # 4K 常用尺寸 + "4k": "4096x4096", + "4k-square": "4096x4096", + "4k-landscape": "4096x3072", + "4k-portrait": "3072x4096", + "4k-wide": "4096x2304", + "4k-tall": "2304x4096", + "4k-uhd": "3840x2160", + "4k-uhd-portrait": "2160x3840", +} + + +def normalize_size(size): + """把 1k/2k/4k 语义别名转成接口常见的 WIDTHxHEIGHT;未知值原样透传。""" + if not size: + return "1024x1024" + return SIZE_ALIASES.get(size.strip().lower(), size) + + # --------------------------------------------------------------------------- # 配置加载 # --------------------------------------------------------------------------- @@ -165,13 +200,24 @@ def save_images(resp, out_dir, prefix): # --------------------------------------------------------------------------- def main(): load_dotenv() - p = argparse.ArgumentParser(description="通过中转站调用 OpenAI 图片接口生图") + p = argparse.ArgumentParser( + description="通过中转站调用 OpenAI 图片接口生图", + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=( + "常用尺寸别名:\n" + " 1k-square=1024x1024, 1k-landscape=1536x1024, 1k-portrait=1024x1536\n" + " 2k-square=2048x2048, 2k-landscape=2048x1536, 2k-portrait=1536x2048, 2k-wide=2048x1152\n" + " 4k-square=4096x4096, 4k-landscape=4096x3072, 4k-portrait=3072x4096, 4k-wide=4096x2304, 4k-uhd=3840x2160\n" + "也可以直接传 1024x1024、2048x1152、4096x2304 或 auto。\n" + ), + ) p.add_argument("prompt", help="生图提示词") p.add_argument("--model", default=None, help="覆盖默认模型") - p.add_argument("--size", default="1024x1024", help="尺寸,如 1024x1024 / 1536x1024 / 1024x1536 / auto") + p.add_argument("--size", default="1024x1024", help="尺寸或别名,如 1024x1024 / 1k-square / 2k-landscape / 4k-wide / auto") p.add_argument("--n", type=int, default=1, help="生成张数") p.add_argument("--quality", default=None, help="质量: low/medium/high/auto(gpt-image 系)") p.add_argument("--background", default=None, help="transparent/opaque/auto(gpt-image 系,透明背景)") + p.add_argument("--style", default=None, help="风格参数,部分模型/中转支持,如 vivid/natural/anime/photorealistic;不支持时把风格写进 prompt") p.add_argument("--edit", action="append", default=[], help="图生图/编辑的输入图(可多次传入多图)") p.add_argument("--mask", default=None, help="局部重绘蒙版 PNG(透明处为要重绘的区域)") p.add_argument("--output", default=None, help="输出目录(默认 skill 根下 output/)") @@ -179,34 +225,39 @@ def main(): base, key, default_model = get_config() model = args.model or default_model + size = normalize_size(args.size) skill_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) out_dir = args.output or os.path.join(skill_root, "output") if args.edit: # 图生图 / 编辑:multipart 到 /v1/images/edits url = f"{base}/v1/images/edits" - fields = {"model": model, "prompt": args.prompt, "n": str(args.n), "size": args.size} + fields = {"model": model, "prompt": args.prompt, "n": str(args.n), "size": size} if args.quality: fields["quality"] = args.quality if args.background: fields["background"] = args.background + if args.style: + fields["style"] = args.style files = [("image[]", pth) for pth in args.edit] # 多图统一用 image[] if len(args.edit) == 1: files = [("image", args.edit[0])] # 单图用 image,兼容 dall-e-2 风格 if args.mask: files.append(("mask", args.mask)) - print(f"[gen_image] 图生图 · model={model} · {len(args.edit)} 张输入 · size={args.size}") + print(f"[gen_image] 图生图 · model={model} · {len(args.edit)} 张输入 · size={size}") resp = post_multipart(url, key, fields, files) prefix = "edit" else: # 文生图:JSON 到 /v1/images/generations url = f"{base}/v1/images/generations" - payload = {"model": model, "prompt": args.prompt, "n": args.n, "size": args.size} + payload = {"model": model, "prompt": args.prompt, "n": args.n, "size": size} if args.quality: payload["quality"] = args.quality if args.background: payload["background"] = args.background - print(f"[gen_image] 文生图 · model={model} · n={args.n} · size={args.size}") + if args.style: + payload["style"] = args.style + print(f"[gen_image] 文生图 · model={model} · n={args.n} · size={size}") resp = post_json(url, key, payload) prefix = "img" diff --git a/renderer/catalog.json b/renderer/catalog.json index 84b14f5..7bd6f34 100644 --- a/renderer/catalog.json +++ b/renderer/catalog.json @@ -140,7 +140,7 @@ "name": "gen-image 生图", "author": "backup-bot", "subtitle": "中转直调 GPT 生图 · 文生图/图生图", - "brief": "通过大模型中转站调用 OpenAI 图片接口生成图像,支持文生图、图生图/编辑、局部重绘、透明背景。纯标准库零依赖,凭证走 .env,一条命令出图,图片落地本机。", + "brief": "通过大模型中转站调用 OpenAI 图片接口生成图像,支持文生图、图生图/编辑、局部重绘、透明背景、1K/2K/4K 常用尺寸和可选风格参数。纯标准库零依赖,凭证走 .env,一条命令出图,图片落地本机。", "category": "图片生成", "cnTags": [ "图片生成", @@ -275652,4 +275652,4 @@ "path": "categories/设计/15340__爱图表-桑基图.zip" } ] -} \ No newline at end of file +}