Как я могу изменить размер анимированного GIF-файла, используя ImageMagick?

Я хочу изменить размер такого анимированного GIF-файла do.gif enter image description here

Если я сделаю convert do.gif -resize 24x24\! do-24.gif, я получу его изменение в do-24 .gif но не анимированные enter image description here

Как правильно изменить размер, чтобы получить ту же анимацию?

46
задан 18 February 2013 в 21:39

4 ответа

первый запуск:

convert do.gif -coalesce temporary.gif

затем

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
0
ответ дан 18 February 2013 в 21:39

Я искал решение для imagemagick, поскольку я знаком с ним, но в конце концов я согласился с предложением @ sam gifsicle ( https://www.lcdf.org/gifsicle/ ) , Он сделал то, что я хотел, без хлопот.

Можно оптимизировать размер получаемого файла самыми разными способами, но я просто уменьшил размер и уменьшил количество цветов. Работал как шарм:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif

0
ответ дан 18 February 2013 в 21:39

-coalesce + -deconstruct

После -coalesce, Вы, вероятно, хотите добавить a -deconstruct:

convert in.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif

Первопричина проблемы состоит в том, что Ваш вход GIF был правильно минимизирован: GIF позволяет следующему кадру быть просто измененным прямоугольником от предыдущего при смещении.

-coalesce затем разворачивает все кадры до первоначального размера, который делает изменить размер работу, но это не повторно сжимает кадры снова как Ваше входное изображение: -deconstruct необходим для этого!

Используя данные тестирования из этого ответа: Как я создаю анимированный gif из неподвижных изображений (предпочтительно с командной строкой)? мы видим это ясно с identify:

$ identify out-convert.gif | head -n 3
out-convert.gif[0] GIF 1024x1024 1024x1024+0+0 8-bit sRGB 256c 16.7865MiB 0.020u 0:00.019
out-convert.gif[1] GIF 516x516 1024x1024+252+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019
out-convert.gif[2] GIF 515x520 1024x1024+248+257 8-bit sRGB 256c 16.7865MiB 0.030u 0:00.019

$ convert out-convert.gif -resize 256x out.gif
$ identify out.gif | head -n 3
out.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[1] GIF 256x256 256x256+125+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009
out.gif[2] GIF 256x258 256x256+123+128 8-bit sRGB 256c 5.0479MiB 0.000u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x out-coalesce.gif
$ identify out-coalesce.gif | head -n 3
out-coalesce.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[1] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009
out-coalesce.gif[2] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.97683MiB 0.010u 0:00.009

$ convert out-convert.gif -coalesce -resize 256x -deconstruct out-deconstruct.gif
$ identify out-deconstruct.gif | head -n 3
out-deconstruct.gif[0] GIF 256x256 256x256+0+0 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[1] GIF 135x135 256x256+60+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010
out-deconstruct.gif[2] GIF 135x136 256x256+59+61 8-bit sRGB 256c 1.87942MiB 0.010u 0:00.010

out.gif

enter image description here

-coalesce.gif

enter image description here

-deconstruct.gif

enter image description here

Во-первых, мы видим, как ввести файл, out-convert.gif, был на самом деле сжат, так как кадр 2 только 516x516 при смещении 252+257, в то время как кадр в натуральную величину 1 1024x1024.

Затем если мы сравниваем эти три преобразования:

  • out.gif: Все кадры 256x256 или больше, и огромный на уровне приблизительно 5 МиБ, TODO, почему?

    Визуально неправильный, начиная с тех приблизительно 256x256 кадры имеют ненулевое смещение, например. 125+128 для кадра 2!

  • out-coalesce.gif: все кадры 256x256 и имейте корректное смещение 0+0.

    Выходные взгляды визуально исправляют, но размер выходного файла составляет 2,0 мебибайт, который больше, чем out-deconstruct.gif

  • out-deconstruct.gif: сжатые кадры, размер окончательного результата 1,9 мебибайт.

    Не значительно меньший, чем out-coalesce.gif, но я думаю, что это просто, потому что черная земля сжимается действительно хорошо, и это могло быть очень значительно в целом.

ffmpeg и gifsicle

Я также испытал следующие команды:

ffmpeg -i out-convert.gif -vf scale=256:-1 out-ffmpeg-small.gif
gifsicle --resize 256x256 out-convert.gif > out-gifsicle.gif

и оба произвели еще меньший правильно смотрящий вывод на 1,5 мебибайт.

См. также: Как я создаю анимированный gif из неподвижных изображений (предпочтительно с командной строкой)?

TODO: почему они могут сделать это меньшим, чем convert? Они просто выбирают лучше больше минимальных различных прямоугольников или что-то еще?

Протестированный в Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.

3
ответ дан 18 February 2013 в 21:39
wget https://upload.wikimedia.org/wikipedia/commons/f/f9/STS-132_Liftoff_Space_Shuttle_Atlantis.ogv
ffmpeg -i STS-132_Liftoff_Space_Shuttle_Atlantis.ogv -r 15 -vf scale=512:-1 \
 -ss 00:00:17 -to 00:00:22 STS-132_Liftoff_Space_Shuttle_Atlantis.gif
0
ответ дан 26 November 2019 в 16:12

Другие вопросы по тегам:

Похожие вопросы: