Have you tried struct-of-array (AAA...BBB...) instead of array-of-struct (ABABAB...) layouts?
Sorting them seems tough as the index of each value must match for each channel, so any sorting would have to occur beforehand. Except that is already sorted by x-y values, and my attempts otherwise have failed to produce results.
I did a quick and dirty experiment:
Seems about 30% smaller than before on http://i.imgur.com/5zwCEF5.png
Mind if I merge that? Or you could submit a pull request. Either would be great!
Also, do you know of any resources for learning about how to optimise for gzip compression? Google is just telling me about compression for websites.
I don't know any resources specifically about gzip compression. Demosceners have very practical and fun compression know how, so maybe look into: http://www.farbrausch.com/~fg/seminars/workcompression.html
You'll likely find a compressor much more suited to your particular data than gzip.