如何在执行 png 上的 gif 后透明地保留输入

如何在执行 png 上的 gif 后透明地保留输入

我有以下命令将 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生成具有透明度的调色板。

测试:

out.gif
在此处输入图片描述

in.png
在此处输入图片描述

in.gif
在此处输入图片描述

相关内容