Back to skills
SKILL.md
Douyin Cover Generator
ASecurity抖音高点击封面生成(夜场光场 v2)。输入任意视频稿件或主题,产出 3:4 竖版与 4:3 横版两张封面:暗场分层光、光隐喻场景(门槛/光轮/光束)、超粗中文标题吃满画幅、白与金双色分层、一枚红印章压紧迫感。纯代码渲染(HTML+Canvas+playwright-core 截图,与视频制作管线同栈),零外部生成能力依赖。触发词:抖音封面、生成封面、视频封面、爆款封面、横版竖版封面、封面设计、做封面。
- 2 stars
- 0 votes
- 0 copies
- 2 views
- Added October 16, 2026
Works with
Security analysis
100/100Pro scans all 5 files and shows the line behind each finding
npx -y skills add JustChenk/vibe-video-skills --skill douyin-cover-generator --agent claude-codeAre you the author of Douyin Cover Generator?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/justchenk-douyin-cover-generator)---
name: douyin-cover-generator
description: 抖音高点击封面生成(夜场光场 v2)。输入任意视频稿件或主题,产出 3:4 竖版与 4:3 横版两张封面:暗场分层光、光隐喻场景(门槛/光轮/光束)、超粗中文标题吃满画幅、白与金双色分层、一枚红印章压紧迫感。纯代码渲染(HTML+Canvas+playwright-core 截图,与视频制作管线同栈),零外部生成能力依赖。触发词:抖音封面、生成封面、视频封面、爆款封面、横版竖版封面、封面设计、做封面。
agent_created: true
---
# 抖音封面生成 · 夜场光场 v2
## 概述
输入一份视频稿件(或主题要点),产出两张封面:**3:4 竖版(1080×1440,主交付)+ 4:3 横版(1920×1440)**。渲染全部由代码完成——HTML + Canvas 2D + playwright-core 截图,与 handdrawn-explainer-video 的 `render.js` 同栈、同依赖、同 Chromium 探测逻辑。
**硬性约束:禁止调用 ImageGen / VideoGen 等外部生成能力**(不可迁移、消耗额度)。封面视觉只能来自:① 程序化场景(本 skill 内置 4 种);② 用户自有素材(视频抽帧、产品图,经引擎调色压进同一套夜色)。
> v2 是对 v1「大字报 + 红块徽章」视觉语言的整体重构:不再用描边、色块、圆环角标,改为**用光搭结构、用字压画面、用细节做质感**。旧参数大部分可平滑迁移,见文末《v1 → v2 迁移》。
## 风格内核(六条铁律,违反任何一条都不算这套风格)
1. **暗场不黑**:五段墨色渐变(#05060C→#0A1022→#0B1226→#070A15→#03040A)+ 三层大气光(暖金主光、冷蓝副光、紫外补光)+ 暗角 + 胶片颗粒。背景永远不是一块死灰,放大能看到光在空气里。
2. **光即隐喻**:一张封面**只允许一个光的结构**,且必须和文案说的是同一件事——说「门槛」就画一道封死的横栏,说「周期」就画行星边缘,说「情绪」就画一束斜光。不要两种光拼盘。
3. **字是主角**:中文标题两行硬碰、吃满画幅 **86%** 宽度、逐字加宽字距(0.058em)。**不用描边**——描边是廉价感的来源,对比靠暗投影 + 金色光晕建立。
4. **双色分层**:常规行冷白(#F2F6FF→#C3D3EC 竖向渐变),强调行金(`--accent-color`,默认 #FFC53D)。金色必须走两道:先用大 `shadowBlur` 糊一层晕,再叠实体渐变——这是「发光」和「贴一块黄」的区别。
5. **一枚印章**:全图唯一的高饱和色,歪 3°,双线框,只放 4 个字(期限作废 / 全系列 / 别错过)。它替代 v1 的红色徽章,负责紧迫感,不负责信息量。
6. **编辑暗号**:页眉细竖条 + 系列名、右上 EP 徽标、标题下方两段细线夹菱形、门槛上方 mono 技术标注、四角裁切标记、256px 胶片颗粒。这些细节在缩略图里看不见,但决定了「设计过」还是「套模板」。
## 版式规范
### 竖版 3:4(1080×1440,主力交付)
| 元素 | 位置(占画幅) | 说明 |
|---|---|---|
| 页眉 | 基线 7.5% 高,左 8.5% 宽 | 金色细竖条 + 系列名,字号 2.1% 高 |
| EP 徽标 | 右上,宽 8.2% 高 | 细边框 + 等宽字,`--issue "EP.31"` |
| 标题块 | 中心 36.5% 高 | 1–3 行,字号由宽度与块高共同决定 |
| 细分隔 | 55.3% 高 | 两段细线(各占 10% 宽)+ 菱形 |
| 门槛/场景 | 66.8% 高 | threshold 场景的横栏位置 |
| 副标题 | 基线 90.3% 高 | 居中,字号 5.2% 高,后面可接印章 |
- 标题最大宽度 86% 画幅;单行上限 20% 高,两行上限 30% 高(`AUTO`:行数越多字号越小)
- 标题区与副标题区之间的中段是**留白区**,由光结构占据;不要往里塞第三行小字
- 底部 76% 以下会压暗,保证副标题永远可读
### 横版 4:3(1920×1440)
同一套中轴构图,只做三处调整,**不做左文右图**(v1 的左对齐版式已废弃):
- 标题块中心提到 35.3% 高,单行上限升到 23.5% 高(宽画幅能吃更大的字)
- **副标题上移到 62.5% 高**(门框上方),因为 4:3 没有足够高度让「标题—门槛—光路—副标题」竖着排
- 门槛下移到 74.5% 高,光路铺满底部 25%
> 竖版先渲染、先自检;横版只换 `--ratio`,构图逻辑完全一致,不做视觉二次设计。
### `--layout brand`(系列名入标题块首行)
系列化运营时用:`kicker` 作为标题块第一行(冷白,0.76 倍字号),片名作为后续行(末行金色)。**系列名在 10 字以内**,超过就先拆词。片名不会被压成小字,因为两行共用同一套字号解算。
### 安全区
- 竖版顶部 0–7%:平台可能压标题,页眉是最小可牺牲元素
- 竖版底部 90% 以下:抖音右侧点赞列、底部文案区,**印章与副标题不要贴到 95% 以下**
- 主体(人物/产品)避开右侧 15% 竖条与底部 12% 横条
## 场景选型(一图一光)
| `--scene` | 光的结构 | 适合的稿件 |
|---|---|---|
| `threshold`(默认) | 12 条光路从同一道封死的横栏向外散开 | 路径/门槛/期限/选择/避坑/规则类 |
| `orbit` | 一枚行星的边缘横贯画面,边缘有 12 根刻度 | 周期/命运/时间/认知/复盘/长期主义 |
| `beam` | 一束斜穿画面的体积光 + 尘埃 + 光刃 | 情绪/故事/观点/反常识(标题即全部信息) |
| `plain` | 只有夜、星、光斑,没有结构 | 金句/极简/用 `--bg` 图片当场景时 |
选型规则:**先问「这条视频在讲什么结构」**——有「过关/设限」就门槛,有「循环/时间」就光轮,只有情绪就光束,什么都没有就纯暗场。拿不准一律 `threshold`。
## 文案规范
- **主标题 8–12 字,必须用 `\n` 断成两行,每行 4–6 字**。两行拿到的是 178px 字号,一行只拿到 110px——这是缩略图可读性的全部差别
- 断行位置自己定:优先在语义停顿处断(「十二条路 / 门槛写死了」),不要等引擎按标点自动折
- 副标题 1 句,≤16 字,补利益点或悬念,不要复述标题
- 印章 ≤4 字,选最狠的那个词(期限作废 / 全系列 / 别错过 / 已过期)
- 页眉系列名 ≤10 字;EP 号写成 `EP.31`
- **不要写「点击查看」「必看」这类空话**——钩子要来自内容本身的反差或期限
## 执行流程
### 第 1 步:解析稿件
提取主题、冲突、结果、主体、关键词。定标题(8–12 字,两行)、副标题(≤16 字)、印章(≤4 字)、系列名与 EP 号。
### 第 2 步:选场景与强调色
按上表选 `--scene`;强调色默认金 `#FFC53D`,工程/科技类可换青 `#6FE3FF`,警示类可换红 `#FF5A3C`(此时印章改用同色系深一档,避免两个红打架)。
### 第 3 步:渲染(竖版优先)
```bash
# 竖版 3:4(主交付):门槛场景,两行标题 + 印章
node scripts/render-cover.js \
--title $'十二条路\n门槛写死了' --subtitle "18 岁之后" --stamp "期限作废" \
--kicker "人生高性价比指南" --issue "EP.31" --note "12 PATHS · ONE THRESHOLD" \
--scene threshold --ratio 3:4 --out 封面_竖版3x4_十二条路.png
# 横版 4:3:只换比例,构图自动重排
node scripts/render-cover.js \
--title $'十二条路\n门槛写死了' --subtitle "18 岁之后" --stamp "期限作废" \
--kicker "人生高性价比指南" --issue "EP.31" \
--scene threshold --ratio 4:3 --out 封面_横版4x3_十二条路.png
```
> `--title` 里的 `\n`:bash/zsh 用 `$'第一行\n第二行'`,PowerShell 用双引号里的 `` `n ``,或直接写 `--config` JSON(JSON 里写 `\n`)。直接写 `"第一行\n第二行"` 会把 `\` 和 `n` 印到画面上,渲染完必须读图确认断行。
**用成片抽帧当背景**(画面字少、主体明确时才推荐):
```bash
tools/ffmpeg.exe -ss 5 -i 成片.mp4 -frames:v 1 frame.png
node scripts/render-cover.js --title $'买球鞋\n先看这三点' --subtitle "实测 30 天的结论" \
--kicker "装备测评" --issue "EP.05" --bg frame.png --darken 0.55 \
--scene plain --ratio 4:3 --out 封面_横版4x3_球鞋.png
```
图片背景会自动做:居中裁切 → 冷调 multiply 压色 → 压暗 → 上下 scrim → 标题后方暖光。**画面里已经有大字幕/贴纸的帧不要用**,会和封面标题打架。
### 第 4 步:自检(必须真的看图)
把成图缩到 **1/4(竖版 270×360)**,逐条过:
1. **3 秒测试**:缩到 270px,金色那行还认得出来吗?认不出就是字不够大或断行不对
2. **主次测试**:第一眼读到的是钩子吗?如果先读到系列名,改用 `--layout brand` 或把系列名降到页眉
3. **颜色测试**:全图是不是只有三种颜色(冷白、金、印章红)?出现第四种就是跑偏
4. **光测试**:画面里只有一个光结构吗?两个就是拼盘
5. **细节测试**:放大到 100%,能看到颗粒、裁切标记、mono 标注吗?看不到就是忘了开收尾层
### 第 5 步:交付
先竖版后横版,先放图后补说明。每张配 1 句设计逻辑(≤50 字,说清「光在表达什么」)。命名:`封面_竖版3x4_<主题>.png` / `封面_横版4x3_<主题>.png`。
## render-cover.js 参数
| 参数 | 说明 |
|---|---|
| `--title` | 主标题(必填)。**用 `\n` 断成两行,每行 4–6 字**;>9 字未断行会自动折两行并压小字号 |
| `--subtitle` | 副标题,≤16 字。竖版底部居中 / 横版 62.5% 高居中;超长会先压字号、再挤掉印章 |
| `--stamp` | 印章文字(≤4 字),全图唯一高饱和色。别名 `--tag` |
| `--kicker` | 系列/栏目标识(≤10 字),进页眉;`--layout brand` 时进标题块首行 |
| `--issue` | 右上角徽标,如 `EP.31`。旧参数 `--badge 34` 会自动映射为 `EP.34` |
| `--note` | 门槛上方的 mono 技术标注(全大写英文/数字,1 行,可省略) |
| `--scene` | `threshold`(默认)/ `orbit` / `beam` / `plain`。旧 `--style` 名仍可用(dazibao→threshold、glow→orbit、rays→beam、grid→plain) |
| `--layout` | `title`(默认,片名当主角)/ `brand`(系列名入标题块首行、片名降 0.76 档) |
| `--accent-line` | 哪一行用金色:`last`(默认)/ `first` / `all` / `none` |
| `--accent-color` | 强调色 / 金色,默认 `#FFC53D`。别名 `--title-color` |
| `--base-color` | 常规行冷白,默认 `#F2F6FF` |
| `--subtitle-color` | 副标题色,默认 `#E9F0FF` |
| `--stamp-color` | 印章色,默认 `#FF5A3C`。别名 `--tag-color` |
| `--ratio` | `3:4`(默认,1080×1440)/ `4:3`(1920×1440)/ `9:16` / `16:9` / `1:1` |
| `--size` | 自定义画布 `WxH`(覆盖 `--ratio`) |
| `--bg` | 背景图路径(自动居中裁切 + 冷调压色 + 压暗) |
| `--darken` | 背景压暗系数,默认 0.35(图片背景建议 0.45–0.6) |
| `--no-scrim` | 关闭背景图的上下渐变压暗 |
| `--font` | 自定义字体族(默认:微软雅黑 → 苹方 → Noto Sans SC / 思源黑体,weight 900) |
| `--config` | 从 JSON 文件读配置(CLI 参数优先) |
| `--out` | 输出 PNG 路径(必填) |
环境依赖:playwright-core(不下载浏览器);Chromium 自动探测(CHROME_PATH → ms-playwright/puppeteer 缓存 → 系统 Chrome/Edge → agent-browser 缓存)。
## 常见失败与修法
| 症状 | 原因 | 修法 |
|---|---|---|
| 标题很小、四周很空 | 一行塞了 10+ 字,被宽度压扁 | 用 `\n` 断成两行,每行 4–6 字 |
| 金色发「脏」、像贴纸 | 只做了一层纯色填充 | 引擎已内置双层光晕;不要用 `--accent-color` 传低饱和的土黄 |
| 画面花、看不出重点 | 两个光结构同时上(比如门槛 + 光轮) | 删掉一个,一图一光 |
| 副标题被挤掉 / 印章消失 | 副标题过长,引擎按规则舍弃了印章 | 副标题压到 16 字内 |
| 缩略图糊成一团 | 金色光晕过大 / 字号不足 | 增大字号(断行)、缩小 `--note` 或去掉 |
| 图片背景永远发灰 | 抽帧本身字多、对比低 | 换 `--scene plain` 程序化暗场,或换一帧主体清晰的画面 |
## v1 → v2 迁移
| v1 参数 | v2 处理 |
|---|---|
| `--tag` | 映射为 `--stamp`(印章),语义不变 |
| `--badge <数字>` | 映射为 `--issue "EP.<数字>"` |
| `--style dazibao/glow/rays/grid` | 映射为 `--scene threshold/orbit/beam/plain` |
| `--title-color` / `--tag-color` | 映射为 `--accent-color` / `--stamp-color` |
| `--bar-color` `--stroke-color` `--fx` `--no-shadow` | **已移除**:v2 不用色块与描边,传了会提示并忽略 |
| `--title-scale` `--kicker-scale` `--tag-scale` | **已移除**:字号由宽度与块高自动解算,不再需要倍率 |
| `--badge-caption` `--badge-y` `--badge-scale` | **已移除**:v2 没有大数字徽章块,EP 徽标固定在右上 |
## Resources
### templates/
- `cover.html`:画布页面(加载 cover.js)
- `cover.js`:夜场光场引擎——五段墨底/三层大气光/星野/四芒星/4 种光结构(门槛·光轮·光束·纯暗场)/逐字排版/金色双层光晕/印章/颗粒暗角裁切标记;所有位置都是画幅比例,换比例自动重排。确定性随机种子,同配置输出稳定可复现
### scripts/
- `render-cover.js`:渲染 CLI。参数解析 → 旧参数映射 → Chromium 探测 → playwright-core 截图 → PNG
Files in this skill
- README.md
- SKILL.md
- scripts/render-cover.js
- templates/cover.html
- templates/cover.js
Attribution
Related skills
View all in ai-agents →Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.