大家好,我是何三,独立开发者

写文章难免会要给段落配图,需要根据文章内容自动生成配图。最初的想法很简单,直接调用AI的文生图API不就行了吗?但实际使用下来,发现这种方式存在不少问题。

今天我要分享一个更优雅的解决方案:通过AI生成HTML代码,然后用截图工具将HTML转换为图片。这个方案不仅成本更低,而且可控性更强。

传统AI文生图的痛点

直接调用AI的文生图API,看似简单直接,但实际使用中会遇到这些问题:

1. 成本较高

目前市面上的文生图API价格普遍不低。根据市场主流AI平台的文生图API价格大约在0.1元/张左右。如果每天需要生成几十张配图,成本会快速累积。

2. 可控性差

AI生成的图片风格难以精确控制。你想要一个简洁的流程图,AI可能给你一个艺术感很强的插画;你想要专业的数据图表,AI可能给你一个卡通风格的图片。这种不确定性对于需要保持品牌一致性的场景来说是个大问题。

3. 文字渲染不理想

AI文生图在处理文字时经常出错。中文字符可能会出现错别字、笔画缺失,英文单词拼写错误更是常见。对于需要包含大量文字信息的配图(如海报、信息图),这几乎是致命伤。

4. 布局难以精确控制

想要图片中某个元素在特定位置、某个区域显示特定内容,AI很难做到精确控制。每次生成的结果都可能不一样,需要反复尝试。

HTML转图片方案的优势

既然AI直接生成图片有这么多问题,那换个思路:让AI生成HTML代码,然后用工具将HTML转换为图片。这个方案的优势非常明显:

1. 成本大幅降低

文本生成API的价格远低于文生图API。根据市场主流AI平台的文本生成API价格大约在0.004-0.06元/百万tokens,而生成一张图片的HTML代码大约需要5000 tokens左右,成本仅为0.00002-0.0003元/张。相比直接文生图的0.1元/张,成本降低了300-5000倍!

2. 完全可控

HTML+CSS是成熟的网页技术,我们可以精确控制每个元素的位置、大小、颜色、字体等。想要什么风格就写什么样式,AI只需要负责生成内容结构即可。

3. 文字渲染完美

HTML中的文字由浏览器渲染,不会出现错别字、笔画缺失等问题。中英文混合、特殊字符都能完美显示。

4. 布局精确可控

使用CSS的flexbox、grid等布局技术,可以精确控制元素位置。想要居中就居中,想要靠左就靠左,完全按照设计稿来。

5. 易于维护和修改

如果需要调整样式,只需要修改CSS代码即可,不需要重新生成图片。批量修改风格也非常方便。

成本对比

核心技术:capture-html截图工具

要实现HTML转图片,需要一个可靠的截图工具。我开发了一个基于Rust的命令行工具——capture-html

capture-html的功能特性

  • 🎯 精确截取指定ID的HTML元素
  • 🖼️ 支持PNG和JPEG格式输出
  • 🔍 自动查找系统中安装的Chrome/Edge浏览器
  • ⚡ 轻量级,仅占用约6MB内存
  • 🚀 支持自定义Chrome可执行文件路径

使用方法

capture-html.exe <html文件> <div元素id> <输出图片路径>

性能表现

在标准测试环境下:

指标 数值
平均耗时 ~2.4 秒
最快 2.10 秒
最慢 3.07 秒

内存占用也非常友好:

进程 工作集内存 分页内存
capture-html ~6 MB ~2.5 MB
chrome ~13 MB ~7.9 MB

技术栈

  • Rust - 系统编程语言
  • chromiumoxide - Chrome DevTools Protocol客户端
  • tokio - 异步运行时
  • clap - 命令行参数解析
  • anyhow - 错误处理

工作流程

image-generator Skill实现

基于capture-html工具,我封装了一个image-generator skill,让AI能够方便地生成图片。下面是完整的skill源码:

name: "image-generator"
description: "通用图片生成工具,支持将任意 HTML 内容转换为图片。当用户需要生成自定义图片、海报、配图时调用此 skill。"
---

# 通用图片生成 Skill

## 功能说明

这个 skill 帮助用户将任意 HTML 内容转换为图片。通过 AI 生成 HTML 代码,然后使用 capture-html.exe 截图保存为图片。

## 使用场景

当用户需要:
- 生成自定义图片
- 创建海报或配图
- 将 HTML 内容转换为图片
- 制作带有特定样式和布局的图片
- 生成社交媒体配图

## 参数说明

- **第一个参数**: HTML 路径(必需)
- **第二个参数**: 要截图的元素选择器(必选, #capture-container)
- **第三个参数**: 输出文件名(可选,默认使用时间戳)

## 工作流程

1. **生成 HTML 代码**
   - 根据用户需求生成 HTML 内容
   - HTML 必须包含一个 id 为 "capture-container" 的 div 元素(或自定义选择器)
   - 确保样式符合用户需求
   - 只返回纯 HTML 代码,不要包含任何解释性文字

2. **保存 HTML 到临时文件**
   - 生成随机文件名(如:`image_<timestamp>_<random>.html`)
   - 将生成的 HTML 代码写入临时文件
   - 临时文件保存在系统临时目录或项目临时目录

3. **执行 capture-html.exe 进行截图**
   - 使用 `capture-html.exe <html文件> <div元素id> <输出图片路径>` 执行截图脚本
   - 脚本会从临时文件读取 HTML 内容
   - 使用 capture-html 截图并保存到指定位置
   - 截图完成后可删除临时文件

## HTML 生成要求

生成的 HTML 代码需要满足以下要求:

`html
<div id="capture-container" style="width: {width}px; min-height: {height}px;">
  <!-- 图片内容 -->
</div>
`

**通用设计规范**1. **容器要求**
   - 必须包含一个具有唯一 id 的容器元素(默认 #capture-container)
   - 容器尺寸可以通过 width/height 属性指定
   - 确保内容在容器内完整显示
   - **重要**:对于流程图、多层级内容等复杂布局,使用 `min-height` 而非固定 `height`,或预留足够的高度空间

2. **高度计算规则**(防止内容被裁剪)
   - **估算内容总高度**:标题 + 所有卡片/元素 + 间距 + 边距 + 底部说明
   - **预留安全边距**:在估算高度基础上增加 20-30% 的缓冲空间
   - **使用 min-height**:推荐使用 `min-height` 替代固定 `height`,让容器根据内容自动扩展
   - **示例计算**:
     `
     标题: 50px
     5个卡片: 5 × 80px = 400px
     4个箭头: 4 × 30px = 120px
     底部说明: 60px
     间距: 100px
     内边距: 80px
     总计: 810px
     建议容器高度: 1000px (预留20%缓冲)
     `

3. **布局对齐策略**
   - **避免使用 `justify-content: center`**:当内容高度接近或超过容器高度时,居中对齐会导致上下内容被裁剪
   - **推荐使用 `justify-content: flex-start`**:从顶部开始排列,确保内容完整显示
   - **如需居中效果**:使用 `padding``margin` 来调整视觉居中,而非 flex 居中
   - **错误示例**:
     `
     <!-- 容易导致内容被裁剪 -->
     <div style="height: 600px; justify-content: center;">
     ```
   - **正确示例**:
     ```html
     <!-- 内容完整显示 -->
     <div style="min-height: 800px; justify-content: flex-start; padding: 40px;">
     `

4. **内容溢出处理**
   - **避免内容溢出**:确保容器高度足够容纳所有内容
   - **使用 flex-wrap**:对于横向排列的元素,允许换行:`flex-wrap: wrap`
   - **调整间距**:适当减少元素间距以适应容器
   - **使用滚动**(不推荐):如必须使用固定高度,可添加 `overflow: auto`,但截图时滚动条会被截取

5. **样式建议**
   - 所有样式建议内联在 style 属性中
   - 使用现代 CSS 特性(flexbox、grid、渐变等)
   - 考虑响应式设计
   - 使用合适的字体(Microsoft YaHei、PingFang SC、Arial 等)

6. **内容组织**
   - 合理的层级结构
   - 清晰的视觉层次
   - 适当的留白
   - 一致的设计语言

7. **流程图/架构图特殊规范**
   - **容器高度**:至少预留 1000px 以上高度
   - **使用 min-height**`min-height: 1000px` 而非 `height: 600px`
   - **对齐方式**:使用 `justify-content: flex-start` 从顶部开始排列
   - **间距控制**:适当减少元素间距,如 `gap: 20px` 而非 `gap: 30px`
   - **内边距**:使用 `padding: 30px` 而非 `padding: 40px`,节省空间
   - **卡片尺寸**:适当减小卡片尺寸,如 `padding: 20px 40px` 而非 `padding: 30px 60px`
   - **示例**:
     `
     <div id="capture-container" style="width: 800px; min-height: 1000px; display: flex; flex-direction: column; justify-content: flex-start; align-items: center; padding: 30px;">
       <!-- 流程图内容 -->
     </div>
     `

4. **图片优化**
   - 使用矢量图形(SVG)保证清晰度
   - 控制图片大小
   - 优化加载性能
   - 考虑不同设备的显示效果

**输出要求**1. 只返回纯 HTML 代码,不要包含任何解释性文字
2. 所有样式必须内联在 style 属性中
3. 确保在指定尺寸内完美展示
4. **对于流程图、架构图等复杂内容**   - 必须使用 `min-height` 而非固定 `height`
   - 必须使用 `justify-content: flex-start` 而非 `center`
   - 必须预留足够的高度空间(至少比估算内容高度多 20%)
   - 必须确保所有内容都在容器内完整显示


### 执行截图

`
# 将 HTML 保存到临时文件后执行
capture-html.exe temp_image.html capture-container ./output.png
`

## 示例

用户输入:
`
生成一个图片,内容是一个渐变背景的卡片,显示"Hello World"
`

AI 生成 HTML:
`
<div id="capture-container" style="width: 800px; height: 600px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); display: flex; justify-content: center; align-items: center; font-family: 'Microsoft YaHei', Arial, sans-serif;">
  <div style="background: rgba(255, 255, 255, 0.95); padding: 60px 80px; border-radius: 20px; box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); text-align: center;">
    <h1 style="font-size: 48px; color: #333; margin: 0; font-weight: 700; letter-spacing: 2px;">Hello World</h1>
    <p style="font-size: 18px; color: #666; margin-top: 20px;">Welcome to Image Generator</p>
  </div>
</div>
`

执行步骤:
1. 将 HTML 保存到临时文件(如:`image_1737680000_abc123.html`)
2. 执行截图命令:
`
capture-html.exe image_1737680000_abc123.html capture-container ./output/image_1737680000_abc123.png
`
3. 截图完成后删除临时文件

## 注意事项

1. 确保 Chrome 浏览器已安装在 `C:\Program Files\Google\Chrome\Application\chrome.exe`,或修改脚本中的路径
2. 输出目录会自动创建(如果不存在)
3. 文件名可以包含路径,如 `images/hello.png`
4. 支持的图片格式:PNG(默认)、JPEG、WEBP
5. 对于 JPEG 和 WEBP 格式,可以通过 quality 参数控制图片质量(0-100)

实际应用场景

应用场景

这个image-generator skill在实际应用中非常有用:

1. 公众号配图生成

根据文章内容自动生成配图,风格统一,成本低廉。

2. 海报制作

生成活动海报、产品宣传图等,文字清晰,布局精确。

3. 数据可视化

生成数据图表、统计报告等,专业美观。

4. 社交媒体内容

生成小红书配图、微博图片等,快速批量生产。

总结

通过AI生成HTML代码,然后用capture-html工具转换为图片,这个方案相比直接调用AI文生图API,有以下几个核心优势:

  1. 成本极低:每张图片成本仅为0.00002-0.0003元,比直接文生图便宜300-5000倍
  2. 完全可控:HTML+CSS精确控制每个元素,风格统一
  3. 文字完美:浏览器渲染文字,不会出现错别字
  4. 易于维护:修改样式不需要重新生成图片
  5. 批量生产:适合大规模批量生成

当然,这个方案也有一定的学习成本,需要了解HTML和CSS的基础知识。但考虑到它的巨大优势,这点学习成本是完全值得的。

如果你也在开发需要自动生成图片的功能,不妨试试这个方案。

相关资源: - capture-html项目:https://gitee.com/pojoin/capture-html
- image-generator skill:见上文完整源码