AI漫剧制 | 第 27 天:漫画光影——AI生成的光影效果控制

第 27/60 天

引言

光影是漫画的「隐形主角」。同一张分镜,加上逆光轮廓、舞台聚光或黄昏斜阳,情绪可以瞬间从平淡变得戏剧化。传统漫画中,光影全靠作者手绘——打网点纸、留白高光、涂黑阴影,一张复杂光影的画面往往要耗费数小时。而 AI 漫画生成时,很多人会遇到两类典型痛点:一是关键词里写了 backlightdramatic lighting,生成结果却依然「平光平影」;二是光影风格不稳定,同一角色在不同格子里光源方向对不上,导致画面割裂。

本文覆盖三块内容:漫画光影的基础概念与常见类型、用提示词与 ControlNet 精确控制 AI 生成的光影、以及后期合成阶段的光影增强工作流。读完你将能稳定产出「有电影感」的 AI 漫画分镜。

核心概念

漫画光影的语言

漫画光影本质上是用「黑、白、灰」三种层级讲故事:

光影类型 特征 常见用途
硬光(Hard Light) 明暗交界清晰、阴影边缘锐利 戏剧冲突、战斗、恐怖
软光(Soft Light) 过渡柔和、几乎无投影 温馨日常、回忆杀
背光/轮廓光(Backlight/Rim Light) 主体边缘发亮、面部压暗 英雄登场、神秘感
舞台/聚光(Spotlight) 中心亮、四周暗 焦点强调、演讲场景
月光/冷光(Moonlight/Cool Light) 蓝紫色调、高对比 夜晚、悬疑
黄昏/暖光(Golden Hour) 橙黄色调、长阴影 浪漫、离别的情绪

AI 控制光影的四层手段

  1. 提示词层:用 lightinglight source 相关词直接描述,改动成本最低,但不可控性最高。
  2. 参考图/ControlNet 层:通过 Depth(深度图)、Lineart(线稿)约束光影明暗关系,控制力显著提升。
  3. 模型层:使用光影风格 LoRA 或光影增强脚本(如 SD WebUI 的 lighting 动态提示词、Regional Prompter),稳定复现同一风格。
  4. 后期合成层:AI 生成素图后,用 PS/脚本叠加高光、阴影、渐变,达到电影调色效果。

关键提示词词汇表

硬光:harsh lighting, strong contrast, hard shadows
软光:soft lighting, diffused light, gentle shadows
背光:backlighting, rim light, silhouette, strong back light
聚光:spotlight, stage lighting, dark background
月光:moonlight, cool tones, blue hour, high contrast
黄昏:golden hour, warm sunlight, long shadows, orange glow
反光:reflected light, bounce light, subsurface scattering

实战步骤

第 1 步:搭建环境(Shell)

推荐使用 Stable Diffusion WebUI + ControlNet 组合,也可以用 Python 的 diffusers 库做脚本化生成。以下命令在 Ubuntu 22.04 上验证通过:

# 创建虚拟环境并安装 diffusers(GPU 版本)
python3 -m venv ~/manga_light && source ~/manga_light/bin/activate
pip install --upgrade pip
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
pip install diffusers transformers accelerate safetensors opencv-python pillow

# 下载 ControlNet Depth 模型(用于光影方向控制)
mkdir -p ~/models/controlnet
wget -O ~/models/controlnet/control_v11f1p_sd15_depth.pth 
  https://huggingface.co/lllyasviel/ControlNet-v1-1/resolve/main/control_v11f1p_sd15_depth.pth

第 2 步:建立光影提示词库(JSON)

把常用光影描述做成可复用的 JSON 词库,配合脚本实现「一键换光」:

{
  "lighting_presets": {
    "dramatic_backlight": {
      "prompt": "backlighting, rim light, character silhouette, cinematic, high contrast, dramatic atmosphere",
      "negative": "flat lighting, soft light, overexposed, washed out, low contrast",
      "controlnet_depth_weight": 0.9
    },
    "golden_hour": {
      "prompt": "golden hour, warm orange sunlight, long soft shadows, glowing rim light, nostalgic mood",
      "negative": "cold tones, blue light, harsh shadow, underexposed",
      "controlnet_depth_weight": 0.7
    },
    "moonlight_scene": {
      "prompt": "moonlight, cool blue tones, strong contrast, crisp shadows, night atmosphere, stars",
      "negative": "sunlight, warm colors, bright daylight, flat lighting",
      "controlnet_depth_weight": 0.8
    },
    "spotlight_focus": {
      "prompt": "spotlight from above, stage lighting, dark vignette background, focused subject",
      "negative": "even lighting, bright background, ambient light",
      "controlnet_depth_weight": 0.85
    }
  }
}

第 3 步:用 ControlNet Depth 控制光影方向(Python)

光影本质上依赖光源位置与物体遮挡关系,Depth 图正好编码了这些空间信息。用下面的脚本把角色与「虚拟光源」的深度关系喂给 ControlNet:

import json
from PIL import Image
from diffusers import StableDiffusionControlNetPipeline, ControlNetModel, DPMSolverMultistepScheduler
import torch

# 载入预设
with open("lighting_presets.json", "r", encoding="utf-8") as f:
    presets = json.load(f)["lighting_presets"]

preset = presets["dramatic_backlight"]

controlnet = ControlNetModel.from_pretrained(
    "lllyasviel/control_v11f1p_sd15_depth", torch_dtype=torch.float16
)
pipe = StableDiffusionControlNetPipeline.from_pretrained(
    "digiplay/majicMIX_realistic_v7",  # 换成你的漫画底模
    controlnet=controlnet, torch_dtype=torch.float16
).to("cuda")
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)

depth_map = Image.open("panel_depth.png").convert("RGB")  # 由 Depth Estimator 生成

image = pipe(
    prompt=preset["prompt"] + ", 1girl, manga panel, black and white screentone",
    negative_prompt=preset["negative"],
    image=depth_map,
    num_inference_steps=28,
    guidance_scale=7.5,
    controlnet_conditioning_scale=preset["controlnet_depth_weight"],
).images[0]
image.save("panel_backlight.png")
print("OK: panel_backlight.png saved")

第 4 步:ComfyUI 光影工作流(JSON 节点片段)

在 ComfyUI 中,把「提示词 → ControlNet Depth → KSampler」串成可复用的工作流。核心节点 JSON 如下(导入 ComfyUI 后填充模型路径即可):

{
  "nodes": [
    {
      "id": 1,
      "type": "CheckpointLoaderSimple",
      "inputs": {"ckpt_name": "majicmixRealistic_v7.safetensors"}
    },
    {
      "id": 2,
      "type": "ControlNetLoader",
      "inputs": {"control_net_name": "control_v11f1p_sd15_depth.pth"}
    },
    {
      "id": 3,
      "type": "LoadImage",
      "inputs": {"image": "panel_depth.png"}
    },
    {
      "id": 4,
      "type": "ControlNetApply",
      "inputs": {
        "strength": 0.9,
        "positive": [5, 0],
        "negative": [5, 1],
        "control_net": [2, 0],
        "image": [3, 0]
      }
    },
    {
      "id": 5,
      "type": "CLIPTextEncode",
      "inputs": {
        "text": "backlighting, rim light, cinematic, 1girl, manga panel",
        "clip": [1, 1]
      }
    },
    {
      "id": 6,
      "type": "KSampler",
      "inputs": {
        "seed": 42, "steps": 28, "cfg": 7.5,
        "sampler_name": "dpmpp_2m", "scheduler": "karras",
        "denoise": 1.0,
        "model": [1, 0], "positive": [4, 0], "negative": [4, 1], "latent_image": [7, 0]
      }
    }
  ]
}

第 5 步:后期光影增强(Python + ImageMagick)

AI 生成的光影往往「半吊子」,用脚本在后期强化高光与暗角,是专业漫画家常用的方式:

# 先用 Python 提取高光通道
python3 - << 'EOF'
from PIL import Image, ImageEnhance, ImageOps
img = Image.open("panel_backlight.png").convert("L")

# 1. 提亮高光区域(阈值 200 以上的像素压白)
import numpy as np
arr = np.array(img)
highlights = np.where(arr > 200, 255, arr).astype("uint8")
Image.fromarray(highlights).save("highlights_mask.png")

# 2. 压暗暗部,增强明暗对比
enhancer = ImageEnhance.Contrast(img)
contrast = enhancer.enhance(1.25)
contrast.save("panel_contrast.png")
print("highlight mask and contrast done")
EOF

# 3. 叠加暗角(vignette)提升电影感
convert panel_contrast.png 
  ( -size 832x1216 radial-gradient:black-white -negate ) 
  -compose multiply -composite panel_vignette.png

# 4. 最后转网点风格(可选)
convert panel_vignette.png -colorspace Gray -threshold 55% panel_final.png

第 6 步:整页批处理(Shell)

分镜通常一页 4–6 格,写个循环批量应用同一光影预设,保证整页光源方向一致:

#!/usr/bin/env bash
# batch_light.sh —— 对 panels/ 目录下所有分镜应用背光预设
set -euo pipefail

for panel in panels/*.png; do
  base=$(basename "$panel" .png)
  python3 render_backlight.py "$panel" "out/${base}_backlight.png"
  convert "out/${base}_backlight.png" 
    ( -size 832x1216 radial-gradient:black-white -negate ) 
    -compose multiply -composite "out/${base}_final.png"
  echo "done: ${base}"
done
echo "ALL_PANELS_DONE"

提示:在 SD WebUI 中也可以使用「动态提示词(Dynamic Prompts)」插件,把 {backlighting|golden hour|moonlight} 做成随机骰子,批量产出不同光影的候选图再人工筛选。

常见问题

Q1:提示词写了 dramatic lighting,为什么生成结果还是平光?

模型对单个 lighting 词的响应很弱。需要「效果词 + 来源词 + 对比词」组合,例如 backlighting, rim light on hair, strong contrast, dark background;同时把 flat lighting, soft light, even lighting 写进负面提示词。也可以用 ControlNet Depth 提高结构性控制。

Q2:怎么保证同一角色在多个分镜中光源方向一致?

把光源方向固化到词库中(如统一用 light source from upper left),并在生成后脚本里统一叠加同一方向的渐变高光。另外可用「参考图 + IP-Adapter + 固定 seed」的方式,让每格都参照第一格的明暗关系。

Q3:彩色漫和黑白漫的光影控制有什么不同?

黑白漫靠「网点密度」表达亮度层级,控制重点是高光留白与阴影面积;彩色漫还要控制色温(暖光偏橙、冷光偏蓝)。建议黑白漫用 black and white, screentone, halftone 提示词,彩色漫则把色温词(warm orange / cool blue)视为第一优先。

Q4:阴影边缘出现噪点或涂抹感怎么办?

放大(Hi-res Fix / 4x Upscaler)后再做二值化,或用 ImageMagick 的 -threshold 收紧边缘;也可以在 img2img 阶段以 0.4–0.5 的 denoise 重绘一次,让阴影更干净。

Q5:可以不加 ControlNet 只靠后期调出光影吗?

可以,但效果有限。后期只能增强「已有」的光影关系,无法凭空创造光源逻辑。正确流程是:生成阶段用提示词 + ControlNet 打好光影骨架,后期只做对比度、暗角、色温等锦上添花的增强。

总结

  1. 光影是漫画情绪的核心媒介:硬光/背光/月光等不同光影类型承担不同叙事功能,选对类型比堆砌形容词更重要。
  2. 四层控制法:提示词定方向、ControlNet Depth 定结构、LoRA/预设定风格、后期合成定质感,层层叠加才能稳定复现。
  3. 词库 + 预设 + 批处理:把光影方案沉淀为 JSON 预设和 Shell 脚本,整页、整部作品的光源一致性不再是难题。
  4. 负面提示词同样关键flat lightingoverexposed 等负面词能有效阻止模型「偷懒出平光」。
  5. 后期增强公式:高光提取 → 对比度 → 暗角 → 风格化,是成本最低的「电影感」加成路径。

下期预告

第 28 天:AI漫画特效——速度线、集中线与闪光

战斗场景的速度线、情绪爆发的集中线、剧情关键格的闪光效果——这些漫画「特效语言」如何用 AI 高效生成?下期将从提示词、LoRA 与后期叠加三方面拆解。


📚 系列目录(持续更新中)

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容