Почему, когда я накладываю логотип поверх видео, белая часть логотипа становится прозрачной?

Я накладываю с помощью следующей команды:

ffmpeg -i video.mp4 -i logo.png -filter_complex "[1]geq=r='r(X,Y)':a=0.1[a];[0][a] overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0" out.mp4

Я попытался настроить непрозрачность, используя

fmpeg -i video.mp4 -i logo.png -filter_complex "[1]format=rgba,geq=r='r(X,Y)':a='1*alpha(X,Y)'[a];[0][a] overlay=x='if(gte(t,2), -w+(t-2)*20, NAN)':y=0" out.mp4

но он все еще прозрачен в части белого цвета.

Кажется, что часть белого цвета имеет прозрачность 0, из-за чего вторая команда не работает.

Есть ли причина, по которой это происходит? Логотип, который я пробовал,

введите описание изображения здесь

Как сохранить белый цвет?

Ответы (1)

Белого цвета нет. Это цвет фона просвечивающей страницы. Ваш входной PNG представляет собой 8-битное изображение с палитрой, где черный цвет указывает на прозрачность.

Примените следующий фильтр к изображению, чтобы преобразовать черные пиксели в белые и установить равномерную прозрачность.

geq=r='if(p(X,Y),p(X,Y),255)':g='if(p(X,Y),p(X,Y),255)':b='if(p(X,Y),p(X,Y),255)':a=0.1
Я не совсем понимаю, что вы имеете в виду под черным цветом. Я не вижу никакого черного цвета. Кроме того, не могли бы вы объяснить, что такое p(X,Y)? В документации говорится о пикселях в текущей плоскости, что довольно расплывчато.
Фактический цвет, сохраненный в PNG в области «f», — черный, который зритель интерпретирует как прозрачность. Мой geq expr проверяет, не черный ли пиксель. Если это так, он сохраняет его, иначе меняет его на белый.