garden-skills 的 gpt-image-2 漫画跨页模板实战:用结构化 JSON 生成单页多分镜 / 跨页 spread 漫画

原创2026-10-03 00:55:551,923 阅读
文章标签:人工智能AI 技能/插件提示工程

garden-skills 的 gpt-image-2 漫画跨页模板实战:用结构化 JSON 生成单页多分镜 / 跨页 spread 漫画

导读

本文面向使用 garden-skills 仓库中 gpt-image-2 技能生成漫画类图像的开发者与创作者,系统讲解「漫画跨页 / 多分镜页」模板的完整用法。你将从 manga-spread-page.md 出发,掌握单页 5-7 格不规则分镜、左右跨页 spread、彩色商业页、自动补全模式的提示词写法,并结合 SKILL.md 的三模式运行机制与 generate.js 的命令行参数,理解一套 JSON 模板如何真正落到一次可复现的图像生成中。读完后,你可以直接照模板产出"漫画书质感"的分镜页,也能按仓库案例自行扩展变体。

模板定位:什么场景该用漫画跨页模板

manga-spread-page.md 用于"一页内多个不规则分镜叙事"的漫画视觉,覆盖以下场景:

  • 单页 5-7 个分镜的漫画
  • 跨页 spread(左右两页连贯)
  • 心理 / 悬疑 / 战斗 / 日常多分镜
  • 同人漫画 / 商业漫画
  • 故事板 storyboard

它的核心特征决定了它与简单的 4 格段子截然不同:

  • 不规则格子:大格、小格交错,形成阅读节奏
  • 大格 + 小格组合:避免全页等大导致节奏单调
  • 有阅读顺序:通常右上 → 左下
  • 含对话框 + 心声 + 旁白:三层文字层级
  • 风格更"漫画书":不是 4 格段子

何时使用 / 何时不要使用

当用户提到"漫画分镜 / spread / 多格漫画 / 故事板",或希望叙事更复杂、节奏更动感、要"漫画书"质感时使用本模板。

不要使用本模板的相邻场景,仓库通过模板互斥关系明确定界:

缺失信息优先提问顺序

模板在设计时就把"缺什么先问什么"写死了,对话中按以下顺序收集信息,避免漫无目的地发问:

  1. 故事概要 / 这一页要讲什么
  2. 分镜数量(5-9 格)
  3. 主角描述
  4. 风格:日漫 / 韩漫 / 美漫 / 同人
  5. 阅读方向(日式右往左 / 美式左往右)
  6. 是否含色彩或纯黑白

这一顺序与 prompt-writing.md 的字段设计规则一脉相承:主体来源优先、图像用途其次、核心对象与主题再次,最后才是可默认的风格类字段。

主模板:单页多分镜漫画

主模板面向"整体一页漫画,包含 5-7 个不规则分镜,按阅读顺序展开一段叙事"。以下 JSON 是仓库中可直接复制的完整模板,{argument ...} 为可替换参数槽,default 为可直接工作的默认值:

{
  "type": "单页多分镜漫画",
  "goal": "生成一张完整的单页漫画,含多个分镜,叙事节奏紧凑",
  "story": {
    "summary": "{argument name=\"story summary\" default=\"主角接到神秘电话,决定独自前往\"}",
    "main_character": "{argument name=\"main character\" default=\"年轻女性侦探,短发,黑色风衣\"}",
    "supporting": "{argument name=\"supporting\" default=\"无\"}"
  },
  "style": {
    "art_style": "{argument name=\"art style\" default=\"日式黑白漫画 + 网点 + 强阴影\"}",
    "tone": "{argument name=\"tone\" default=\"悬疑 + 紧张\"}",
    "color": "{argument name=\"color\" default=\"黑白 + 灰阶\"}"
  },
  "page_layout": {
    "panel_count": "{argument name=\"panel count\" default=\"6\"}",
    "reading_direction": "{argument name=\"reading direction\" default=\"日式:从右到左、从上到下\"}",
    "panels": [
      {
        "id": 1,
        "size": "大格 跨上半部分",
        "scene": "{argument name=\"panel 1\" default=\"主角侧脸特写,电话靠耳边\"}",
        "text": "{argument name=\"text 1\" default=\"旁白:那通电话,改变了一切\"}"
      },
      {
        "id": 2,
        "size": "中格 右下",
        "scene": "{argument name=\"panel 2\" default=\"特写电话听筒里的杂音\"}",
        "text": "{argument name=\"text 2\" default=\"对方:今晚十点,老地方\"}"
      },
      {
        "id": 3,
        "size": "小格 左下",
        "scene": "{argument name=\"panel 3\" default=\"主角眼神特写,瞳孔放大\"}",
        "text": "{argument name=\"text 3\" default=\"心声:又是他\"}"
      },
      {
        "id": 4,
        "size": "中格 右",
        "scene": "{argument name=\"panel 4\" default=\"主角穿上风衣的动作分镜\"}",
        "text": ""
      },
      {
        "id": 5,
        "size": "中格 中",
        "scene": "{argument name=\"panel 5\" default=\"主角推开门,雨夜街道\"}",
        "text": ""
      },
      {
        "id": 6,
        "size": "大格 跨下半部分",
        "scene": "{argument name=\"panel 6\" default=\"主角背影远去,路灯昏黄\"}",
        "text": "{argument name=\"text 6\" default=\"旁白:这是赴约,还是赴死\"}"
      }
    ]
  },
  "dialogue_design": {
    "balloon_style": "白底 + 黑描边 + 尖角指向",
    "narration_box": "矩形 + 灰底 + 黑边",
    "thought_balloon": "云形 + 虚线尾巴",
    "font_style": "无衬线漫画体"
  },
  "aspect_ratio": "{argument name=\"aspect ratio\" default=\"3:4\"}",
  "constraints": {
    "must_keep": [
      "分镜大小有节奏(大 + 小 + 大)",
      "阅读顺序清晰",
      "主角在多格中保持一致",
      "对话框不挡关键人物动作"
    ],
    "avoid": [
      "分镜全部一样大(节奏单调)",
      "阅读顺序混乱",
      "主角形象漂移",
      "色调突变(黑白页里突然有彩色)"
    ]
  }
}

模板字段解读

  • type + goal:定义模板类型与最终用途,是 prompt-writing.md 规定的 JSON 骨架(type / goal / subject / scene / layout / style / details / constraints)在漫画场景下的具体化。
  • story:summary 提供一句话故事,main_character 是跨格一致性的锚点——主角描述越具体(发型、服装、道具),模型越不容易在不同分镜里"画成另一个人"。
  • page_layout:panel_count 控制格数,reading_direction 决定分镜排布逻辑,panels 数组严格按 id 顺序给出每格的 size(大/中/小 + 版面位置)、scene(画面内容)与 text(对话 / 心声 / 旁白)。text 为空字符串表示该格无文字,靠纯画面叙事。
  • dialogue_design:独立定义对话框(白底黑描边尖角)、旁白框(矩形灰底黑边)、心声气泡(云形虚线尾巴)与字体(无衬线漫画体)——这是"漫画书质感"区别于普通插画的关键字段。
  • constraints.must_keep / avoid:把最容易翻车的点写成显式约束交给图像模型。

参数策略

模板明确规定了三类参数的对待方式:

  • 必问:故事概要、分镜数、主角
  • 可默认:风格、阅读方向、对话框样式
  • 可随机:背景细节

自动补全策略

  • 用户只给故事时:自动决定 5-7 格分镜节奏
  • 默认日式黑白漫画 + 网点
  • 默认日式阅读方向

这套策略与 prompt-writing.md 的"核心参数优先提问 / 可默认参数用默认值 / 可随机参数合理生成"三级分类完全一致:缺失信息只影响结果走向时才问,否则尽量自己补全。

仓库案例佐证:单页模板的真实落盘形态

仓库的案例库中保留了两份该模板的已渲染结果,可以直接对照理解"模板 → 成品"的映射关系:

1.json 是"跨页 spread 漫画"的完整渲染:8 个分镜、横向 spread、左右两页连贯,panels 数组把每个分镜的 size 明确标注到"右页大格 占上半 / 左页上中格 / 左页下左大格"这种版面级粒度,reading_direction 写成"日式:从右到左、从上到下,跨页先右页后左页",并且 constraints.must_keep 里显式写了"跨页中轴线不切脸不切剑刃主干"。

2.json 则是"单页多分镜漫画"的 6 格校园题材渲染,size 字段出现"大格 右上到跨中 / 小格 中左 / 大格 最下全宽"等不规则排版,text 字段混合了对话("你刚才举手机了?")、心声("不对,他在狡辩!")与旁白("风太大,人也会想太多。")三种层级。

这两份 JSON 证实:模板中的 {argument ...} 槽位在真实使用中会被具体故事内容替换,而 page_layout、dialogue_design、constraints 等结构字段会原样保留、精确约束出图。

变体 1:跨页 spread(左右两页)

适用于"左右两页连贯"的横向大图,模板为:

{
  "type": "跨页 spread 漫画",
  "page_layout": {
    "panel_count": "8-12(左右两页加起来)",
    "format": "横向 spread,画面分左右两页"
  },
  "aspect_ratio": "16:11",
  "constraints": {
    "must_feel": "左右两页连贯,中央 gutter 不要切到关键元素"
  }
}

关键约束是中央 gutter(装订线)安全区:跨页时关键元素(主角面部、剑刃主干等)不得落在中轴线上,否则装订后会断裂。案例 1.json 中"跨页中轴线不切脸不切剑刃主干"正是这条约束的具体执行。

变体 2:彩色商业漫画页

适用于可作商业连载的彩色页,模板为:

{
  "type": "彩色商业漫画页",
  "style": {
    "color": "全彩 + 平涂 + 数字漫画质感",
    "art_style": "美漫 / 韩漫 风"
  },
  "constraints": {
    "must_feel": "可作为商业漫画连载页"
  }
}

注意主模板默认是黑白 + 网点,此变体显式切换到"全彩平涂 + 数字漫画质感",并在 constraints 中以"可作为商业漫画连载页"作为成稿标准。

变体 3:自动补全模式

当用户只给一段故事、要求直接出成品时使用:

{
  "type": "漫画跨页自动补全",
  "mode": "auto-fill",
  "rule": "用户给一段故事,自动切分镜、排版、对话",
  "constraints": {
    "must_feel": "出版社编辑可直接放入排版"
  }
}

此模式下 mode: "auto-fill" 告知模型自行完成分镜切分、版面排版与对话撰写,成稿标准是"出版社编辑可直接放入排版"。

把渲染好的模板跑成图:gpt-image-2 的三模式机制

模板文件中的 JSON 是提示词结构模板,不是 API 请求体。最终交给图像模型的是"渲染后的 prompt 字符串"——可以是拍平的 JSON,也可以是结构化自然语言段落(SKILL.md 明确要求按模板原样使用)。

根据 SKILL.md,任何任务的第一步都是运行模式探测脚本:

node skills/gpt-image-2/scripts/check-mode.js
# 想拿结构化结果给上层程序用:
node skills/gpt-image-2/scripts/check-mode.js --json

脚本逻辑见 check-mode.js:当 ENABLE_GARDEN_IMAGEGEN 为真(1 / true / yes / on / y)且存在 OPENAI_API_KEY 时为 Mode A;开了开关但缺 key 时为 A?(提示先要 key 或降级);未启用则进入 B-or-C(宿主有图像工具走 B,否则走 C)。三个模式的出图路径差异如下:

条件 模式 调用脚本? 落盘 prompt? 落盘图片?
ENABLE_GARDEN_IMAGEGEN=1 + 有 KEY A ✅ generate.js / edit.js ✅ 自动 ✅ 自动
ENABLE_GARDEN_IMAGEGEN=1 但没 KEY A? ❌(先要 KEY) — —
未启用 + 宿主有图像工具 B ❌(用宿主工具) 可选 由宿主决定
未启用 + 宿主无图像工具 C ❌ ✅ 必须 ❌(无法)

环境变量按 CLI 参数 → process.env → <cwd>/.env → <cwd>/.gateway.env → ~/.gateway.env 顺序读取(实现见 shared.js 的 loadAmbientEnv):

变量 必需性 说明
ENABLE_GARDEN_IMAGEGEN Mode A 必需 模式开关:1 / true / yes / on 启用 Mode A
OPENAI_API_KEY Mode A 必需 真正调图像 API 用
OPENAI_BASE_URL 可选 默认 https://api.openai.com/v1,可指向任意 OpenAI 兼容网关
OPENAI_IMAGE_MODEL 可选 默认 gpt-image-2,也可换成 gpt-image-1 / dall-e-3 等

Mode A 命令行实操(以漫画跨页为例)

在 Mode A 下,把上面渲染好的 JSON prompt 保存为文件后直接生图:

node skills/gpt-image-2/scripts/generate.js \
  --promptfile garden-gpt-image-2/prompt/manga-spread-20260424-153045.md \
  --size 1024x1536 \
  --quality high

generate.js 支持的完整 CLI 参数:

  • --prompt <text>:直接传 prompt 文本
  • --promptfile <path>:从文件读 prompt
  • --prompt-output <path>:把最终 prompt 另存到指定文件
  • --image <path>:输出图片路径(默认 garden-gpt-image-2/image/<slug>-<timestamp>.png)
  • --model <name>:模型覆盖(默认 gpt-image-2)
  • --size <WxH>:输出尺寸
  • --n <count>:生成张数
  • --quality <level>:auto / high / medium / low
  • --background <mode>:transparent / opaque / auto
  • --moderation <level>:low / auto
  • --output-format <format>:png / jpeg / webp
  • --output-compression <0-100>:jpeg / webp 压缩比
  • --json:结构化输出
  • -h, --help:帮助

脚本内部流程(generate.js 的 run()):加载环境变量 → 读取 prompt(readPromptInput)→ 生成语义化文件名(slugify,取 prompt 前 8 个词转小写连字符、截断 48 字符)→ 保存 prompt 到 garden-gpt-image-2/prompt/ → 构造 payload 调 POST {base}/images/generations → 解析 data[0].b64_json(兼容 data[0].url 下载)→ 落盘 PNG 到 garden-gpt-image-2/image/。

Mode B / C:无 CLI 入口的用法

  • Mode B:渲染好最终 prompt → 调用宿主自带的 image_generation 类工具(参数中传入 prompt)→ 拿图。
  • Mode C:渲染好最终 prompt → 保存到 garden-gpt-image-2/prompt/<task-slug>-<timestamp>.md → 把内容直接展示给用户,提示可在 ChatGPT / Midjourney / DALL·E / Sora / Nano Banana / 第三方 GPT Image 2 网关中复用。

命名规则统一为 garden-gpt-image-2/prompt/<task-slug>-<timestamp>.md 与 garden-gpt-image-2/image/<task-slug>-<timestamp>.png,其中 <timestamp> 是 YYYYMMDD-HHMMSS(由 makeTimestamp() 生成,见 shared.js)。

避免事项:漫画分镜最容易翻车的地方

模板把高失败率场景全部写成了负面清单:

  • 不要让分镜全部等大
  • 不要让阅读顺序难以辨认
  • 不要让对话框挡脸 / 挡动作
  • 不要在黑白漫画页里突然出现强彩色
  • 不要让主角形象在不同格里像不同人
  • 跨页时不要让关键元素正好在中央装订线

对照案例 2.json 的 avoid 字段("分镜全等大 / 全页无网点层次 / 阅读顺序难辨认"),可以看到负面约束在真实渲染中同样被严格执行。与 4 格模板(four-panel-comic.md)相比,本模板额外关注"大 + 小格节奏"与"跨页 gutter",这是复杂叙事的特有风险点。

工作流小结:从故事到成图的一条龙路径

  1. 判定场景:确认是"单页多分镜 / 跨页 spread"而非 4 格段子或单图 KV。
  2. 按提问顺序收集信息:故事概要 → 分镜数 → 主角 → 风格 → 阅读方向 → 色彩。
  3. 套用主模板或变体:填充 {argument ...} 槽位,缺失信息用默认值或自动补全。
  4. 跑 check-mode.js 判定模式(check-mode.js)。
  5. 按模式出图:Mode A 调 generate.js 直接落盘;Mode B 交给宿主图像工具;Mode C 只产出并保存 prompt。
  6. 对照避免清单验收:分镜节奏、阅读顺序、主角一致性、对话框遮挡、色彩统一、跨页 gutter。

以上每一步都能在当前仓库中找到对应的模板文件、脚本实现与真实案例,可放心照此流程在生产中使用。

登录后查看全文
garden-skills