使用常规方法, input > drawtext 似乎删除了 GIF 的透明度并弄乱了颜色
ffmpeg -i test.gif drawtext=text='Test':fontcolor=red:fontsize=24 output.gif
我一直尝试使用过滤器复合体的 palettegen 和 paletteuse,但这些需要 drawtext 不提供的参数:
ffmpeg -i banner.gif -filter_complex "[0:v] drawtext=text='Test':fontcolor=red:fontsize=24 [a]; [a] palettegen=reserve_transparent=1 [b]; paletteuse [a][b]" output.gif
在保持透明度的同时有效绘制文本的最佳方法是什么?
根据这篇文章,语法是:
ffmpeg -y -i test.gif -filter_complex "drawtext=text='Test':fontcolor=red:fontsize=24,split[s0][s1];[s0]palettegen=reserve_transparent=1[p];[s1][p]paletteuse" output.gif
我的猜测是 FFmpeg 将 GIF 解码为原始 RGBA 格式并在 RGBA 图像(在 RAM 中)上绘制红色文本。
应用
split
和生成新调色板(忽略原始调色板),并使用生成的调色板将原始 RGBA 图像转换为索引图像palettegen
。 (理论上,当红色是原始调色板的一部分时,有更有效的方法,但我不认为 FFmpeg 支持这种优化)。paletteuse
测试:
ffmpeg -y -i 6qepl.png -filter_complex "split[s0][s1];[s0]palettegen=reserve_transparent=1[p];[s1][p]paletteuse" test.gif
ffmpeg -y -i test.gif -filter_complex "drawtext=text='Test':fontcolor=red:fontsize=120,split[s0][s1];[s0]palettegen=reserve_transparent=1[p];[s1][p]paletteuse" output.gif
输出(调整大小):
(透明部分周围的红点是新生成的调色板的结果)。