A: 

this looks like the standard "textures are converted to premultiplied alpha" problem.

you can use

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

or you can write custom loading code to avoid the premultiplication.

David Maymudes
I have tried glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) and although it seems to work fine when there is only one particle, as soon as there are lots of overlapping ones, the colour gets quite intense/bright.I'll look into this "premultiplied alpha" thing though.
A: 

Call me naive, but seeing that premultiplying an image requires (a*r, a*g, a*b, a), I figured I'd just divide the rgb values by a.

Of course as soon as the alpha value is larger than the r, g, b components, the particle texture became black. Oh well. Unless I can find a different image loader to the one above, then I'll just make all the rgb components 0xff (white). This is a good temporary solution for me because I either need a white particle or just colourise it in the application. Later on I might just make raw rgba files and read them in, because this is mainly for very small 16x16 and smaller particle textures.

I can't use Premultiplied textures for the particle system because overlapping multiple particle textures saturates the colours way too much.