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_evaluationangle 参数常会因编译版本差异触发 Option not found 报错。

常见失败案例与原因分析:

  1. 直接对整图使用 rotate 滤镜:
  2. 现象: 文字倾斜了,但底图和整个图像框也随之旋转,导致画框被撑大或边缘出现黑色/透明多余边框。
  3. 原因: rotate 作用于整个画面流,而非单单作用于文字。
  4. 复制图层(split)后直接对文字层旋转:
  5. 现象: 画面出现两层图像(一层正的底图,一层旋转的底图+文字)。
  6. 原因: 复制出来的图层自带原图图像,旋转时把原图也带入旋转了。

三、 倾斜水印的完美解决方案

核心逻辑: 必须先构造一个纯透明的空白画布,在画布上绘制文字并单独执行 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"

标签: none

添加新评论