江湖夜雨十年灯

使用 ffmpeg 复刻水印快捷方式

李二花 / 2023-09-24


基本命令

使用 exiftool

# 使用 homebrew 安装 exiftool  homebrew install exiftool
# 获取光圈,快门 ISO 等信息
exiftool image.jpg

# 获取 GPS 信息
exiftool -gpslatitude -gpslongitude image.jpg

# 获取 TIFF 信息
exiftool -tiff image.jpg

使用 ffmpeg

# 获取图片的 exif 信息 
ffmpeg -i picture_name
# picture_name 指的就是图片的名字(需要后缀)

# 获取图片的光圈,焦距,ISO 等信息
ffprobe -v quiet -print_format json -show_entries stream_tags=lens,aperture,iso input.mp4

# 生成空白图片 
ffmpeg -f lavfi -i color=c=white:s=7008x5490 -frames:v 1 output.png
# white 指的是背景的颜色,可以替换为 black, red 等, 7008x5490 指的是要生成的图片的像素,output.png 是输出的文件的路径和名字

# 叠加图片和颜色块
ffmpeg -i input.jpg -filter_complex "color=c=blue:s=200x200 [color]; [0:v][color] overlay=100:100" output.jpg
# s=200x200 指代是色块的大小,blue 是色块的颜色,可以用 #00FF00 等来代替,100:100 表示开始叠加的位置
# 这个示例将在原始图片的位置(100,100)插入了一个蓝色的200x200大小的颜色块。
# 例子: ffmpeg -i ./result.jpg -filter_complex "color=c=#545454:s=200x200 [color]; [0:v][color] overlay=100:100" result_color.jpg
# 颜色还可以用 rgb(255, 0, 0) 这种方式

# 叠加图片和图片
ffmpeg -i background.png -i input.jpg -filter_complex "overlay=10:10" output.jpg
# background.png 指的是叠加的背景图,input.jpg 是前景图,output.jpg 是输出的图片的路径和名字

# 叠加文字
ffmpeg -i input.jpg -vf "drawtext=text='your-text-input':x=100:y=5000:fontsize=24:fontcolor=white" result.jpg
# input.jpg 要加文字的图片,your-text-input 要输入的文字,x,y后面的数字是放在图片的位置,fontsize 是文字大小,color 是文字颜色,result.jpg 是输出位置与名字
ffmpeg -i input.mp4 -vf "drawtext=text='Your Text Here':x=100:y=100:fontsize=24:fontfile=/path/to/your/font.ttf" output.mp4
# 这个例子中可以设置 fontfile 使用不同的字体

# 叠加多个文字
ffmpeg -i input.mp4 -vf "drawtext=text='Text1':x=100:y=100:fontsize=24, drawtext=text='Text2':x=200:y=200:fontsize=24, drawtext=text='Text3':x=300:y=300:fontsize=24" output.mp4

# 叠加图片和文字
ffmpeg -i background.jpg -i input.png -filter_complex "[0:v][1:v]overlay=10:10,drawtext=text='Your Text Here':x=20:y=H-50:fontsize=24:fontcolor=white" output.jpg

# 叠加图片和多个文字
ffmpeg -i background.jpg -i input.png -filter_complex "[0:v][1:v]overlay=10:10,drawtext=text='Your Text Here':x=20:y=H-50:fontsize=24:fontcolor=white, drawtext=text='Text2':x=200:y=200:fontsize=24" output.jpg

目标

把上图使用 ffmpeg 转成下图

脚本

本来想完全使用 shell 脚本处理,奈何发现 exif 信息有一些处理如果用 shell 的话,会很繁琐,因此使用胶水语言 python 处理具体的文字逻辑,然后将命令 ffmpeg 和 exiftool 胶合起来。

图片的基本信息

索尼拍摄的图片的像素是 7008 × 4672, 快捷指令生成的图片的像素是 7008x5490

使用 AutoCAD 大概把对应关系画了下,然后给出了一个可以接受的比例关系

最后整理的位置关系比较复杂,同时要对竖向的进行额外特殊的处理。

脚本步骤

基本就是按照一个好的图片解决方案中的步骤来的,对很多方法做了抽象,提供了可以使用的函数 api 。

.
├── README.md
├── config.py   // 配置文件
├── font_finder.py // 字体在不同的操作系统的选择
├── generate_links.py  // 图片和上传到图床的文件的对应关系
├── logger.py   // 日志模块
├── pic_compress.py  // 图片压缩
├── pic_ffmpeg.py    // ffmpeg 图片操作 api
├── pic_upload.py    // picgo 上传图床 api
├── pic_watermark.py  // 水印制作具体流程
├── requirement.txt   // python 依赖的非 build-in 库
├── run_camera.sh     // 处理相机图片的一站式脚本(压缩,上传,加水印,关联链接)
├── run_normal.sh     // 处理普通图片的一站式脚本(压缩,上传,关联链接)
├── run_picture_compress_all.sh  // ffmpeg shell 压缩入口 1
├── run_picture_compress_small.sh  // ffmpeg shell 压缩入口 2
├── run_picture_compress_thumb.sh // ffmpeg shell 压缩入口 3
└── utils.py  // 工具箱

参考: