This doesn't seem offtopic enough, so I guess it's OT for this thread :
I wrote a color-cycle expander. That is, you give it an image and tell it what areas of the palette to cycle, and it works out how many frames that will take and renders them all to a sequence of images, which you can then assemble into an animated gif or spritesheet.
It was prompted by
this post on PJ about rendering colorcycling as an image sequence.
It requires Python 3 and Pillow.
The script is
here(or raw
here)
It's not ready for formal release yet: I want to improve help and error handling first. That's why it's only on bpaste for now.
Example output animation:

created with
ccycle /tmp/anubis4.png /tmp/an.gif 0-23
gifsicle --delay 10 /tmp/an*gif > /tmp/ancycle.gif
Here's another example
demonstrating custom cycling sequences.
This second example simply does several consecutive cyclings forward at different speeds. the ccycle command used is
ccycle /tmp/anubis4.png /tmp/ar.gif 0-23:0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0,2,4,6,8,10,12,14,16,18,20,22,0,4,8,12,16,20,0,8,16
It supports any of the following forms of specifying cycling:
* '0-2' cycles the first three colors in the palette, one step forward per frame.
* '0-2:-1' cycles them backward once per frame
* '0-2:2' cycles them forwards 2 steps per frame
* '0-2:1/3' cycles them forwards 1 step every 3 frames.
* '0-2:-1/3' cycles them backwards 1 step every 3 frames.
* '0-2:0,1,2,1' cycles forward then backward (ping-pong), over 4 frames (explicit offsets given)
and as many cycling regions as needed (automatically synchronized and rendered over an appropriate number of frames to give a correct looping.)
EDIT:
I just made another example, but won't link it here because it's huge (6mb gif, 240 frames)
ccycle /tmp/anubis4.png /tmp/ac.gif 0-7 8-11:1/2 12-16:1/3 17-20:-1/4 21-23:1/5
this one:
* cycles 0-7, 1 step per frame
* cycles 8-11, 1 step every 2nd frame
* cycles 12-16, 1 step every 3rd frame
* cycles 17-20 backwards, 1 step every 4th frame
* cycles 21-23, 1 step every 5th frame.