Comic Master — 工具集
与 comic-master 配合使用。那个技能定义了页面“好”的标准;而这个技能则负责实现这些标准所需的工具。大多数糟糕的文字排版都源于糟糕的工具:手绘的栅格椭圆、系统字体以及直接平贴在画稿上的文本。
1. 使用 ComfyUI 制作画格
ComfyUI 本身的运行(安装模型、启动、运行模板和工作流)属于本仓库根目录 vendor/comfy-cli-skills/ 中的通用 ComfyUI 技能所涵盖的内容。本节将介绍如何将它们用于漫画制作。
1.1 漫画项目的生成设置
- 每个项目两个工作流: 一个用于文本到图像(生成新画格),另一个用于图像编辑(修复连续性、匹配镜头和道具文本)。选定一个模型和固定设置后,将其记录在项目圣经中。
- 一个画格 = 一个任务 = 一张保存的图像。 每个画格都可追溯至其提示词、种子和设置。
- 根据布局决定渲染尺寸,而非相反。 根据缩略图中画格的边界框,以大约 1 兆像素的分辨率按该宽高比渲染(例如,宽幅 1408×704,竖幅 768×1024,长条 1536×640)。然后缩放或裁剪至边界框内,确保故事关键细节远离裁剪边缘。
- 按场景分批处理,而非按页面。 这样可以使同一个场景中各个画格的光线、色调和背景保持一致。
1.2 一致性
- 先建角色设定表。 为每个角色生成转面和表情表,选择最佳结果,并将其作为参考图像(IP-适配器、图像编辑输入或角色 LoRA,如果你能训练一个的话)重复使用。
- 固定锚点(来自 comic-master 的
comic-characters.md§4.5):在每个提示词中从头到尾逐一列举,从左到右;为整个项目提供一个风格锚点。 - 种子: 记录每个被采用画格的种子,以便日后能够重新生成或进行变体。
- 姿势控制: 在需要控制画面布局(如说话者顺序、视线方向、180 度线)时,使用 OpenPose 或深度 ControlNet。
1.3 持久有效的提示词规则
- 了解反向提示词是否有效。 蒸馏模型(如 FLUX.2 klein、Z-Image-Turbo)在 CFG 1 下运行时通常忽略反向提示词。对于这类模型,应正向描述你想要的内容(例如“恰好四个人”、“放松平滑的眉毛”)。仅在使用真实 CFG 运行的模型上使用反向提示词,或添加负向引导节点(例如 NAG)。
- 使用模型的语言写提示词。 FLUX 和 Qwen/Z-Image 理解自然语句;SDXL 理解逗号分隔的标签。对于语句模型,使用固定顺序:镜头和角度 → 每个角色及其位置(从左到右) → 一个动作 → 作为解剖结构的表情 → 环境 → 光线 → 风格。
- 将表情描述为解剖结构,而非名称。 “无聊”往往会产生皱眉的效果。应该这样描述:“上眼睑半垂,眉毛高挑而平坦,嘴巴紧闭成一条直线”。如果反向提示词有效,也要反向提示失败的情况(例如“皱起的眉头,怒视”)。
- 服装颜色应包含在提及身体部位的从句内。(例如“肩膀上的海军蓝紧身衣”)。特写镜头容易倾向于使用通用颜色;在反向提示词中提示这种偏移。
- 无重复: 每个角色一个锚点,明确数量和顺序(例如“恰好三个人:从左起…”),并且在反向提示词有效的情况下,加入“重复角色、克隆、多余人物”。
- 在提示词中预留文字空间。(例如“上部三分之一是空白的平整墙壁”)。要求得到干净、没有文字的图像(在反向提示词有效时使用“无文字、无字母、无对话框”;否则使用正向描述,如“没有任何文字排版的干净图像”),除非是在特意进行道具文本编辑时。
- 从缩略图开始规划。 将缩略图转换为粗略的布局草图(火柴人、家具方块),并将其作为姿势、线稿或深度控制图像输入,从而让角色摆放、比例和场景元素遵循计划。
- 生成多个,挑选一个。 每个画格渲染 3-4 个种子,并根据画格的“目标”(GOAL)和锚点进行选择,之后再进行文字排版。
1.4 编辑而非重新生成
使用现有画格作为输入,运行图像编辑工作流:
- 匹配画格(同一房间、重复笑点、反应镜头):将早期画格调色至新画格,而非从头生成。
- 移除比重组更可靠。 “移除桌子旁的第三个人” 可行;“把他移到椅子后面” 通常失败。
- 连续性修复: 多余的路人、错误的服装颜色、错误手中的道具。仅对该区域进行修补或编辑。
- 道具文本(§4):徽章或标牌上的简短文字,需在 1:1 比例下检查。
1.5 排版前的审查
- 将每个渲染结果与其锚点和画格的“目标”进行比较:面部、服装颜色、道具和手部、光线方向、多余人物、多余字形、空的文字区域。
- 为每个画格保留日志(提示词、种子、设置、通过或拒绝及其原因),以便修复工作可以再现。
1.6 推荐模型配置
8 GB 显存(默认可用配置):
| 任务 | 模型和文件 | 备注 |
|---|---|---|
| 画格和编辑 | FLUX.2 [klein] 4B fp8 (flux-2-klein-4b-fp8) + qwen_3_4b 文本编码器 + flux2-vae | 约 4 步,CFG 1。编辑模式可使用参考图像(角色设定表)来保持角色一致。Apache-2.0 许可证。 |
| 高质量单画格、道具文本 | Z-Image-Turbo int8 (z_image_turbo_int8_convrot) + qwen_3_4b_fp8_mixed + ae.safetensors | 模板 image_z_image_turbo_int8;约 8 步。更好的文字和指令跟随能力;不支持参考图像编辑。通过 Z-Image-Turbo Fun Union ControlNet 模板实现姿势/深度控制。Apache-2.0 许可证。 |
| 布局控制 | SDXL + OpenPose ControlNet + IP-适配器 | 在 8 GB 显存下提供最成熟的姿势和布局控制;结果可在 Klein 中精修。 |
| 角色抠图 | comfyui-rmbg 配合 BiRefNet toonout(专为卡通和插画设计)或 RMBG-2.0 | 用于下文的分层工作流。 |
| 放大 | 4x-UltraSharp,分块处理 | 以约 1 兆像素渲染,然后放大至打印尺寸。 |
在 8 GB 显存下:使用 fp8/int8/GGUF 权重;显存紧张时将文本编码器移至 CPU 或第二块 GPU;对大图像使用分块 VAE 解码;一次只加载一个模型;将任何本地 LLM 放在不同的 GPU 上。
分层角色: 每个角色在纯平背景上单独生成,然后抠出(使用 BiRefNet toonout),最后合成到每个场景的共享背景上。这解决了单纯通过提示词无法解决的角色摆放、比例和场景包含问题,并允许道具在不同画格中保持相同大小。
拥有更多显存时: FLUX.2 [klein] 9B(约 20 GB;非商业用途),Qwen-Image-2.1(约 24 GB;10 张参考图像,透明 RGBA 输出,蒙版编辑;研究许可证),FLUX.2 [dev](fp8 下 24 GB+;顶级质量和多参考能力;非商业用途)。在商业使用前检查每个模型卡的许可证;上述 8 GB 配置均为 Apache-2.0 许可证。
2. 文字排版引擎:绘制矢量,而非像素
2.0 使用文字排版工具(默认)
不要编写文字排版代码。请使用 scripts/letterer.py,该脚本随本技能文件夹一起提供(位于此 SKILL.md 旁边),同时还有 scripts/README.md、scripts/styles.json 以及 scripts/fonts/ 中的批准字体。路径相对于此 SKILL.md 解析,无论仓库克隆到何处;切勿将脚本复制到项目中。它已经遵循了本节中的所有规则,并会自行运行第 5 节中的 QA 检查。要求:Python 3.9+ 及以上版本,并安装 Pillow 和 numpy(pip install -r scripts/requirements.txt);建议安装 mediapipe,它可以启用自动面部检查(对话框必须避开面部)和 "tail_to": "auto"。
工作流:
- 运行
python scripts/letterer.py grid --image panel_or_page.png --out grid.png并查看叠加显示。读取画格矩形、每个说话者头部框和嘴巴,以及空白区域。然后根据 comic-master 中comic-lettering.md§12.2 的放置规则和 §12.7 的分步程序,选择每个对话框的位置和尾部瞄准点:对话框位于头部附近的空白空间,尾部指向嘴巴但末端位于头部之外。所有坐标都是相对的:从左上角算起 0.0–1.0。 - 编写一个页面规范(JSON),其中的项目按阅读顺序排列:
{
"image": "strip.png", "out": "strip_lettered.png",
"panels": [[0.0125,0.03,0.329,0.97], [0.342,0.03,0.658,0.97], [0.671,0.03,0.988,0.97]],
"avoid": "faces_mask.png",
"items": [
{"style": "declaration", "text": "城市在召唤。我回应。", "zone": [0.03,0.06,0.31,0.24]},
{"style": "speech", "text": "有人|听到那声音了吗?", "at": [0.46,0.30], "tail_to": [0.52,0.52]},
{"style": "sfx-micro", "text": "嗡嗡 嗡嗡", "at": [0.39,0.62]},
{"style": "sfx", "text": "哐当", "at": [0.80,0.88], "size": 2.4, "rotate": -8}
]
}
- 运行
python scripts/letterer.py page spec.json。返回码0表示所有 QA 检查通过;1表示已渲染但 QA 失败,因此请阅读打印的失败信息,修正规范(将对话框移近说话者、放大区域、删减文字、使用|重新换行)并重新运行;2表示错误(未知风格、缺少字体、规范格式错误)。 - 全尺寸以及缩略图形式查看 PNG。将 SVG 文件(可编辑)和
_qa.json(测量数据)与页面一起保留。
项目字段: style;text(| 强制换行,否则自动排成菱形;用 _word_ 加下划线表示强调);at [x,y] 中心点 或 zone [x0,y0,x1,y1] 适合内部;tail_to [x,y] 瞄准点:不是嘴巴本身,而是头部外部的空白空间中的一点,位于从对话框到嘴巴的连线上,距离面部约 1 个字符高度(工具会使其尖端在略短于此距离处停止,因此尾部指向说话者但不会触碰到他们);省略该字段或使用 "no_tail": true 则无尾部。不要使用 "auto":它会返回嘴唇本身;可选字段 panel 索引、size 乘数、rotate(度数,顺时针)、fill(背景色)、ink(轮廓色)、text_color(文字颜色)、font(字体)、tail_bend(尾部弯曲度)、link(同一说话者先前对话框的索引:将两者连接起来)、bleed(true 表示有意突破画格边框)、seed(种子)。
页面基础字段之外: defaults 为所有项目设置颜色和字体({"fill": "#FDF6E3", "ink": "#2B2B2B", "text_color": "#1F3A7A"});styles 为此页面覆盖一个样式({"speech": {"fill": "#FFF7D6"}});avoid 默认为 "auto"(检测到的面部受到保护),或者一个蒙版图像,或者 false。
一次性地在单个 page 运行中对已组装的页面或长条进行排版,切勿逐格操作。 单次运行可使跨画格的文字排版大小保持一致,并让 QA 能够检查整个页面的阅读顺序和重叠情况。
页面字段: image、out/svg/qa 路径、panels(强烈建议:用于边距、阅读顺序和文字大小)、ch(以像素为单位的字符高度;默认为中间画格短边的 1/30,各处一致)、avoid(白色 = 必须避开的面部、手部或关键动作;通过分割通道构建)、direction(ltr,或漫画的 rtl)。
样式(运行 python scripts/letterer.py styles 查看包含一句话说明的实时列表):
- 对话:
speech、speech-hand(手绘风格、斜体、弯曲的尾巴)、emphasis(强调线;使用_word_加下划线)、whisper(虚线)、strain(颤抖的轮廓,淡黄色:从牙缝里挤出的字)、electronic(锯齿形尾巴)。 - 思维:
thought-1(=thought,蓬松云朵)、thought-2(细扇形)、thought-3(平滑椭圆带气泡)。如有疑问,请使用thought-1:当要求使用思维框但未提供更多细节时,此为默认样式。思维轨迹至少在气球与其瞄准点之间需要 2.5 字符高度的空白空间,否则 QA 将判定失败。参见 comic-master 的comic-lettering.md§12.8。 - 大声:
shout、shout-2(手绘爆发框)、burst(无尾部)。 - 框体:
caption、caption-hand、declaration和declaration-hand(引用的旁白;在一页中堆叠数个以形成独白)、locator、narrator。 - 音效:
sfx(靠近声源,带细白色外轮廓)、sfx-micro(小声音)、sfx-stack(重复的声音堆叠在声源旁边:例如"wub|wub|wub")。
每本书只保持一种对话风格:要么全部使用普通样式,要么全部使用 -hand 样式,不要在同一场景中混合使用。请参见仓库根目录下的 examples/styles/sheet_lettered.png 以并排查看所有样式。通过向 styles.json 添加条目来增加新样式,切勿编写新的绘图代码。
快速单个项目: python scripts/letterer.py bubble --image in.png --out out.png --text "趴下!" --style shout --at 0.17,0.25 --tail-to 0.155,0.47 --panel 0.0125,0.03,0.329,0.97
如果该工具不可用,请遵循以下规则构建等效功能,并仍然生成相同的 QA 数值。
- 使用 SVG 构建文字排版,并用 resvg、cairosvg 或无头 Chromium(Playwright)渲染。矢量提供平滑的曲线、真实的字距、清晰的笔画和可编辑的图层。不要使用栅格椭圆调用来绘制对话框。
- 使用真正的漫画字体。
- 对话:Comic Neue、Patrick Hand、Anime Ace 或其他手写风格的字体,全部大写,整部作品使用一种字体。
- 音效和标题:使用粗体展示字体,如 Bangers。
- 切勿使用系统无衬线字体(Arial、Helvetica、DejaVu)。如果字体文件缺失,应大声报错,而不是静默回退。
- 对话和说明文字只使用普通的、直立的手写风格字体。 不要使用显示字体、科技字体、未来风格、镂空、恐怖或新奇字体来呈现人们必须阅读的文字:缺少横杠或 E/A/M 形式刻意设计的字母会减慢阅读速度并改变氛围。装饰性字体仅用于音效、标题和标志。
- 在项目圣经中保留一份批准的字体列表(例如,对话:Comic Neue Bold 或 Anime Ace;音效:Bangers),并拒绝使用任何不在列表中的字体。
- 对话框适配文本:
- 将文本排成菱形:短首行、最宽的中行、短末行,最后一行不能只有一个单词。
- 测量文本块,并在其周围绘制一个圆角椭圆或超椭圆。
- 扩大边框,直到文本的每个角与其之间至少有 1 个字符高度的间距。
- 切勿将文本挤入固定的椭圆中。
- 尾部是弯曲的、渐细的路径,而非三角形:
- 基部约为对话框宽度的 1/8(绝不能小于约 0.8 字符高度),位于最靠近说话者的一侧。
- 长度约为对话框高度的一半(或小型气泡的 2.5 字符高度),弯曲朝向嘴巴,并且……
(后续内容被截断,但已涵盖并翻译了所提供的部分)
3. 文本检测(针对你已有的画稿)
如果你已经拥有画稿(如线稿或灰度稿)并希望添加文字排版,请在添加文字之前对自己现有的作品进行检测。这可以在你的原始艺术作品中检查字体使用情况、对话框放置和书写方向。使用 python scripts/detect.py --image your_art.png --out detected.png。此工具会检测现有文字并为其放置区域添加注释,以便 letterer.py 正确放置新文字。
3.1 检测新页面的文本区域
检测新艺术作品中的文本区域,以确保对话框正确放置。这对于已有文字的扫描页面或数字页面特别有用。
4. 道具文本
徽章、标牌、旗帜、布料纹理和计算机屏幕上的文字,应作为单独的文字排版通道处理:
- 在渲染时预留清晰、平整的表面。 在提示词中包含“空白徽章”、“空标牌”。
- 使用图像编辑工作流(§1.4) 来替换或添加文本。对于简单的短文本,可以单独渲染一个像素完美的文本图形,并将其合成到图像上。
- 通过
letterer.py的prop命令添加文本。 或者,如果难以编辑,可以使用prop模式,通过相同的 SVG 引擎生成文字。 - 在 1:1 比例下检查文本。 确保文字清晰,没有锯齿,并且与周围艺术品相比,大小和风格都合适。
5. 质量检查(QA)与页面组装
5.1 文字排版 QA
letterer.py 在每次 page 运行时自动执行以下检查:
- 阅读顺序检查: 项目按阅读顺序排列;检查连续性。
- 文字溢出检查: 文本是否适合其分配的
zone? - 面部规避检查: 对话框是否与面部区域重叠?(需要
mediapipe) - 尾部瞄准检查: 尾部是否在头部边界框外结束?
- 最小间距检查: 对话框与文本或其他对话框之间是否有足够的空白?
- 字体可用性: 所有指定的字体是否已安装且可加载?
5.2 画稿一致性 QA
- 将每个渲染图像与其模型设定表进行比较。 检查面部、服装、道具和姿势。
- 使用图像差异或结构相似性指标。 如果渲染与参考图像差异太大,标记出来。
- 检查空白绘图区域: 绘画是否意外侵入为文字预留的空间?
5.3 页面组装
- 按场景组织页面。 将相关页面分组在一起。
- 将最终组合的页面保存为高分辨率 PNG 或 PDF。 保留原始的、未编辑的艺术品图层,以便在需要时进行编辑。
- 检查页码和阅读方向。 确保页码正确,方向一致(对于右至左格式的漫画,从左到右阅读)。
6. 推荐字体与字体管理
- 使用
scripts/fonts/目录。 这里存放该项目的批准字体。 - 使用 FontForge 或类似工具管理字体。 确保你使用的字体拥有在漫画中使用所需的许可证。
- 默认字体:
- 对话:
ComicNeue-Bold.ttf(或等宽字体) - 音效:
Bangers-Regular.ttf(或类似粗体字体) - 标题:
Bangers-Regular.ttf(或类似粗体字体)
- 对话:
- 避免使用系统字体。 正如 §2 中所述,系统字体是一个常见问题,应严格避免。
7. 错误处理与调试
- 清晰的错误消息:
letterer.py会打印清晰的错误消息,指示问题所在(例如“未知样式:my_style”或“缺少字体:ComicNeue-Bold.ttf”)。 - 非零退出代码: 正如 §2.0 中所述,退出代码指示错误、QA 失败或成功。
- 日志记录: 记录每次页面运行,包括所有设置、参数以及 QA 结果(通过/失败)。
- 保持可编辑的 SVG: 在每次运行中,都会生成一个可编辑的 SVG 文件,以便进行手动调整,而无需重新运行整个过程。
8. 与 comic-master 的集成
comic-master 技能定义了你应该努力实现的页面质量标准。此工具集(comic-master-tooling)提供了自动实现这些标准的方法。它们一起工作:
- comic-master 定义了样式指南(角色、对话、页面布局)。
- 此工具集 提供了实现这些指南的工具(ComfyUI 工作流、letterer.py、检测工具)。
- QA 检查(§5) 自动验证输出是否满足 comic-master 的要求。
将这些技能一起使用,以建立专业、无缝的漫画制作流程。