我正在使用 ffmpeg 将一张图片叠加到另一张图片上,同时将图片旋转到某个角度。如果没有旋转,输出结果对我来说看起来不错;如果有旋转,边缘会出现混叠和模糊效果。我这里漏掉了什么?有什么办法可以避免这种情况吗?
# no rotation, looks good
ffmpeg -i bgp.png -i search.png -filter_complex "[0:v][1:v]overlay=x=100:y=100" output0.png
# rotate 10 degree, looks bad
ffmpeg -i bgp.png -i search.png -filter_complex "[1:v]rotate=10*PI/180[r];[0:v][r]overlay=x=100:y=100" output10.png
# rotate 10 degree showing all, look bad
ffmpeg -i bgp.png -i search.png -filter_complex "[1:v]rotate='10*PI/180:c=none:ow=hypot(iw,ih):oh=ow'[r];[0:v][r]overlay=x=100:y=100" output10_1.png
答案1
search.png
我们可以通过在旋转之前填充透明背景来解决大部分问题:
ffmpeg -y -i bgp.png -i search.png -filter_complex "color=black@0:100x100,format=rgba[c];[c][1:v]scale2ref=w='iw+20':h='ih+20'[c0][v1];[c0][v1]overlay=10:10,format=rgba[padded];[padded]rotate='10*PI/180:c=none:ow=hypot(iw-20,ih-20):oh=ow'[r];[0:v][r]overlay=x=100:y=100:format=rgb" -frames:v 1 -update 1 output10_1.png
color=black@0:100x100,format=rgba[c]
- 创建透明的 100x100 视频。[c][1:v]scale2ref=w='iw+20':h='ih+20'[c0][v1]
- 将透明视频的分辨率缩放到search.png
每个轴上额外增加 20 个像素。[c0][v1]overlay=10:10[padded]
- 覆盖search.png
透明视频。[padded]rotate='10*PI/180:c=none:ow=hypot(iw-20,ih-20):oh=ow'[r];[0:v][r]overlay=x=100:y=100
- 旋转并叠加填充的图像。
填充后search.png
的外观如下(棋盘图案代表透明度):
如果覆盖位置周围有纯色背景,我们可以得到更好的结果。
我们可以使用背景色来填充,而不是使用透明色:
ffmpeg -y -i bgp.png -i search.png -filter_complex "[0:v]crop='iw/2-5':'ih/2-5':10:10,format=rgba[c];[c][1:v]scale2ref=w='iw+20':h='ih+20'[c0][v1];[c0][v1]overlay=10:10:format=rgb[padded];[padded]rotate='10*PI/180:c=none:ow=hypot(iw-20,ih-20):oh=ow'[r];[0:v][r]overlay=x=100:y=100:format=rgb" -frames:v 1 -update 1 output10_2.png