头马会议海报背景图提示词生成器
把一场例会的信息,变成一段可直接粘贴进「即梦」的背景图提示词;若用户要成品,则继续出图、叠字、合成嘉宾。
核心原则(不可违背)
- AI 只负责背景,不负责信息。俱乐部名、场次、地址、时间一律后期叠,AI 图里不许出现。
- 唯一例外是主题书法字。用户确认过:主题二字(2–4 字)以书法体画在画面上方,其余文字全部禁掉。
- 嘉宾永远是后期合成的。即使海报有分享嘉宾,负向约束里也必须写「不要出现人物」——否则 AI 会在右侧画一个人,与后期合成的真人直接冲突。
- 留白必须量化。只写"留白"模型会填满画面;必须给百分比 + 用途 + 边界。
- 俱乐部中立。本技能服务所有头马俱乐部,不预设任何具体俱乐部。名称、地址、时间、大区等信息一律来自用户提供的接龙,不猜、不套"常见默认值"。填错地址的 poster 比没有 poster 更糟。
- 例外:用户是 EGG「诞」头马演讲俱乐部(文本出现 EGG/「诞」/蛋)时,改用专属技能
egg-poster-generator——EGG 的固定信息(地址/时段/愿景/金句)内建在那里,出图更快更准。 - 默认直接交付成品图,不输出提示词文本。用户已明确:要的是能直接看能下载的 PNG,不是"拿去即梦跑的提示词"。因此:
-references/prompt-skeleton.md是内部工具——用它构造写给 ImageGen 的 prompt,但绝不把 prompt 原文贴给用户
- 即梦提示词降为可选附录,只有用户明确说"要即梦提示词"时才输出
- 回复里只给:图片 + 极简说明(意象、会议信息核对) - 默认只出 1 张,不主动出多张候选。用户明确说过"生成一张图就可以了"。多张既费积分又让人选择困难。
- 只有用户说"多来几版挑挑""出几个方案"时才出 3 张
- 出 1 张时更要把好关:跑完越界检测再交付,没有备选可以兜底 - canvas-design 作为可选的艺术背景引擎。默认路径 A(六段骨架→ImageGen)覆盖绝大多数例会;
当用户明确要"更有设计感/艺术感"的海报,或 ImageGen 出图偏套路时,走路径 B:先调用canvas-design
技能写一份主题化视觉设计哲学(.md),再把它落到一张 PNG 背景,最后仍由 PIL 叠字、合嘉宾。
路径 B 与路径 A 的关键区别:允许保留 canvas-design 自带的极简视觉性文字(sculptural labels /
主题词点缀 / 细瘦小标),这是其美学的一部分,不再强制禁用——但 canvas 文字必须满足:①只落在中部视觉区
(约画面 26%–74%),绝不侵入上 26% / 下 28% 的会议信息区;②只能是装饰性/抽象文字,
不得出现真实会议信息(俱乐部名、场次、地址、时间、嘉宾名,这些一律仍由 PIL 叠);
③ Step 7 的 PIL 只在上下留白区放会议信息,与 canvas 文字天然分区、不重叠。输出 PNG 直接喂给overlay_text.py --bg。
工作流
Step 0 — 判断输入类型并解析
用户贴的原文有两类,先判断是哪一类,再走对应解析。
| 类型 | 特征 | 解析方式 |
|---|---|---|
| A. 活动信息(用户主要情形) | 有会议届次 + 主题 + 嘉宾姓名/头衔/个人介绍/照片;没有角色接龙 | 跑 scripts/parse_activity.py |
| B. 角色接龙 | 有一串角色名(主持人/时间官/哼哈官/备稿1…) | 用下表正则抽取 |
> 用户明确说过:贴的通常不是接龙报名信息,而是俱乐部的活动信息。判断不出时按 A 处理。
A. 活动信息 → 跑解析器
python scripts/parse_activity.py --file activity.txt # 或 --text "..." / stdin
python scripts/parse_activity.py --file activity.txt --out parsed.json --quiet
输出 schema(缺字段一律留空,绝不臆造):
{
"session": "第 472 次会议", "theme": "演讲的节奏设计",
"club": "...", "time": "...", "address": "...",
"guests": [{"index":1,"name":"","title":"","bio":"","photo":"","photo_kind":"url|path|none"}],
"missing": ["会议时间", "嘉宾2 照片"]
}
规则:
- 多嘉宾逐一识别:按空行 / 「嘉宾」「讲者」「照片」标记切块,每块一位嘉宾;
「嘉宾:王敏、张涛」这种一行多人的按顿号拆 - 照片字段原样保留:URL 或本地路径都不加工,只标
photo_kind(url / path / none) - 容错:格式不固定、字段缺失或乱序都能跑;认不到的留空
- 缺失项在
missing里列出(含「嘉宾N 头衔」这种逐位标注),供 Step 1 追问 - 解析器只做正则启发式,跑完必须人工复核一遍——尤其是姓名与头衔的边界
B. 角色接龙 → 正则抽取
| 字段 | 抽取模式 |
|---|---|
| 俱乐部 | 接龙标题行 / 首行,通常是「XX 头马演讲俱乐部 第 N 次会议」 |
| 场次 | 第(\d+)次 |
| 主题 | 主题[::]\s*《(.+?)》,无书名号退化到冒号后整行 |
| 时间 | X月X日 + 周X + (上午\|下午)\s?\d+:\d+ |
| 地址 | 含「路 / 号 / 室 / 楼 / 中心」的行 |
| 嘉宾 | 含 嘉宾分享 / 分享嘉宾 / 工作坊 / 特邀 的行,抽姓名 / 头衔 / 分享题目 |
Step 1 — 追问缺失项(只问缺的)
把解析结果按下面这张表核对,只追问 missing 里列出的:
| # | 字段 | 缺失处理 |
|---|---|---|
| 1 | 俱乐部名称 | 先查 references/club-profiles.md 已存档;没有就问 |
| 2 | 会议届次 | 问 |
| 3 | 会议主题 | 必问——没有主题就没有意象锚点,不许猜 |
| 4 | 会议地址 | 问 |
| 5 | 会议时间 | 问 |
| 6 | 嘉宾姓名 / 头衔 / 介绍 / 照片 | 逐位追问缺失的那几项;照片要文件路径或 URL |
已解析出的字段绝不重复问。追问时一次性问完,不要一轮一项。
多嘉宾时的海报处理:composite_guest.py 一次合成一位,多位就串联跑
(第一次输出当第二次的 --base),用 --center-x / --bottom-ratio / --height-ratio
错开位置;两人用 0.32 / 0.68,三人用 0.24 / 0.50 / 0.76,人像高度降到 0.30 左右。
> ⚠️ 本技能面向所有头马俱乐部,不预设任何具体俱乐部。地址、时间、大区等信息一律不猜、不套"常见默认值"——填错地址的 poster 比没有 poster 更糟。
Step 2 — 一次问完偏好
用 AskUserQuestion 一次性问(不分多轮):
- 画布比例(3:4 竖版 1080×1440 默认 · 9:16 · 1:1 · A3 印刷)/ 视觉调性(现代商务·国际化 默认 · 新国潮 · 温暖人文 · 未来科技 · 极简留白)/ 有无分享嘉宾(有 · 无)
- 俱乐部 · 场次 · 主题 · 地址 · 时间 · 嘉宾信息 → 让用户一次性自由输入
> 俱乐部不预设选项(本技能服务所有头马俱乐部)。上轮已解析出俱乐部时,把它作为默认项写进题面让用户确认即可,不要列候选名单。
Step 3 — 查主题意象映射表
读 references/theme-visual-map.md,用主题关键词模糊匹配。无命中则走回退:把主题拆成可画名词,套「官方五色抽象几何层叠 + 渐变光晕 + 细腻噪点」。
Step 3.5 — 选择背景渲染路径(A / B)
绝大多数例会走 路径 A(下面的 Step 4–6,六段骨架 → ImageGen)。以下情形改走 路径 B:
- 用户明确要"更有设计感 / 艺术感 / 高级感"的海报
- 这是要对外分享 / 公众号 / 印刷的宣传物料,而非内部例会通知
- ImageGen 连续出图偏套路、缺乏独特美学世界观
路径 B:用 canvas-design 生成艺术背景
- 调用
canvas-design技能,先写一份主题化视觉设计哲学(.md):
把会议主题翻译成一个具名美学运动(如「演讲的节奏设计」→「Rhythmic Geometry 节奏几何」),
按该技能的范式强调空间 / 色彩 / 尺度 / 留白与"大师级 craftsmanship",但必须主题化——
哲学要为这场会议的主题服务,而非泛泛而谈。
- 不必每次从零写:技能已预置可套用 / 改写的设计哲学范例,如
references/luminous-convergence.md(科技感 + 人文温度 / 连接 / 成长类主题),
可直接采用或在其基础上做主题化改写。 - 按 canvas-design 的"画布创作"步骤,把哲学落到一张 PNG 背景,目标比例与路径 A 一致
(3:4 竖版 1080×1440 默认 · 9:16 · 1:1 · A3)。 - ⚠️ 适配约束(路径 B 相对 canvas-design 默认行为的调整):
- 视觉性文字可保留(路径 B 的特色):canvas-design 默认会在画面上放"极简文字作视觉点缀",
路径 B 允许保留这部分文字(它是 canvas-design 美学的组成部分),不再强制禁用。三条边界必须守住:
(a) canvas 自带文字只许落中部视觉区(约画面 26%–74%),不得侵入上 26% / 下 28% 的会议信息区;
(b) canvas 文字只能是装饰性 / 抽象表达(主题词点缀、sculptural label、细瘦英文小标等),
严禁出现真实会议信息——俱乐部名、场次、地址、时间、嘉宾名一律不进 canvas,仍由 PIL 叠;
(c) Step 7 的 PIL 只在上下留白区放会议信息,与 canvas 文字天然分区、不重叠;
若某次构图里 canvas 文字意外进入信息区,以 PIL 信息为准(重出该区域或让 canvas 文字退让)。
- 预留上下留白区:上 26% / 下 28% 必须留空供 PIL 放俱乐部名 / 主题 / 地址 / 时间,
中部留给 canvas-design 的视觉表达(含其文字)。
- 交付 PNG 直接当overlay_text.py --bg的输入,继续 Step 7 / Step 8。 - 路径 B 同样要跑 Step 9 文字越界检测(对 canvas 输出也用差分法核验留白区是否被破坏)。
> 路径 B 出的是"背景",不是"成品"——canvas-design 的画布只是替代了 ImageGen 那一帧背景图,
> 后续叠字、合嘉宾、越界检测与路径 A 完全一致,保证两条路径的海报信息层结构统一。
Step 4 — 填六段骨架
严格按 references/prompt-skeleton.md 的六段式与长度预算填。语序即权重,不许调换。
Step 5 — 过自检清单(不过就改,不许直接交付)
- [ ] 主题词已通过
--theme交给 PIL 渲染(不是写进 prompt 让 AI 画汉字) - [ ] S1 写了各区百分比 + 用途 + 边界
- [ ] 有嘉宾时:S1 写了右侧人物位,S6 禁了人物
- [ ] S6 负向约束完整禁文字、不留例外口子(主题字已交给 PIL,画面须 100% 无字)
- [ ] 五要素齐全:构图 / 色彩 / 风格 / 细节 / 灯光
- [ ] 总长 150–300 中文字(超了砍形容词,不砍分区与意象)
- [ ] 无歧义词("一些""某种""大约")
- [ ] 色号与中文色名并列出现
Step 6 — 出图(默认执行,不用等用户额外要求)
用户要的是图片本身,所以这一步是主流程,不是可选项。
- 生成前告知积分消耗(单张约 5–10 积分;默认只出 1 张)
- 调
connect_cloud_service取clientTempToken(有效期仅约 15 分钟,每轮重新取) - 作为
tempKey传给ImageGen:size直接填目标画布尺寸(如1080x1440),quality="high"
- 模型会把边长对齐到 64 的倍数(实测1080x1440→ 实际输出1072x1440),比例几乎不变
- ⚠️ 不要生成 1024x1536 再 cover 到 3:4:会纵向裁掉 180px,留白区随之上移,导致文字压到意象上(实测事故) - 默认只出 1 张。选定一个意象方向,叠字后交付——只给背景图用户无法判断成品效果
- 用户明确说要多版挑选时,才出 3 张不同方向的候选并全部叠字 - 出图后跑「文字越界自动检测」(见下),越界的重生成,不要硬交付——只出 1 张时这条更关键,没有备选兜底
- 垂直元素(光柱、台阶、向上的光束)天生容易画超高。若某张顶部侵入留白区,改用水平带状构图重写 prompt(实测有效:垂直光柱侵入到 y=239,改横向带后 0% 侵入)
Step 7 — 叠会议信息
跑 scripts/overlay_text.py。主题大字用 --theme 交给 PIL 渲染,背景图保持无字,避免重影与错别字。
python overlay_text.py \
--bg bg1.png --out poster_1.png --canvas 1080x1440 \
--club "<俱乐部全称>" --theme "<会议主题>" --slogan "<标语,可省略>" \
--session "第 N 次会议" --time "X月X日(周X)H:MM-H:MM" --address "<地址>"
--canvas指定目标画布:背景图按 cover 模式等比铺满(不变形、不留白、居中裁切),
任意尺寸的背景图(包括用户自己的照片)都能稳定铺满;不填则用背景图原始尺寸- 头马 logo 默认自动贴左上角(可选:平台未打包 logo 图片,放你自己的
assets/toastmasters_logo.webp/.png/.jpg即自动启用;2026-09 用户原提供的是透明 PNG,
透明底 RGBA,高 6.2% 画布、左边距 3.5%,等比缩放)——每张海报都要有,无需用户交代;
换 logo 用--logo 路径,不要时用--no-logo。顶部文字自动为 logo 让出两侧宽度。
右上角留白给二维码(暂无固定素材,用户给了再贴) - 信息条文字按背景亮度自动取色(暗底白字/亮底深字)——金蓝嘉宾风是暗底,写死深色会看不清
- 有分享嘉宾时加
--guest(信息条改左右两列),背景花时加--plate
Step 8 — 合成嘉宾照片(有嘉宾时)
跑 scripts/composite_guest.py。三分支自动判断素材(透明底 / 纯色底 / 杂乱底),按 references/guest-compositing.md 的「不突兀六原则」处理。
Step 9 — 文字越界自动检测(出图后必做)
绘图模型不会严格遵守"留白区"约束,常把意象画进预留区。靠肉眼不可靠(且当前模型读不了图),用这个方法程序化检测:
import numpy as np
from PIL import Image
a = np.array(Image.open(p).convert("L")).astype(float)
H, W = a.shape
rowmed = np.median(a, axis=1) # 每行中位数 = 该行底色基准
ink = np.abs(a - rowmed[:, None]) > 42 # 偏离底色即视为"内容"
top_lim, bot_lim = int(H * 0.26), int(H * 0.74) # 留白区边界
tr = np.where(ink[:top_lim].sum(axis=1) > W * 0.012)[0] # 上部区内容行
br = np.where(ink[bot_lim:].sum(axis=1) > W * 0.012)[0] # 下部区内容行
判定标准(1080×1440 / 1024×1536 实测值):
- 上部区内容应止于 y≈303(俱乐部名+主题+标语三行),止于 398 说明背景意象侵入了留白区 → 该张重生成
- 下部区内容应在 y≈1270–1370,触及 1516 说明压边
- 三张检测值应基本一致;某张明显异常就是那张的图有问题
> 这个方法救过一次真实事故:第 263 次海报的第三张,光束柱顶部侵入上部留白区(y 320–398 有内容,另两张止于 303),重生成后修复。
升级版:差分法(更准,推荐)。上面的方法会把背景元素误判成文字。用「成品 − 纯背景」求差,得到真正的文字区域:
# 先生成一张不叠字的纯背景:overlay_text.py --bg bg1.png --out co1.png --canvas 1080x1440
diff = np.abs(fg - bg) > 30 # 文字 = 成品独有的内容
trows = np.where(diff[:int(H*0.26)].sum(axis=1) > W*0.01)[0] # 上部文字行
brows = np.where(diff[int(H*0.74):].sum(axis=1) > W*0.01)[0] # 下部文字行
再算文字区的背景复杂度——这才是可读性的真正指标:
bmed = np.median(bg, axis=1); bink = np.abs(bg - bmed[:, None]) > 42
seg = bink[trows.min():trows.max()+1]
noise = seg.sum() / seg.size # < 3% 说明文字压在纯净留白上,清晰可读
判据:noise < 3% 通过。实测三张均为 0.00%,而仅用单行法会误报 poster_2/3 不合格。
Step 10 — 交付
① 成品海报 PNG(默认 1 张,主交付) ② 分层 PNG(背景 / 文字 / 嘉宾分开存)
交付格式
主交付:成品海报 PNG,直接 present_files。
回复正文只写三件事:
- 每张是什么意象(一句话,配合图片本身)
- 会议信息核对表——把从接龙抽出的俱乐部 / 场次 / 时间 / 地址 / 嘉宾列出来,让用户一眼发现抄错的地方
- 需要用户决策的点(选哪张、要不要加嘉宾、要不要改配色)
禁止出现在回复里:ImageGen 的 prompt 原文、即梦参数、六段骨架、提示词文本。
(这些是内部参数,用户明确表示不要。)
【可选附录】只有用户明确说"要即梦提示词"时,才额外输出:
【主提示词】<150-300 字>
【即梦参数】比例 3:4 · 精细度 高 · 生成 4 张
【分区示意】上 26% / 中 46% / 下 28%(与 LAYOUT 常量一致)
参考文件
| 文件 | 何时读 |
|---|---|
references/style-library.md |
每次出图前必读——按主题与场合选风格卡(金蓝嘉宾风/新国潮/全景活动日) |
references/prompt-skeleton.md |
每次填提示词前必读 |
references/theme-visual-map.md |
确定主题意象时 |
references/club-profiles.md |
需要官方配色 / 品牌规范,或查询已存档俱乐部时 |
references/guest-compositing.md |
有分享嘉宾时必读 |
references/jimeng-notes.md |
用户问即梦参数 / 出图效果不好时 |
assets/examples.md |
拿不准写法时对照 |
scripts/parse_activity.py |
Step 0:输入是「活动信息」而非接龙时必跑 |
scripts/overlay_text.py |
Step 7 |
scripts/composite_guest.py |
Step 8 |
references/luminous-convergence.md |
路径 B:可套用/改写的设计哲学范例(科技感 + 人文温度类主题) |
相关技能
| 技能 | 何时用 |
|---|---|
canvas-design(视觉设计) |
路径 B:要艺术质感更强、主题世界观更统一的背景时使用(详见 Step 3.5)。它负责产出"背景帧",不负责叠会议信息 |
Python 环境
统一用隔离 venv 的解释器:
C:/Users/Administrator/.workbuddy/binaries/python/envs/default/Scripts/python.exe
(不要用 .../versions/3.13.12/python.exe,其 site-packages 会被环境重置清空)
已装:Pillow、python-pptx、openpyxl、rembg、onnxruntime。
中文字体:C:\Windows\Fonts\msyhbd.ttc(微软雅黑 Bold,默认)、msyh.ttc、simhei.ttf、simkai.ttf(楷体)。执行前先 os.path.exists 校验。