47

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?

| improve this question | | | | |
58

first run:

convert do.gif -coalesce temporary.gif

then

convert -size <original size> temporary.gif -resize 24x24 smaller.gif
| improve this answer | | | | |
  • 2
    -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
  • 30
    gifsicle --resize 24x24 > do-24.gif can to this too – sam Aug 14 '13 at 2: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 8:43
  • 5
    convert temporary.gif -resize 24x24 smaller.gif works for me.,without specifying input size. – AMB Aug 21 '16 at 17:24
6

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
| improve this answer | | | | |
4

-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.

| improve this answer | | | | |
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
| improve this answer | | | | |
  • 2
    Please edit your answer to explain what those commands do! – guntbert Nov 26 '19 at 16:35
  • 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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.