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
Другие вопросы по тегам