ffmpeg 旋转图像显示混叠和模糊

ffmpeg 旋转图像显示混叠和模糊

我正在使用 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

在此处输入图片描述

输入在这里,巴格达.png搜索.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

结果:
在此处输入图片描述

相关内容