I’ve been continuing my search on the ultimate gif-making workflow and came across two more tools.
Both of these are command line tools available across platforms.
I first heard about gifsicle a while ago as a tool to optimize gifs. I tried it on some of the larger ffmpeg-created gifs and it didn’t seem to do a whole lot. You can specify three levels of optimization. The lowest level didn’t have any effect. The highest level took a single megabyte off of a 27 mb gif. Not really worth it.
You can also use gifsicle to reduce colors in an existing gif. This got considerable results, but at a loss of quality. I think it would be better to do this in the palette creating stage.
But gifsicle can also create gifs from a sequence of images, just like ImageMagick and ffmpeg. Big drawback on this workflow though: the source images have to be gifs themselves. OK, I was able to put together a quick ImageMagick script to convert all my pngs to gifs. But that took quite a while. I didn’t time it, but I feel like it was more than a minute for 300 frames. As for size, it was almost right in between the sizes produced by ImageMagic and ffmpeg.
But the additional conversion process put this one out of the running for me.
I think this is a very new solution. And it’s written in Rust, which tends to give projects a lot of street cred these days.
After using it, I am impressed.
The syntax is pretty straightforward:
gifski --fps 30 frames/*.png -o out.gif
I don’t think I really need to explain any of that.
Performance-wise, it hits a pretty sweet spot. Not as fast as ffmpeg, but image sizes are way smaller. Not as small as ImageMagick’s output, but way faster.
Here’s the results I got:
FFMPEG: 5.780 s gifski: 19.341 s ImageMagick: 43.809 s gifsicle: with image conversion needed, way too long
ImageMagick: 13 mb gifski: 16 mb gifsicle: 18 mb FFMPEG: 27 mb
I feel like it’s pretty straightforward.
If you are going for size, nothing beats ImageMagick, but it takes forever.
If you are going for speed, nothing beats ffmpeg.
If you are dealing with gifs as your source image sequence, gifsicle might be a good compromise.
But I think the overall winner is gifski in terms of hitting that sweet spot. I’ll be using it a lot more in coming weeks and days and update with any new findings.
I should also note that all my tests have been on grayscale animations. Full color source images could change everything.
A note on quality and duration
All of the gifs produced seemed to me to be of very comparable quality. I didn’t see any quality issues in any of them. To my eye, they seemed like the same gif, with one exception – duration.
Actually I discovered today that ImageMagick’s
delay property will truncate decimal arguments. Or maybe round them off. I’ve gotten conflicting info. Anyway, I’ve been using a delay of 3.33 to make them run at 30 fps. But it turns out it just puts a delay of 3/100’s of a second. So they’ve actually been running a bit faster than 30fps. Somehow, the gifs created with ffmpeg and gifski do seem to run at the exact fps specified. Specifically, a 300 frame animation set to run at 30 fps should run for 10 seconds, as the ffmpeg and gifski gifs do. But ImageMagick’s finishes in 9 seconds.
I tried some other formats for the
delay parameter. Apparently you can specify units precisely, like
-delay 33,1000 for 33/1000’s of a second, or even
-delay 333,10000 for 333/10000’s of a second. But this doesn’t make a difference. From what I understand, the gif format itself does the 100th of a second rounding. If so, I’m not sure what ffmpeg and gifsicle are doing to make it work correctly.
Big deal? Maybe, maybe not. Worth noting though.