FFmpeg滤镜以点为中心旋转图像

3

有人知道如何使用FFmpeg -vf rotate将图像旋转到起始点(左上角)而不是中心点(默认)吗?

在这个例子中,我尝试将一个红色正方形图像(test_sq.png)从其起始点绕30度旋转,并将其放置在位于423:259in.png上,得到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

为了进行可视化:

结果

如您所见,它从中心点旋转,并裁剪了原始图像,这并不是很好。是否有建议或想法可以实现我所需要的效果?

1个回答

7

旋转滤镜中的输出宽度和高度初始化为输入的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

对于非正方形的图片,
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

对于非正方形的图像,且旋转角度为负数:

您将需要手动提供原始图像的高度值 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

您需要手动提供原始图像的宽度(iw)

对于没有内置alpha通道的图片,在rotate滤镜之前插入format=bgra


由于角度是以弧度来衡量的,而PI弧度等于180度,PI/6 = 30PI/180 = 30度。您可以继续使用之前的表示法,例如(20PI/180)表示20度。 - Gyan
是的,谢谢!(我刚刚注意到你在发表评论时,我删除了我的评论,很抱歉),不管怎样,它起作用了,谢谢! - SebSob
现在当我用非方形图像进行测试时,它不能正确工作,向左移动太多了,有什么想法吗?例如,使用scale=333:52。你是不是故意只针对方形图像做出回答的? - SebSob
负X度的旋转与正(360-X)度的旋转是相同的。 - Gyan
好的,但是如果我使用 -35*PI/180 或者 325*PI/180 命令运行,我会得到相同的结果 - SebSob
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接