← ClaudeAtlas

social-card-renderlisted

把内容做成社交平台图文卡片(小红书 / 朋友圈 / 微信群 / 公众号首图)并批量导出 PNG/JPG。核心手法是用 HTML 排 1080×1440 的卡片(保真度、字体、圆角、渐变远超 PIL 手排),再用无头 Edge + CDP 按 .card 元素逐个 clip 截图,最后 PIL 统一压缩命名。当用户说「做小红书图」「发朋友圈的图」「把这份内容做成图文」「排版成卡片图」「帖子配图」「封面图」时使用。也适用于把已有的长截图嵌入卡片做"成品展示"页。
calmsprite2001/ai-trip-guide-skills · ★ 0 · DevOps & Infrastructure · score 73
Install: claude install-skill calmsprite2001/ai-trip-guide-skills
# 社交卡片图渲染(HTML → CDP 截图 → 批量导出) ## 为什么不用 PIL 直接画 需要中文大字、圆角卡片、渐变遮罩、多级排版时,PIL 的 `ImageDraw` 要手算每个元素的坐标, 改一个字就要重算全版。**用 HTML + CSS 排,浏览器帮你做布局**,改文案只改 HTML。 代价只是多一步"截图",而这一步有稳定流程。 ## 目录约定 ``` <项目>/ <某个静态目录>/ ← http server 的根,卡片和素材都要在这里面能访问到 source/ ← 素材(图片等) cards.html ← 卡片定义,每张一个 <section class="card" id="cN"> scripts/render.py ← 起服务 + 起浏览器 + 调 render.js scripts/render.js ← CDP 协议,按 .card 截图 shots/ ← 需要嵌入卡片的原始截图(可选) final/ ← 渲染出的 PNG(1080×1440 @2x) ready/ ← 后处理(缩放 + JPG + 按发布顺序命名) ``` ## 卡片规范(小红书) | 项 | 值 | |---|---| | 画布 | `1080 × 1440`(3:4,小红书占屏最大) | | 渲染倍数 | `deviceScaleFactor:1` + `clip.scale:2` → 输出 2160×2880 | | 成品尺寸 | 缩到 **1440×1920**,JPG q90(每张 250–400 KB) | | 安全边距 | 左右各 70px,上 60–80px | | 中文粗体 | `"Microsoft YaHei"` + `font-weight:900`(Windows 自带,无需引字体) | **配色经验**(暖色调内容):奶油底 `#FDF6E8`、墨字 `#2E2A24`、强调砖红 `#B05C34`、 卡片描边 `#EADFC8`、次要文字 `#6B5F4E`。同一套配色贯穿全部卡片,视觉才成套。 ## 用法 ```bash python scripts/render.py --root <http根目录> --html <相对root的html> --out <输出目录> ``` 例: ```bash python scripts/render.py --root "D:/proj" --html "cards.html" --out "D:/proj/final" ``` `--root` 决定 http server 根,`--html` 是相对 root 的路径。卡片里的图片用**相对该 html 的路径**引用。 ## 🔴 关键坑(都踩过) 1. **不要在自己的脚本里 spawn 浏览器再连 CDP。** 实测在 Windows 上这样会静默挂死(fetch `/json` 轮询超时,进程不死也不出结果)。 **正确做法:Python 负责起 http server + Popen 浏览器并轮询 `/json/version` 确认就绪, Node 只做 CDP 协议**。`render.py` 就是这个分工。