You can still do it the way you have it:
Method 1: You can code your movement code to look for the color of the ground. Then you apply som simple gravity, and whenever the pixels below the character are a given color that's the groun.
If you have a lot of different color grounds, platforms, the trick is to surround your platform collisions with a border value. Depending on your resolution they can hardly be seen, and actually can help the visuals by making things pop.
If you don't like the above see method2:
Method2: You create a gray scale collision bitmap (boxy like a tile representaton of your world) reperesenting your world, this bitmap is never drawn to the screen, but it is simply used as a collision checking zone. the different shades of gray define the slope and platforms. I usually use black for any hard platforms and ground, white for open space. And differect shades of gray to reflect what the sloaps are for that square.
Method3: You actually do it mathematically, calculating tagent lines in look-ahead ahead code. It's not that hard, but needs some thought.