抖音封面
9:16 竖屏 1080×1920 · 多种模板 + 文字特效
9:16 视频封面 + 文字
9:16 竖屏 1080×1920 · 多种模板 + 文字特效
拖入或点击上传背景图
了解工具定位 · 使用场景 · 对比优势
抖音创作者每天需要发布多条视频,封面直接决定点击率。在剪辑软件里单独做封面费时费力,本工具直接在浏览器里输入视频关键帧截图,一键添加标题文字和贴纸,生成符合 9:16 规格的封面图,无需切换 App,单条封面制作从 5 分钟压缩到 30 秒。
主播开播前需要发布预告视频,封面要清晰展示直播时间、主题和福利信息。本工具支持自定义文字位置、字体和颜色,输入开播时间和核心卖点后,自动生成带时间戳的 9:16 封面,避免因手动排版导致文字被抖音底部按钮遮挡的问题。
带货视频的封面需要突出商品卖点和价格信息,但不同品类(服装、食品、数码)的排版要求不同。本工具提供多种文字模板,输入商品名称、价格和促销标签后,自动适配封面空间,生成带有价格标签和卖点文字的封面图,提升用户在信息流中的停留率。
知识类视频的封面通常需要展示核心观点或数据,但文字过多容易显得杂乱。本工具支持多行文字输入和自动换行,可调整文字透明度与背景色,生成简洁清晰的 9:16 封面,让用户一眼抓住视频要点,提高完播率。
老号翻新或系列视频需要统一封面风格时,逐张修改费时费力。本工具支持保存封面模板(文字位置、字体、颜色),后续只需替换视频截图和标题文字即可批量生成,保持账号视觉一致性,适合运营多个账号的内容团队使用。
| 维度 | 本工具 | Canva 封面模板 | PS 手动制作 |
|---|---|---|---|
| 数据隐私 | 纯浏览器处理,不上传视频/图片到服务器 | 上传素材到云端服务器 | 所有素材存储在本地设备 |
| 处理速度 | 1 秒内生成封面 | 5-15 秒(含模板加载和导出) | 10 分钟以上(含设计、导出) |
| 离线可用 | 完全离线(浏览器本地运行) | 需联网访问网页版 | 需安装软件,可离线使用 |
| 9:16 尺寸适配 | 自动生成严格 9:16 比例封面 | 需手动选择或调整画布尺寸 | 需手动新建 9:16 画布 |
| 文字添加 | 自动将标题文字叠加到封面 | 手动拖拽文本框并输入 | 手动创建文字图层并调整 |
| 操作门槛 | 无需设计经验,一键生成 | 需基础设计操作(拖拽/选模板) | 需专业设计软件操作经验 |
| 收费模式 | 免费使用 | 免费模板有限,高级模板/功能需付费 | 需购买软件授权(订阅制/买断制) |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| https://example.com/video.mp4 封面文字:夏日海滩Vlog | 生成 9:16 封面图(1080×1920),背景为视频首帧,叠加白色宋体文字「夏日海滩Vlog」,文字居中偏下位置 | 典型场景:上传视频链接并添加自定义文字 |
| (直接上传本地视频文件) 封面文字: | 生成 9:16 封面图(1080×1920),背景为视频首帧,无文字叠加 | 典型场景:仅提取视频帧,不添加文字 |
| https://example.com/portrait.mp4 封面文字:这是一段超过20个字符的测试文字用来看看换行效果 | 生成 9:16 封面图,文字自动换行分两行显示,每行不超过15个字符 | 边界 case:长文字自动换行处理 |
| https://example.com/landscape.mp4 封面文字:横屏视频 | 生成 9:16 封面图,视频首帧裁剪为 9:16 比例(左右两侧被裁切),文字正常叠加 | 边界 case:横屏视频自动裁剪适配竖屏比例 |
| (上传 10KB 的低分辨率视频) 封面文字: | 生成 9:16 封面图,分辨率保持原视频分辨率(如 320×568),不强制放大 | 边界 case:低分辨率视频保持原尺寸输出 |
| https://example.com/video.mp4 封面文字:特殊符号!@#¥%……&*() | 生成 9:16 封面图,文字正常显示特殊符号,无乱码或过滤 | 易错 case:特殊符号正常渲染不报错 |
| (上传 4K 分辨率视频) 封面文字:4K画质测试 | 生成 9:16 封面图(1080×1920),视频首帧缩放到 1080 宽度后裁剪,文字清晰无锯齿 | 易错 case:高分辨率视频自动降采样至标准尺寸 |
直接上传手机拍摄的 1080×1920 竖屏视频截图(未做任何裁剪)上传一张 1080×1920 的纯图片(或从视频中截取后手动裁剪为 9:16 比例)抖音封面要求 9:16 比例(如 1080×1920),但视频截图通常包含黑边或非标准比例,直接上传会导致封面拉伸或留白。
文字放在封面底部 10% 区域(如“点击购物车”紧贴下边缘)文字放在封面中心区域,上下左右各留 15% 空白边距抖音 App 封面缩略图会裁切边缘 10%-15%,文字贴边会被裁掉或遮挡。
上传一张带透明通道的 PNG(如人物抠图后保存为 PNG-24)先给透明区域填充纯色背景(如白色/黑色),再保存为 JPG 或不透明 PNG抖音封面不支持透明通道,透明区域会显示为黑色或随机色块,破坏画面完整性。
白色文字放在浅灰/浅蓝背景上,或黑色文字放在深色背景上白色文字配深色背景(黑/深蓝/深红),或黑色文字配浅色背景(白/浅黄)封面缩略图在手机屏幕上很小,低对比度文字几乎不可读,影响点击率。
在封面写上 5 行完整句子,每行 15 个字以上控制在 1-2 行,每行不超过 10 个字(如“限时 5 折|今晚 8 点”)抖音信息流中封面缩略图只有 200×350px 左右,多行文字会挤成一团,完全看不清。
上传一张 1080×1080 的方形图片,期望工具自动裁剪先裁剪或缩放为 9:16 比例(如 1080×1920),再上传工具不会自动裁剪比例;非 9:16 图片会被强制拉伸变形,或上下出现黑边。
输入“华文彩云”或“方正舒体”等非常用字体名称使用系统默认字体(如“思源黑体”“PingFang SC”)或常见 Web 安全字体工具渲染文字时依赖本地字体库;非常用字体会回退为默认字体,导致排版错乱。
文字中包含 😂🔥🎉 等 Emoji 字符用文字代替(如“笑哭”“火爆”“庆祝”)或上传包含 Emoji 的图片素材Emoji 在不同系统和字体下显示差异巨大,且部分浏览器渲染为黑白方块,破坏封面美感。
公式推导 · 流程图解 · 依据出处
W = 1080, H = 1920
W — 封面宽度(像素)H — 封面高度(像素)抖音视频封面推荐尺寸为 9:16 竖屏,宽度 1080 像素,高度 1920 像素。若视频分辨率为 720×1280,则封面直接取该分辨率即可;若原视频为 1920×1080 横屏,需裁剪或缩放至 1080×1920(保持中心区域),避免上下黑边。
适用于抖音短视频封面制作,基于抖音官方推荐尺寸(1080×1920,9:16 竖屏)。不适用于横屏视频封面(如西瓜视频 16:9)或非视频场景(如静态海报)。
3 种主流语言 · 复制即用
from PIL import Image, ImageDraw, ImageFont
# 打开 9:16 视频封面(1080×1920)
img = Image.open("cover.jpg").resize((1080, 1920))
draw = ImageDraw.Draw(img)
# 加载字体(需本地有 NotoSansSC 或替换路径)
font = ImageFont.truetype("/usr/share/fonts/NotoSansSC-Regular.ttf", 80)
# 在底部居中绘制白色文字
text = "点击观看完整视频"
# 计算文字尺寸以居中
bbox = draw.textbbox((0, 0), text, font=font)
text_w = bbox[2] - bbox[0]
x = (1080 - text_w) // 2
y = 1920 - 200 # 距底部 200px
# 先描边再填充,提升可读性
draw.text((x-2, y-2), text, font=font, fill="black")
draw.text((x+2, y+2), text, font=font, fill="black")
draw.text((x, y), text, font=font, fill="white")
img.save("output_cover.jpg")
print("已生成带文字的 9:16 封面:output_cover.jpg")package main
import (
"image"
"image/color"
"image/draw"
"image/jpeg"
"log"
"os"
"golang.org/x/image/font"
"golang.org/x/image/font/basicfont"
"golang.org/x/image/math/fixed"
)
func main() {
// 打开源图片(假设已为 9:16)
src, err := os.Open("cover.jpg")
if err != nil {
log.Fatal(err)
}
defer src.Close()
img, _, err := image.Decode(src)
if err != nil {
log.Fatal(err)
}
// 创建新画布并复制原图
bounds := img.Bounds()
dst := image.NewRGBA(bounds)
draw.Draw(dst, bounds, img, bounds.Min, draw.Src)
// 在底部绘制文字
col := color.RGBA{255, 255, 255, 255} // 白色
point := fixed.Point26_6{
X: fixed.Int26_6(100 * 64), // 粗略居中
Y: fixed.Int26_6(bounds.Max.Y - 100) * 64,
}
d := &font.Drawer{
Dst: dst,
Src: image.NewUniform(col),
Face: basicfont.Face7x13,
Dot: point,
}
d.DrawString("点击观看完整视频")
// 保存结果
out, _ := os.Create("output_cover.jpg")
defer out.Close()
jpeg.Encode(out, dst, &jpeg.Options{Quality: 95})
log.Println("已生成 output_cover.jpg")
}const { createCanvas, loadImage, registerFont } = require('canvas');
(async () => {
// 加载 9:16 图片(1080×1920)
const image = await loadImage('cover.jpg');
const canvas = createCanvas(1080, 1920);
const ctx = canvas.getContext('2d');
// 绘制原图
ctx.drawImage(image, 0, 0, 1080, 1920);
// 设置文字样式
ctx.font = 'bold 80px "Noto Sans SC"';
ctx.textAlign = 'center';
ctx.textBaseline = 'bottom';
const text = '点击观看完整视频';
const x = 540; // 水平居中
const y = 1920 - 100; // 距底部 100px
// 黑色描边(2px 偏移)
ctx.strokeStyle = 'black';
ctx.lineWidth = 4;
ctx.strokeText(text, x, y);
// 白色填充
ctx.fillStyle = 'white';
ctx.fillText(text, x, y);
// 输出为 buffer 或保存
const buffer = canvas.toBuffer('image/jpeg', { quality: 0.95 });
require('fs').writeFileSync('output_cover.jpg', buffer);
console.log('已生成 output_cover.jpg');
})();8 个高频疑问