使用 ffmpeg 制作 GIF:“transparency_color”有什么作用?

使用 ffmpeg 制作 GIF:“transparency_color”有什么作用?

我一直在使用 FFmpeg 从 PNG 制作 GIF,使用如下命令:

ffmpeg -framerate 10 -pattern_type glob -i'*.png'-filter_complex“[0:v] split [a][b];[a] palettegen=reserve_transparent=on:transparency_color=ffffff [p];[b][p] paletteuse”-gifflags +transdiff -loop 0 -y OutputGif.gif

我一直在尝试(但失败了)了解“transparency_color=”选项的实际作用。显然,此设置的默认值是“lime”,尽管我看到网上的很多示例都改为设置“transparency_color=ffffff”。官方文档说它将“设置将用作透明背景的颜色”。基于此,我认为它指定的可能是在查看 GIF 时应在透明像素中显示的颜色,如果该透明像素“下面”没有任何东西;但情况似乎并非如此,除非大多数查看器只是覆盖该指令或其他什么。那么有人知道这个设置实际上有什么作用吗?谢谢!

编辑:我联系了一位帮助实现 FFmpeg 中 GIF 支持的开发人员,我现在的理解是:生成的调色板包含 256 种颜色,根据输入的 PNG 选择,用于将输入像素映射到输出 GIF 中的像素。当 reserve_transparent=on 时,这 256 种颜色中的 1 种被选为某个值,即“transparency_color”,但调色板中的这 1 个“插槽”仅用作透明度的代号 - 只有输入 PNG 中的透明像素才会映射到输出 GIF 中的透明像素,而 transparent_color 只是用于在中间处理中将此透明度数据存储在调色板中的颜色。因此,人们不太可能需要使用 transparent_color 选项来更改默认值(我相信默认值是“lime”)。理想情况下,最好选择 transparent_color 作为您在输入 PNG 中,以避免调色板中实际可见颜色和透明度代号之间的命名冲突。但是,与我的问题中的命令一样,我经常在有大量 ffffff 空白的 PNG 上使用 transparent_color=ffffff,并且没有出现任何严重错误,所以也许这种冲突无论如何都可以以某种方式解决。无论如何,似乎 transparent_color 所做的确实不是要做的是在输入 PNG 中选择一种颜色,以便最终在输出 GIF 中呈现透明效果。要做到这一点,colorkey 过滤器显然是正确的 FFmpeg 工具(例如https://engineering.giphy.com/modifying-ffmpeg-to-support-transparent-gifs/)。

答案1

“透明色”是映射到透明的颜色。

例如,如果您的网页上有该图像,并且您使用样式表或绝对定位或其他方法将图像叠加在其他项目之上,则 gif 中具有该颜色的任何位置,其后面的项目(包括页面的背景)都会显示出来,而不是显示该颜色。

相关内容