使用常规方法,输入 > 绘制文本似乎会消除 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
在保持透明度的同时有效绘制文本的最佳方法是什么?
答案1
根据这发布后,语法是:
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
、palettegen
和paletteuse
,生成一个新的调色板(忽略原始调色板),并使用生成的调色板将原始 RGBA 图像转换为索引图像。
(理论上,当红色是原始调色板的一部分时,有更有效的方法,但我不认为 FFmpeg 支持这种优化)。
测试:
- 从我以前的邮政(RGBA 格式的图像)。
- 将 PNG 图像转换为 GIF 图像(具有透明度):
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
(透明部分周围的红点是新生成的调色板的结果)。