Install
openclaw skills install @songhonglei/text-to-elegant-image将 Markdown/纯文本内容智能分析、排版并导出为高分辨率精美长图或分享海报(内置 18 种视觉风格)。 当用户说「生成长图」「做海报」「文字转图片」「高颜值排版」「做大图」「make a poster」 「export as image」「generate image from text/markdown」等意图时触发本技能。
openclaw skills install @songhonglei/text-to-elegant-image将 Markdown 或纯文本内容转化为排版精美的高清长图。通过生成 HTML 文件并用 Puppeteer 无头浏览器截图实现。
共 18 种风格,各风格完整 CSS 在 resources/styles_reference.md,生成 HTML 前必须读取对应风格的样式代码。
| # | 风格 | 视觉关键词 | 最适合 |
|---|---|---|---|
| 1 | 赛博科技风(默认) | 深色/霓虹/SVG蜂窝网格 | AI 分析、科技报告、炫酷海报 |
| 2 | 极简优雅风 | 白底/衬线/留白/噪点宣纸 | 文学随笔、日记、人文知识 |
| 3 | Apple 质感风 | 浅灰/毛玻璃卡片/彩色窗口 | 效率工具、复盘总结、方法论 |
| 4 | Cowork 轻科技风 | 苹果灰白/小红书蓝/磨砂玻璃Hero/神经网络节点 | 内部分享、AI 工具介绍、产品手册 |
| 5 | 报纸/杂志风 | 米黄/铅字颗粒纹/黑白印刷 | 历史事件、时间轴、深度叙事 |
| 6 | Bloomberg 终端风 | 纯黑CRT纹/橙色发光字 | 数据报告、指标对比、金融科技 |
| 7 | 水墨卷轴风 | 宣纸晕染/朱砂红/毛笔横扫线 | 中国历史、文化艺术、东方美学 |
| 8 | 蒸汽朋克风 | 深棕/铜色齿轮/蜂窝铆钉/压力表 | 工业历史、科技跃迁、机械美学 |
| 9 | 小红书风 | 白底/柔和珊瑚红/圆角卡片 | 知识笔记、生活攻略、干货分享 |
| 10 | 莫兰迪高级灰风 | 暖灰米底/灰绿/柔和阴影/留白克制 | 品牌方法论、复盘、人文随笔 |
| 11 | 玻璃拟态风 | 彩色渐变底/半透磨砂卡片/细白描边 | SaaS 官网、活动页、功能介绍 |
| 12 | 故宫风 | 深棕木底/朱砂红/鎏金字/书法字韵 | 中国历史、国风节日、文博展览 |
| 13 | 清新自然绿风 | 浅薄荷底/森林绿/纯白卡片/呼吸感 | 健康环保、生活方式、科普攻略 |
| 14 | 大地原木风 | 亚麻米底/赤陶橙/橄榄棕/手作质地 | 手作咖啡、生活美学、品牌故事 |
| 15 | 优雅紫梦幻风 | 薰衣草底/品紫渐变/浪漫优雅 | 美妆时尚、情感、活动海报 |
| 16 | 马卡龙粉彩风 | 奶油粉底/珊瑚粉/大圆角/甜美 | 甜品母婴、生活分享、节日祝福 |
| 17 | 暗色极简风 | 炭灰深底/冷调蓝绿/克制/护眼 | 技术文档、开发者内容、数据报告 |
| 18 | 活力渐变风 | 紫粉橙三色渐变/纯白衬底/张力 | 活动促销、年轻品牌、音乐娱乐 |
风格9内置两个子模式,由用户指定;未指定时默认模式 A:
| 模式 | 触发词 | 气质 |
|---|---|---|
| A — 简洁正式 | "简单"/"正式"/"干净"/"知识感" | 细边框小圆角,数字下划线序号,呼吸感强 |
| B — 丰富活泼 | "活泼"/"丰富"/"可爱"/"生活"/"有趣" | 浅粉大圆角,实心圆圈序号,波浪装饰线,Footer 含引导语 |
生成后告知用户当前模式,并提示可切换:
"已用简洁版生成,如需活泼风格可以说「做个活泼版」。"
用户未指定风格时,根据内容类型自动推荐,并告知用户可选项:
内容偏向 → 推荐风格
──────────────────────────────────────
科技/AI/数据分析 → 赛博科技风 或 Bloomberg 终端风
历史/时间轴/叙事 → 报纸杂志风 或 水墨卷轴风(中国历史)
工业/机械/科技跃迁 → 蒸汽朋克风
效率/方法论/总结 → Apple 质感风 或 Cowork 轻科技风
文学/日记/人文 → 极简优雅风 或 水墨卷轴风
企业内部分享 → Cowork 轻科技风
知识笔记/生活攻略/干货 → 小红书风
品牌方法论/复盘/高级感 → 莫兰迪高级灰风
SaaS/产品官网/活动页 → 玻璃拟态风 或 活力渐变风
中国历史/国风/文博 → 故宫风 或 水墨卷轴风
健康/环保/生活方式 → 清新自然绿风
手作/咖啡/生活美学 → 大地原木风
美妆/时尚/情感/浪漫 → 优雅紫梦幻风
甜品/母婴/可爱/种草 → 马卡龙粉彩风
技术文档/开发者/护眼 → 暗色极简风
活动/促销/潮流/年轻 → 活力渐变风
推荐话术示例:
"根据内容,我推荐「小红书风」(笔记感强,适合传播)或「Apple质感风」(更工具感)。共 18 种风格可选,也可以直接说想要哪种(如「故宫风」「莫兰迪」「玻璃拟态」)。"
用户描述风格偏好时的关键词匹配:
阅读用户内容,提取:
resources/styles_reference.md,选取对应风格 CSSstyles_reference.md 的「通用 HTML 布局骨架」小节)作为模板write 工具保存到 /tmp/elegant_image_<timestamp>.html⚠️ 工具名是
write,不是write_to_file
Footer 处理规则(重要):
.footer 元素中写入默认值:<skill名称> @ <当前模型名>
text-to-elegant-image @ claude-4.6-sonnet.footer 元素,截图时追加 --no-footer不要在 footer 中写 "Generated by Ashley" 或任何 AI 身份标识。
运行 setup 脚本检测环境:
bash <skill目录>/scripts/setup.sh
✔ 所有依赖已就绪exit 1),提示联系管理员检查容器镜像(容器环境应内置这两项)npm install,无需用户确认已就绪时脚本极速返回,无性能负担,建议每次调用前执行一次。
node <skill目录>/scripts/export_image.js \
<HTML文件绝对路径> \
<输出目录>/<文件名>.png \
[宽度] [--author "作者信息" | --no-footer]
输出目录配置(首次使用请引导用户设置):
输出目录按以下优先级解析(高 → 低):
T2EI_OUTPUT_DIR./output(当前工作目录下的 output/)💡 首次使用引导:第一次为用户生成长图前,询问一次"希望把图片输出到哪个目录?"
- 用户不指定 → 用默认
./output- 用户指定固定目录 → 建议写入环境变量持久化:
bash echo 'export T2EI_OUTPUT_DIR="$HOME/my-images"' >> ~/.bashrc之后不再重复询问。
Footer 参数说明:
| 参数 | 效果 |
|---|---|
| 不传(默认) | 使用 HTML 中已写好的 footer(见 Step 2) |
--author "自定义文字" | 替换 footer 为指定文字 |
--no-footer | 完全移除 footer |
脚本自动检测 Chrome/Chromium 路径,支持 Linux、macOS、WSL,无需手动配置。输出目录不存在会自动创建。
截图成功后,向用户返回本地 PNG 路径即可:
图片已生成 🎉
本地路径:<输出目录>/<文件名>.png
用户可直接在文件系统 / 编辑器中查看该 PNG,或自行分发。
📌 关于自动分发(占位,暂不内置) 本开源版仅负责「文本 → 精美长图」的生成,不内置任何 IM 渠道的自动发图能力。 如需把生成的图片自动推送到 WeChat / Telegram / Slack 等渠道,可在此步之后自行接入对应平台的 Bot / API(未来版本可能提供可选适配器)。目前请用户手动获取本地 PNG 后分发。
截图失败时(如浏览器未安装),脚本会输出 HTML 文件路径,引导用户在浏览器中打开后手动打印为 PDF/图片。
生成 HTML 时,严禁在任何位置使用 emoji 字符。
Linux 无头浏览器(Puppeteer + Chrome headless)环境缺少彩色 emoji 字体(Noto Color Emoji),所有 emoji 会渲染成黑色方块乱码,直接毁掉排版。
禁止使用的位置(全部):
替代方案:
| 原 emoji 用途 | 替代写法 |
|---|---|
| 章节图标(📊🔮🗺️) | 纯文字标题,靠 border-left 色条区分 |
| 状态标记(✅❌⚠️) | 用色块 badge:<span class="badge-green">全自动</span> |
| 装饰符号(🎯💡👥) | 删除,内容本身足够表意 |
| 进度/箭头(↑→) | 用 CSS ::before 伪元素或纯文字 ->、· |
检查清单(生成 HTML 后,截图前必须执行):
import re
with open('<html_path>') as f:
content = f.read()
emoji_pattern = re.compile(
r'[\U00010000-\U0010ffff]' # 补充平面(大多数 emoji)
r'|[\U00002600-\U000027BF]' # 杂项符号
r'|[\U0001F300-\U0001F9FF]' # 表情/符号块
r'|[\u2702-\u27B0]' # 装饰符号
)
found = emoji_pattern.findall(content)
if found:
print(f"❌ 发现 emoji,必须替换后再截图:{set(found)}")
else:
print("✔ 无 emoji,可以截图")
发现 emoji → 替换为纯文字 → 重新执行检查 → 通过后再截图。
export_image.js 第三个参数可指定宽度(默认 600px),2x deviceScaleFactor 保证高清输出<输出目录>/<文件名>.png(输出目录默认 ./output,可用 T2EI_OUTPUT_DIR 环境变量配置,见 Step 4)