58

I want to resize such an animated GIF file do.gif enter image description here

If I do convert do.gif -resize 24x24\! do-24.gif I get it resized in do-24.gif but not animated enter image description here

How to resize it right way to get the same animation?

zuba
  • 2,393

4 Answers4

66

first run:

convert do.gif -coalesce temporary.gif

then

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
phipsalabim
  • 2,640
  • Great! It works!!! – zuba Feb 18 '13 at 18:26
  • 4
    -coalesce "creates a complete view of the animation at each point, a bit like a true film strip, rather than an animation sequence. Such a sequence, known as a Coalesced Animation is much easier to study, edit, modify and re-optimize." – sam Aug 12 '13 at 19:26
  • 36
    gifsicle --resize 24x24 > do-24.gif can to this too – sam Aug 14 '13 at 02:20
  • 2
    Note that the coalesced view is much larger than the optimized one (3.2 times in my test), and the resizing produces a coalesced image, which can also be larger than the original in file size (2.3 times in my test) even if the resolution is smaller. When I try resizing directly it looks fine and has a small file size, though maybe it just works for this image. – endolith Dec 27 '14 at 21:49
  • 1
    gifsicle produced a much better, optimized output for my use case. Thanks @sam! – sj26 Jul 15 '16 at 08:43
  • 1
    gifsicle reduced quality in my case –  Aug 21 '16 at 17:17
  • 6
    convert temporary.gif -resize 24x24 smaller.gif works for me.,without specifying input size. –  Aug 21 '16 at 17:24
  • +sam wait, isn't that gifsicle command missing the input gif? – mimoralea Dec 13 '17 at 14:44
  • Yes, gifsicle command should be gifsicle do.gif --resize 24x24 > do-resized.gif – Harald Nordgren Jan 04 '18 at 18:07
  • While the answer works (thanks!), what is the explanation simple convert doesn't do that? – Grzegorz Oledzki May 11 '18 at 07:19
  • Users will likely want to re-optimize their GIF with a -deconstruct after -coalesce: https://askubuntu.com/questions/257831/how-can-i-resize-an-animated-gif-file-using-imagemagick/1104062#1104062 – Ciro Santilli OurBigBook.com Dec 23 '18 at 18:55
  • Tried these commands and the gif was indeed resized. However, the file size increased 3 times. Is there a way to fix this? – JAT86 Nov 05 '19 at 03:36
21

I was looking for imagemagick solution as I am familiar with it, but in the end I went with @sam's suggestion of gifsicle. It did just what I wanted, no hassle.

Can optimize resulting file size in so many ways, but I went with just reducing the size and reducing number of colors. Worked like a charm:

gifsicle --resize 48x48 --colors 16 original.gif > smaller.gif
Pablo Bianchi
  • 15,657
11

-coalesce + -deconstruct

After -coalesce, you likely want to add a -deconstruct:

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

The root cause of the problem is that your input GIF was properly minimized: GIF allows the next frame to be just the modified rectangle from the previous one at an offset.

-coalesce then expands all the frames to the original size, which makes the resize work, but it does not re-compress the frames again as your input image: -deconstruct is needed for that!

Using the test data from this answer: How do I create an animated gif from still images (preferably with the command line)? we can see this clearly with 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

out-coalesce.gif

enter image description here

out-deconstruct.gif

enter image description here

First, we see how to input file, out-convert.gif, was in fact compressed, since frame 2 is only 516x516 at offset 252+257, while the full sized frame 1 is 1024x1024.

Then, if we compare the three conversions:

  • out.gif: All frames are 256x256 or larger, and huge at about 5MiB, TODO why?

    Visually incorrect, since those approximately 256x256 frames have a non-zero offset, e.g. 125+128 for frame 2!

  • out-coalesce.gif: all frames are 256x256 and have the correct offset 0+0.

    Output looks visually correct, but the output file size is 2.0 MiB, which is larger than out-deconstruct.gif

  • out-deconstruct.gif: compressed frames, final output size 1.9 MiB.

    Not considerably smaller than out-coalesce.gif, but I think this is just because the black ground compresses really well, and it could be very significant in general.

ffmpeg and gifsicle

I also tried out the following commands:

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

and both produced an even smaller correctly looking 1.5 MiB output.

See also: How do I create an animated gif from still images (preferably with the command line)?

TODO: why can they make it smaller than convert? Are they just selecting better more minimal diff rectangles, or something else?

Tested in Ubuntu 18.10, ffpmeg 4.0.2-2, ImageMagick 6.9.10-8.

0
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
guntbert
  • 13,134
  • 2
    Please [edit] your answer to explain what those commands do! – guntbert Nov 26 '19 at 16:35
  • 1
    The question is about ImageMagick, not ffmpeg. – karel Nov 26 '19 at 16:44
  • 2
    Answers that recommend a solution that uses a different tool from the one asked about are generally considered okay. However, @dieland167 I recommend you [edit] this to clarify if the method you're recommending works when the input is an animated gif--since that's essential to the problem described in the question--and to show at least one example of such usage (either in addition to, or instead of, the existing example). – Eliah Kagan Nov 26 '19 at 17:22