-1

Я пытаюсь преобразовать 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 ответ1

1

Причина этого, очевидно, в том, что каждый второй кадр в оригинальном gif-изображении пуст. Каждый пустой слой должен сливаться с предыдущим, а не заменять его, так же как ImageMagick позволяет с помощью команды dispose . Вы можете посмотреть на это ближе с Gimp.

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

Изменить: так как изображения GIF являются пользовательским вводом, я боюсь, что нет 100% уверенного способа автоматизировать это. Вы можете определить, является ли рамка пустой (содержит один цвет), но вы намеренно будете сокращать изображения gif, содержащие одноцветные рамки. Кроме того, могут быть одноцветные рамки, которые добавляют только частичное наложение.

Вот Баш скрипт Неочищенный удаления одиночных цветных кадров с использованием информации из ImageMagick идентифицировать команду.

#!/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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .