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

46

Я хочу изменить размер такого анимированного GIF-файла do.gif введите описание изображения здесь

Если я это сделаю, convert do.gif -resize 24x24\! do-24.gifя получу его изменение в do-24.gif, но не анимированныйвведите описание изображения здесь

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

Zuba
источник

Ответы:

56

первый забег:

convert do.gif -coalesce temporary.gif

тогда

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
phipsalabim
источник
2
-coalesce«Создает полный вид анимации в каждой точке, немного похожий на настоящую киноленту, а не на последовательность анимации. Такая последовательность, известная как коалесцированная анимация , намного легче изучать, редактировать, модифицировать и повторно оптимизировать».
Сэм
28
gifsicle --resize 24x24 > do-24.gifможет к этому тоже
Сэм
2
Обратите внимание, что объединенное представление намного больше, чем оптимизированное (в моем тесте в 3,2 раза), а изменение размера приводит к объединенному изображению, которое также может быть больше исходного размера файла (в моем тесте в 2,3 раза), даже если разрешение меньше Когда я пытаюсь изменить размер напрямую, он выглядит нормально и имеет небольшой размер файла, хотя, возможно, он просто работает для этого изображения.
Эндолит
1
gifsicle произвел намного лучший, оптимизированный вывод для моего случая использования. Спасибо @ Сэм!
sj26
4
конвертируйте временный формат ..gif -resize 24x24 меньше ..gif работает для меня., без указания размера ввода.
AMB
5

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

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

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
Петер Перхач
источник
3

-coalesce + -deconstruct

После -coalesceвы, вероятно, захотите добавить -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

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

из-coalesce.gif

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

из-deconstruct.gif

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

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

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

  • out.gif: Все кадры 256x256или больше, и огромные, около 5MiB, почему?

    Визуально неверно, поскольку эти приблизительно 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 из неподвижных изображений (желательно с командной строкой)?

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

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

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник