做内容的人很可能碰到过这种情形:拿 AI 生成一张封面底图,构图、配色都合适,唯独画面里那行标题——「三步搞定周报」生成出来,「步」字少一横,「报」字右下多一角。再抽三次,能全对的靠运气。
模型层面的原因在这里:扩散模型预测的是像素分布,它学的是「这个位置大概长什么样的纹理」,而不是汉字的结构规则。笔画越密,越容易在细节上漂移。英文之所以看起来好一些,是因为字母结构简单、容错高。
2026 年能直接写中文的模型,能力边界在哪
下面是几款目前常被提到的方案,官方演示和社区测试中的表现大致如下:
| 模型 | 中文短句表现 | 主要限制 | 获取方式 |
|---|---|---|---|
| Qwen-Image | 笔画完整度较好,标题级短句可用 | 长句、多行仍需逐字核对 | 开源权重,可本地部署或云端镜像 |
| Seedream 4.0 / 即梦 | 中文准确度尚可,支持多图参考 | 字体、字号、位置由模型决定,改一个字要整张重出 | 即梦 App 与网页版,有免费额度 |
| Gemini 2.5 Flash Image(Nano Banana) | 英文排版较强,中文长句一般 | 中文细节不稳定 | Google AI Studio 或第三方 API |
| Stable Diffusion / FLUX 系列 | 基本写不对中文 | — | 本地 ComfyUI |
所以更实际的做法是把图拆成两层:图像层交给 AI,文字层交给排版工具。
图像层:提示词里主动留出文字位
AI 只画底图和元素,不画字。这一步的提示词要额外交代三件事:
留白区域的位置和占比。 与其说「留出空间」,不如写「画面左侧三分之一为纯色渐变区域,无细节、无纹理、无物体」。模型对具体比例的理解比形容词好。
控制文字区的对比度。 文字要压在最上面,背景越平越好。提示词里加上「该区域低对比、平滑过渡」,能减少后期压蒙版的难度。
直接出目标比例。 小红书用 3:4,视频号封面用 9:16,最好在生成时就定好,后期裁切会打乱你原本算好的留白位置。
生成完把底图按「内容批次」归档,一个选题一个文件夹。后面换标题时,只重出文字层,底图不用动。
排版层路线一:改一两张,用现成工具
Canva、稿定设计、Figma 都能做,流程差不多:
- 按目标平台尺寸新建画布
- 把 AI 底图铺满画布,确认留白区在你的预期位置
- 在文字区叠加一层半透明色块或渐变蒙版,压住背景细节
- 输入标题,字体选思源黑体、阿里巴巴普惠体这类开源可商用的中文字体
- 把图缩到宽 200px 看一眼,标题还认得出就算过关
- 导出 PNG
排版层路线二:批量出图,用 HTML 加截图
如果你一期要出十几张,或者每周固定更新,把封面做成网页再用脚本截图会更省事。文字来自一份 JSON,改数据不用重做设计。
先写 cover.html,关键样式是这样:
body { margin: 0; }
.cover {
position: relative;
width: 1242px;
height: 1656px;
background: #111 url('bg.jpg') center / cover no-repeat;
overflow: hidden;
}
.cover::after {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(180deg, rgba(0,0,0,.6) 0%, rgba(0,0,0,0) 50%);
}
.title {
position: absolute;
z-index: 1;
top: 128px;
left: 96px;
width: 1050px;
font-family: "Source Han Sans SC", sans-serif;
font-weight: 900;
font-size: 124px;
line-height: 1.24;
letter-spacing: -0.02em;
color: #fff;
}
.cover::after 那层渐变是给文字垫底的,长度要足够,只留窄窄一条的话,标题第二行就会压在花纹上。.title 必须写 z-index,否则伪元素会盖住它。
然后是截图脚本,用 Playwright:
const { chromium } = require('playwright');
const items = require('./list.json');
(async () => {
const browser = await chromium.launch();
const page = await browser.newPage({
viewport: { width: 1242, height: 1656 },
deviceScaleFactor: 1,
});
for (const item of items) {
await page.goto(file://${__dirname}/cover.html?id=${item.id});
await page.evaluate(() => document.fonts.ready);
await page.screenshot({ path: out/${item.id}.png });
}
await browser.close();
})();
document.fonts.ready 这一行不能省。字体没加载完就截图,中文会掉成默认字体,导出一批全是错的。页面上再放一段 JS,读 URL 里的 id,从 list.json 里取标题填进去,一个模板就能套整个月的内容。
让文字层和底图不脱节
文字直接贴上去,十有八九会显得「浮」在画面上。两个处理能缓解:
一是底图统一加质感。同一批封面走一遍相同的颗粒或噪点处理,文字和背景的细腻度接近了,视觉上就黏在一起了。CSS 里可以用 filter: contrast(1.05) 之类的轻量处理,也可以在导出后用批处理脚本统一加噪点。
二是字重和背景复杂度挂钩。背景越花,字越要重、越要粗;背景是纯色渐变,细体反而更干净。别在纹理密集的底图上用细体字,笔画会被吃掉。
常用尺寸参考
小红书封面 3:4,1242×1656;公众号首图 2.35:1,900×383;视频号和抖音 9:16,1080×1920;B 站 16:10,1146×717。平台规范会调整,动手前到官方创作者后台确认一次当前要求,比记住某个数字更保险。
推荐学习视频
- B 站 UP 主「秋葉aaaki」:ComfyUI 与 Stable Diffusion 整合包、工作流系列,节点连接和本地部署讲得比较细,适合搭图像层。
- B 站 UP 主「Nenly同学」:AI 绘画与平面设计工作流,封面、海报类的实操演示较多。
视频来源网络,仅供学习参考,如有侵权请联系删除。
先做这一件事
挑三个你已经写好的标题,按上面的分层方式各出一张封面:AI 只出底图,文字用 HTML 模板渲染。三张放在一起看,如果字体、字距、标题位置完全一致,这套流程就可以固定下来了;如果还是各不一样,问题多半出在模板里残留了随机样式,回头检查 CSS 有没有漏掉的默认值。