FFmpeg图片加水印与旋转水印
FFmpeg 图片加水印与旋转水印实战指南
在使用 FFmpeg 为图片添加水印时,图片处理与视频不同:图片没有时间变量 t,处理速度极快(通常小于 0.01 秒),且不需要指定视频/音频编码器(如 -c:v h264_nvenc 或 -c:a copy)。
一、 基础固定位置水印
最稳妥、绝不报错的单层文字水印处理方式。
1. 居中半透明水印
ffmpeg -i A1.png -vf "drawtext=fontfile='simhei.ttf':text='baidaoya.com':fontsize=40:fontcolor=white@0.4:x='(w-text_w)/2':y='(h-text_h)/2'" B11.png
x='(w-text_w)/2'与y='(h-text_h)/2':实现水平与垂直双向居中。fontcolor=white@0.4:设置白色、40% 透明度。
2. 右下角边距水印
ffmpeg -i A1.png -vf "drawtext=fontfile='simhei.ttf':text='baidaoya.com':fontsize=30:fontcolor=white@0.5:x='w-text_w-20':y='h-text_h-20'" B11.png
x='w-text_w-20'/y='h-text_h-20':右下角留出 20 像素边距。
3. 上中下多行平铺水印(强力防盗)
无需复杂滤镜,用逗号 , 串联多个 drawtext 选项:
ffmpeg -i A1.png -vf "drawtext=fontfile='simhei.ttf':text='baidaoya.com':fontsize=36:fontcolor=white@0.35:x='(w-text_w)/2':y='h*0.25',drawtext=fontfile='simhei.ttf':text='baidaoya.com':fontsize=36:fontcolor=white@0.35:x='(w-text_w)/2':y='(h-text_h)/2',drawtext=fontfile='simhei.ttf':text='baidaoya.com':fontsize=36:fontcolor=white@0.35:x='(w-text_w)/2':y='h*0.75'" B1111.png
二、 旋转/倾斜水印的坑点与排错
在 drawtext 滤镜中,直接使用 expression_evaluation 或 angle 参数常会因编译版本差异触发 Option not found 报错。
常见失败案例与原因分析:
- 直接对整图使用
rotate滤镜: - 现象: 文字倾斜了,但底图和整个图像框也随之旋转,导致画框被撑大或边缘出现黑色/透明多余边框。
- 原因:
rotate作用于整个画面流,而非单单作用于文字。 - 复制图层(split)后直接对文字层旋转:
- 现象: 画面出现两层图像(一层正的底图,一层旋转的底图+文字)。
- 原因: 复制出来的图层自带原图图像,旋转时把原图也带入旋转了。
三、 倾斜水印的完美解决方案
核心逻辑: 必须先构造一个纯透明的空白画布,在画布上绘制文字并单独执行 rotate 旋转,最后将旋转后的文字画布叠加(overlay)回到未旋转的原图上。
方法 1:基于原图清空透明底版(推荐,全自动适应尺寸)
通过 lutrgb=r=0:g=0:b=0:a=0 将复制出的图层完全清空为 100% 透明画布,无需关心原图分辨率。
ffmpeg -i b1.png -filter_complex "[0:v]format=rgba,split[bg][fg];[fg]lutrgb=r=0:g=0:b=0:a=0,drawtext=fontfile='simhei.ttf':text='baidaoya.com':fontsize=60:fontcolor=white@0.4:x='(w-text_w)/2':y='(h-text_h)/2',rotate=30*PI/180:c=none:ow=rotw(30*PI/180):oh=roth(30*PI/180)[text];[bg][text]overlay=x='(main_w-overlay_w)/2':y='(main_h-overlay_h)/2'" B222.png
方法 2:生成指定分辨率透明画布
适合固定分辨率(如 1920x1080)的场景,利用 color=c=black@0 创建虚拟透明图层。
ffmpeg -i b1.png -filter_complex "[0:v]format=rgba[bg];color=c=black@0:s=1920x1080:d=1,format=rgba,drawtext=fontfile='simhei.ttf':text='baidaoya.com':fontsize=60:fontcolor=white@0.4:x='(w-text_w)/2':y='(h-text_h)/2',rotate=30*PI/180:c=none:ow=rotw(30*PI/180):oh=roth(30*PI/180)[text];[bg][text]overlay=x='(main_w-overlay_w)/2':y='(main_h-overlay_h)/2'" B2222.png
关键参数解析:
format=rgba:强制启用 RGBA 色彩空间,保证 Alpha 透明通道正常传递。30*PI/180:将角度(30 度)转换为弧度,逆时针旋转使用-30*PI/180。c=none:旋转后四周充填透明区域。ow=rotw(...)/oh=roth(...):精准计算旋转后的画布宽高,避免画布过大或被裁切。overlay=x='(main_w-overlay_w)/2':y='(main_h-overlay_h)/2':将旋转后的文字层精准居中叠加至原图。
四、 自动化批量处理脚本
在 Windows CMD 环境下,可使用 for 循环遍历文件夹内所有图片,批量添加倾斜半透明水印:
for %i in (*.png *.jpg) do ffmpeg -i "%i" -filter_complex "[0:v]format=rgba,split[bg][fg];[fg]lutrgb=r=0:g=0:b=0:a=0,drawtext=fontfile='simhei.ttf':text='baidaoya.com':fontsize=60:fontcolor=white@0.4:x='(w-text_w)/2':y='(h-text_h)/2',rotate=30*PI/180:c=none:ow=rotw(30*PI/180):oh=roth(30*PI/180)[text];[bg][text]overlay=x='(main_w-overlay_w)/2':y='(main_h-overlay_h)/2'" "wm_%i"