有谁知道如何使用 FFmpeg -vf 旋转将图像旋转到其起点(左上角)而不是中心点(默认)?
在这个例子中,我尝试将一个红色方形图像 ( test_sq.png )从in.png上的起点旋转30度,放置在 coord 423:259导致out.png。
这是我的命令:
ffmpeg -y -i in.png -pix_fmt bgra -strict experimental -vf movie=test_sq.png scale=279:279 rotate=30*PI/180:c=none:oh=ow [sticker]; [in][sticker] overlay=423:259 [out] -s 1280x720 out.png
Run Code Online (Sandbox Code Playgroud)
将其可视化:

正如您所看到的,它从其中心点旋转并剪辑了原始图像,效果不是很好。任何人都有如何实现我需要的建议或想法?
您在旋转过滤器中的输出宽度和高度被初始化为输入 W/H,并且不会自动计算以在旋转后显示整个图像。改用这个,
ffmpeg -y -i in.png -i test_sq.png \
-filter_complex "[1]scale=279:279,setsar=1,rotate=PI/6:c=none:ow=rotw(PI/6):oh=roth(PI/6)[s];
[0][s]overlay=423-w*sin(PI/6)/(sin(PI/6)+cos(PI/6)):259,scale=hd720[out]" \
-map "[out]"-pix_fmt bgra out.png
Run Code Online (Sandbox Code Playgroud)
对于非方形图像,
ffmpeg -y -i in.png -i test_sq.png \
-filter_complex "[1]scale=279:279,setsar=1,rotate=PI/6:c=none:ow=rotw(PI/6):oh=roth(PI/6)[s];
[0][s]overlay=423-ih*sin(PI/6):259,scale=hd720[out]" \
-map "[out]"-pix_fmt bgra out.png
Run Code Online (Sandbox Code Playgroud)
(您必须手动提供ih(原始图像的高度)的值。
对于非方形图像,负旋转
ffmpeg -y -i in.png -i test_sq.png \
-filter_complex "[1]scale=279:279,setsar=1,rotate=-PI/6:c=none:ow=rotw(-PI/6):oh=roth(-PI/6)[s];
[0][s]overlay=423:259-iw*sin(PI/6),scale=hd720[out]" \
-map "[out]"-pix_fmt bgra out.png
Run Code Online (Sandbox Code Playgroud)
(您必须手动提供iw(原始图像的宽度)的值。
对于没有内置 alpha 的图像,format=bgra在rotate过滤器之前插入。