I applied a technique that I also use for my voxels. Although recently, I noticed this is also the way John Carmack did store the graphics for Doom.
Basically what I do is, throw out all the transparent pixels of the bitmap (and with transparent I mean the color the game doesn’t draw). This (especially for sprites, which always seem to have a lot of transparent pixels) decreases the size a lot.
I just scan the bitmap map, and store only the pixels that aren’t transparent. I do this using ‘slabs’ or lines. When I find a pixel that isn’t transparent I create a new slab or line. The line will grow (in width) until we hit another transparent pixel.
Here's a sprite animation from the pirate theme world -

At the same time I store all non-transparent pixels in a array.
When I want to draw such a picture in the game. I just loop through the lines and draw them. This way I can figure out where all the non-transparent pixels go on the screen. It’s also faster than my normal approach (since I use to scan over every pixel in the 48x48 bitmap, and then decide if it needed to be drawn).
This is kind of cool, because normally compression means you need to decompress. Which makes things slower instead of faster!