ImageMagick: GIF для спрайта - каждый второй кадр пуст
Я пытаюсь преобразовать GIF в последовательность спрайтов (в.png), используя ImageMagick. Прямо сейчас я использую эти две команды:
convert -layers dispose ezgif.gif tmp.gif
montage tmp.gif -tile x1 -geometry '1x1+0+0<' -alpha On -background 'rgba(0, 0, 0, 0.0)' -quality 100 seq.png
Это работает очень хорошо на большинстве GIF-файлов, но на этом нет.
https://i.projectbea.st/WF2ygx.gif
Здесь все выглядит хорошо. Но когда я конвертирую его, вы можете видеть, что каждый второй кадр пуст.
https://i.projectbea.st/pJAlq1.png
Почему и как это исправить?
1 ответ
Причина этого, очевидно, в том, что каждый второй кадр в оригинальном gif-изображении пуст. Каждый пустой слой должен сливаться с предыдущим, а не заменять его, так же как ImageMagick позволяет с помощью команды dispose. Вы можете посмотреть на это ближе с Gimp.
Чтобы удалить пустые кадры, вам придется сделать это вручную или с помощью скрипта, например. разбить изображение на серию файлов, удалить каждый второй кадр и объединить их обратно в исходный GIF. Пример здесь.
Изменить: так как изображения GIF являются пользовательским вводом, я боюсь, что нет 100% уверенного способа автоматизировать это. Вы можете определить, является ли рамка пустой (содержит один цвет), но вы намеренно будете сокращать изображения gif, содержащие одноцветные рамки. Кроме того, могут быть одноцветные рамки, которые добавляют только частичное наложение.
Вот грубый скрипт bash, удаляющий одноцветные кадры с использованием информации из команды imagemagick identifier.
#!/bin/bash
convert animation.gif +adjoin tmp_%04d.png
j=0
for i in $(ls tmp_*.png); do
if [ $(identify -verbose $i | grep Colors: | awk '{ print $2; }') != "1" ]; then
cp $i select_$(printf %04d $j).png;
(( j++ ))
fi
done
montage $(ls select_*) -tile x1 -geometry '1x1+0+0<' -alpha On -background 'rgba(0, 0, 0, 0.0)' -quality 100 result.png