Как я могу изменить размер анимированного GIF-файла, используя ImageMagick?
Я хочу изменить размер такого анимированного GIF-файла do.gif
Если я сделаю convert do.gif -resize 24x24\! do-24.gif
Я получаю его изменение в do-24.gif, но не анимированный
Как правильно изменить размер, чтобы получить ту же анимацию?
3 ответа
Первый забег:
convert do.gif -coalesce temporary.gif
затем
convert -size <original size> temporary.gif -resize 24x24 smaller.gif
Я искал решение для imagemagick, поскольку я знаком с ним, но в конце концов я согласился с предложением @ sam gifsicle
( https://www.lcdf.org/gifsicle/). Он сделал то, что я хотел, без проблем.
Можно оптимизировать размер получаемого файла многими разными способами, но я пошел только с уменьшением размера и уменьшением количества цветов. Работал как шарм:
gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
-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.
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