Jake is pretty close in his explanation of bilinear filtering. The one thing is that we're working in two dimensions, so that makes life a little more difficult. We have to pick 4 sample points instead of 2, and perform 3 interpolations.
Basically, say we have:
Where X is the projection of the pixel we want to draw, and A, B, C, and D are the four pixels it falls between. Say it's 1/3 of the way away from the A/C line, and 1/2 of the way away from the A/B line.
Then we would compute the color of the pixel as follows:
X_top = A * (1 - 1/3) + B * (1/3)
X_bot = C * (1 - 1/3) + D * (1/3)
X = X_top * (1 - 1/2) + X_bot * (1/2)
This method only works well when scaling down to a factor of 0.5. Beyond that, you need to consider more then 4 pixels, and we don't handle that. (But that's a factor of .5 in both dimensions, so you really scale down to an area of .25.)
There are some implementation subtleties here, most notably the fact that in practice division is unacceptably slow, so you want to eliminate it when figuring out how far you are away from the various lines.