在 gif 上绘制文本同时保留透明度

在 gif 上绘制文本同时保留透明度

使用常规方法,输入 > 绘制文本似乎会消除 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 中)绘制红色文本。

应用splitpalettegenpaletteuse,生成一个新的调色板(忽略原始调色板),并使用生成的调色板将原始 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

输出(调整大小):
在此处输入图片描述

(透明部分周围的红点是新生成的调色板的结果)。

相关内容