给公众号文章自动生成封面图
从文章标题、摘要、关键词到 900×383 头条封面、383×383 分享封面和 1283×383 组合图,搭建一套可复用的公众号封面自动生成工作流。


公众号文章写完以后,最容易卡住的不是正文,而是封面:标题已经定了,但封面不知道画什么;AI 生出来一张图,放进后台又发现头条封面被裁掉一半;聊天转发卡片里只剩一个看不清的小角落。
这篇文章不讲“审美玄学”,而是把公众号封面拆成一个可自动化的流程:从文章标题和摘要提取视觉方向,用生图 API 生成底图,再按微信公众号的展示场景导出头条封面、分享封面和组合封面。你可以把它接到自己的 Markdown 写作、公众号排版、AI Agent 内容生产流程里。
先弄清楚:公众号其实有两种封面
微信开放社区的教程里明确提到,公众号封面至少要考虑两类展示:
- 头条封面:比例
2.35:1,推荐尺寸900×383 px,用于文章推送和推荐展示。 - 分享封面:比例
1:1,推荐尺寸383×383 px,用于公众号主页、聊天转发和朋友圈转发卡片。
另一个微信开放社区的图文消息编辑方法里还提到:封面图片必须上传,支持 bmp、png、jpeg、jpg、gif,封面图片大小在 10M 以内;大图建议尺寸曾写作 900×500,上传后会被压缩为宽 640 像素的缩略图。实际做封面时,建议按当前后台裁剪入口和展示场景来检查,不要只相信一张设计稿。
最稳的做法是:同时准备 900×383 的头条图和 383×383 的分享图。如果你想在公众号后台用同一张图完成两种裁剪,可以制作一张 1283×383 的组合图:左侧放头条封面区域,右侧放分享封面区域。
为什么适合用 AI 自动生成
公众号封面有几个特点,刚好适合自动化:
- 文章本身已经有标题、摘要、关键词,可以直接变成视觉 brief;
- 封面多为概念图、人物场景、产品氛围图,不一定需要真实摄影;
- 同一账号通常有固定风格,prompt 模板可以复用;
- 一篇文章可能需要多个版本:正式封面、分享卡片、小红书二改图、推文配图;
- 运营更关心“能不能快速生成 3 个可选方向”,而不是一次就完美。
这里可以自然接入 Nbility 这类 OpenAI-compatible API 网关:文字模型负责从文章提炼 brief,图片模型负责生成视觉底图,最后脚本裁剪导出。好处是 Base URL、API Key、用量记录和模型切换都在一个入口里管理。
推荐工作流
一个实用的自动化流程可以这样设计:
文章 Markdown / 标题 / 摘要
-> 提取主题、读者、情绪钩子、禁用元素
-> 生成封面 prompt
-> 调用图片生成 API 得到底图
-> 裁剪/排版为 900×383、383×383、1283×383
-> 人工快速挑选与微调
-> 上传公众号后台并发送手机预览
不要让 AI 直接决定所有东西。比较稳的分工是:
- AI 负责生成 2–4 个视觉方向;
- 脚本负责尺寸、裁剪、安全区、压缩;
- 人负责最终标题、敏感信息、品牌一致性和点击预期。
第一步:把文章变成封面 brief
给封面生成模型的输入不要只有标题。建议先提取这几项:
title: "给公众号文章自动生成封面图"
summary: "介绍如何用 AI 从文章标题和摘要生成公众号头条封面、分享封面和组合图。"
audience: "公众号运营、新媒体编辑、独立开发者、AI 内容团队"
hook: "写完文章后,封面不再卡半小时"
visual_metaphor: "AI 助手在设计台上生成多张封面草稿"
brand_style: "黑橙色、科技感、清晰留白、中文标题空间"
constraints:
- "不要生成真实品牌 Logo"
- "不要生成二维码、真实个人头像、API Key"
- "不要依赖模型生成小号中文文字"
这一步可以用聊天模型完成,也可以简单用人工模板。关键是:封面不是“文章标题的同义改写”,而是给读者一个点击理由。
第二步:生成底图 prompt
一个稳定的封面 prompt 可以按这个结构写:
用途:微信公众号文章封面,科技/AI 教程类。
主体:AI 助手在桌面屏幕上生成多张文章封面草稿。
构图:横版,左侧留出中文标题空间,右侧为主视觉;同时保证中心裁剪成 1:1 时仍有完整主体。
风格:黑橙色科技感,清晰、干净、现代插画,不要过度拥挤。
限制:不要真实 Logo,不要二维码,不要水印,不要可读小字,不要 API Key。
如果你用生图模型生成带中文大字的封面,可能会遇到字形错误、笔画混乱、错别字等问题。更稳的方式是:AI 只生成无字底图,标题由脚本或设计工具后加。
第三步:调用生图 API
下面是一个最小 Python 示例。它使用 OpenAI-compatible SDK 写法,只要把 Base URL 指向 Nbility 即可:
python -m venv .venv
source .venv/bin/activate
pip install openai python-dotenv pillow
.env:
NBILITY_API_KEY=[REDACTED]
NBILITY_BASE_URL=https://api.nbility.dev/v1
NBILITY_IMAGE_MODEL=gpt-image-2
generate_cover_base.py:
import base64
import os
from pathlib import Path
from dotenv import load_dotenv
from openai import OpenAI
load_dotenv()
client = OpenAI(
api_key=os.environ["NBILITY_API_KEY"],
base_url=os.environ.get("NBILITY_BASE_URL", "https://api.nbility.dev/v1"),
)
prompt = """
WeChat Official Account article cover background for an AI tutorial.
A friendly AI assistant designing multiple article cover drafts on a desktop screen.
Composition: horizontal cover, clean title space on the left, main visual on the right,
and still recognizable when center-cropped to a square sharing card.
Style: modern tech illustration, black and orange palette, soft glow, clean layout.
Constraints: no readable text, no real logos, no QR code, no watermark, no API keys.
"""
result = client.images.generate(
model=os.environ.get("NBILITY_IMAGE_MODEL", "gpt-image-2"),
prompt=prompt,
size="1536x1024",
quality="medium",
)
Path("cover-base.png").write_bytes(base64.b64decode(result.data[0].b64_json))
print("saved cover-base.png")
这里先生成 1536×1024 的底图,再用脚本裁剪到公众号需要的比例。直接要求模型输出 900×383 也可以,但很多模型对超宽扁比例的构图稳定性不如先生成高清底图再裁剪。
第四步:裁剪成公众号需要的尺寸
使用 Pillow 自动导出三张图:
cover-wide.png:900×383,头条封面;cover-square.png:383×383,分享封面;cover-combo.png:1283×383,组合封面,方便在公众号后台分别裁剪。
export_wechat_covers.py:
from pathlib import Path
from PIL import Image, ImageDraw, ImageFont
SRC = Path("cover-base.png")
OUT = Path("dist")
OUT.mkdir(exist_ok=True)
TITLE = "AI 自动封面"
SUBTITLE = "写完文章,一键出图"
img = Image.open(SRC).convert("RGB")
# 先做一个横版封面:居中裁剪成 900×383 的比例
wide_ratio = 900 / 383
w, h = img.size
if w / h > wide_ratio:
new_w = int(h * wide_ratio)
left = (w - new_w) // 2
img_wide_src = img.crop((left, 0, left + new_w, h))
else:
new_h = int(w / wide_ratio)
top = (h - new_h) // 2
img_wide_src = img.crop((0, top, w, top + new_h))
wide = img_wide_src.resize((900, 383), Image.LANCZOS)
# 叠加半透明标题区,避免标题压在复杂背景上
draw = ImageDraw.Draw(wide, "RGBA")
draw.rounded_rectangle((36, 58, 390, 280), radius=24, fill=(15, 23, 42, 190))
# 生产环境建议指定思源黑体 / PingFang / Noto Sans CJK
try:
font_title = ImageFont.truetype("/usr/share/fonts/truetype/noto/NotoSansCJK-Bold.ttc", 54)
font_sub = ImageFont.truetype("/usr/share/fonts/truetype/noto/NotoSansCJK-Regular.ttc", 26)
except Exception:
font_title = ImageFont.load_default()
font_sub = ImageFont.load_default()
draw.text((64, 95), TITLE, font=font_title, fill=(255, 255, 255, 255))
draw.text((68, 185), SUBTITLE, font=font_sub, fill=(251, 146, 60, 255))
wide.save(OUT / "cover-wide.png", quality=95)
# 分享封面:从横版中裁一个方形区域,优先保留主视觉
square = wide.crop((450, 0, 833, 383))
square.save(OUT / "cover-square.png", quality=95)
# 组合图:左 900×383 + 右 383×383
combo = Image.new("RGB", (1283, 383), "white")
combo.paste(wide, (0, 0))
combo.paste(square, (900, 0))
combo.save(OUT / "cover-combo.png", quality=95)
print("exported dist/cover-wide.png, dist/cover-square.png, dist/cover-combo.png")
如果你发现分享卡片里主体不完整,就改 square = wide.crop(...) 的坐标。很多封面翻车不是因为 AI 图不好,而是因为 1:1 裁剪区域没有提前设计。
第五步:发布前检查
上传公众号后台前,建议逐项检查:
- 头条封面是否按
2.35:1裁剪; - 分享封面是否按
1:1裁剪; - 标题在手机小图里是否还能看清;
- 重要人物、产品、图标有没有贴边;
- 背景有没有生成奇怪文字、假 Logo、水印、二维码;
- 图片大小是否在后台限制内;
- 发送手机预览后,检查会话、公众号主页、聊天转发卡片三个场景。
如果你是团队协作,可以把封面状态分成:draft、selected、uploaded、previewed、published。这样 AI Agent 批量生成多篇文章时,不会把草稿图误当最终图。
常见问题
1. 为什么 AI 生成的封面字不好看?
很多图像模型已经能生成更可靠的文字,但中文标题仍然可能出错。公众号封面建议让 AI 生成无字底图,再用脚本、Figma、Canva 或稿定设计叠加标题。
2. 为什么头条图好看,转发卡片不好看?
因为头条图是横版,分享卡片是 1:1。设计时要保证主视觉在方形裁剪区里仍然完整。最简单的方法是导出 cover-square.png 单独检查。
3. 一篇文章要生成几张候选图?
建议 3 张以内。太多会增加选择成本。更好的策略是先生成 3 个方向,选定一个方向后再做 1–2 次局部迭代。
4. 怎么控制成本?
先用较低质量或中等质量生成草稿,最终版本再提高质量。把文章标题、用户、任务 ID、图片尺寸和模型名记录下来,后续可以在 Nbility 的统一用量入口里做成本归因。
5. 能不能完全自动发布?
封面可以高度自动化,但最终发布前仍建议人工预览。封面涉及品牌、安全、误导性信息和平台裁剪效果,最后一步不要省。
一套可复用的目录结构
wechat-cover-workflow/
├── articles/
│ └── example.md
├── prompts/
│ └── cover_prompt_template.txt
├── outputs/
│ └── 2026-05-27-example/
│ ├── cover-base.png
│ ├── cover-wide.png
│ ├── cover-square.png
│ └── cover-combo.png
├── generate_cover_base.py
└── export_wechat_covers.py
后续如果你要把它接入 AI Agent,可以让 Agent 负责读取 Markdown、生成 brief、调用生图脚本、导出尺寸、写入发布清单。这样每篇文章写完后,封面不再是额外负担,而是内容流水线的一部分。
参考链接
- 微信开放社区:公众号两种不同的封面设置教程:https://developers.weixin.qq.com/community/develop/article/doc/00068ebcc4c65082572357c876b413
- 微信开放社区:公众平台图文消息编辑方法:https://developers.weixin.qq.com/community/develop/doc/000200289847d025d679fa0ab56809
- OpenAI Image generation guide:https://developers.openai.com/api/docs/guides/image-generation
- OpenAI GPT Image prompting guide:https://developers.openai.com/cookbook/examples/multimodal/image-gen-models-prompting-guide
- Nbility API 概览:https://nbility.dev/docs/api

