我有以下命令将 gif 叠加在 png 上方
String command = '-y -i $path.png -i $path.gif -filter_complex '
'[1:v]scale=200:200[i1];'
'[0:v][i1]overlay=100:100'
' -q:v 1 $output.gif';
它工作正常,但问题是我的第一个输入($path.png)
不再像执行之前那样透明。
换句话说:在我执行命令之前,我的命令path.png
有圆角和透明的背景,当我将gif
其叠加在上面时,它完全path.png
起到了去除圆角和背景变黑的效果。
当我覆盖png
而不是gif
这样时,它不会影响path.png
并且一切都很好。
那么如何叠加 gif 并保留其透明度path.png
和圆角呢?谢谢
编辑
这是第一个输入(png)
这是第二个输入(gif)
现在我试图将第二个输入覆盖(gif)
在第一个输入上方(png)
'-y -i png -i gif -filter_complex '
'[1:v]scale=$w:$h[i1];'
'[0:v][i1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)-10'
' -q:v 1 outputGif';
输出
正如你所看到的,它失去了黑色透明和圆角
以下是@Rotem 命令
'-y -i png -i gif -filter_complex '
'"[1:v]scale=$w:$h[i1];'
'[0:v][i1]overlay=(main_w-overlay_w)/2:(main_h-overlay_h)-10:'
'format=auto,split[s0][s1];[s0]palettegen=reserve_transparent=1[p];[s1][p]paletteuse" -q:v 1 outputGif';
输出
它变得完全透明。但我试图保持黑色透明背景像原来一样,而不是完全透明
答案1
为了保持 GIF 和 PNG 的透明度,我们可以使用以下语法:
ffmpeg -y -i in.png -i in.gif -filter_complex "[1:v]scale=200:200[i1];[0:v][i1]overlay=100:100:format=auto,split[s0][s1];[s0]palettegen=reserve_transparent=1[p];[s1][p]paletteuse" -q:v 1 out.gif
overlay=100:100:format=auto,format=rgba
- 强制覆盖输出像素格式为rgba
(保持透明度)。
注意:它适用于 FFmpeg 5.1.2(我没有测试旧版本)。[s0]palettegen=reserve_transparent=1[p];[s1][p]paletteuse
- 为输出 GIF 生成一个新的调色板,如下列答案。
新的调色板与新叠加图像的颜色相匹配。
reserve_transparent=1
生成具有透明度的调色板。
测试: